Colors are either [X color names](http://en.wikipedia.org/wiki/X11_color_names) or *#RRGGBB*, booleans are *true* or *false*.
-- `focused_border_color` — Color of the main border of a focused window of a focused monitor.
+- `focused_border_color` — Color of the border of a focused window of a focused monitor.
-- `active_border_color` — Color of the main border of a focused window of an unfocused monitor.
+- `active_border_color` — Color of the border of a focused window of an unfocused monitor.
-- `normal_border_color` — Color of the main border of an unfocused window.
-
-- `inner_border_color` — Color of the inner border of a window.
-
-- `outer_border_color` — Color of the outer border of a window.
+- `normal_border_color` — Color of the border of an unfocused window.
- `presel_border_color` — Color of the `presel` message feedback.
-- `focused_locked_border_color` — Color of the main border of a focused locked window of a focused monitor.
+- `focused_locked_border_color` — Color of the border of a focused locked window of a focused monitor.
-- `active_locked_border_color` — Color of the main border of a focused locked window of an unfocused monitor.
+- `active_locked_border_color` — Color of the border of a focused locked window of an unfocused monitor.
-- `normal_locked_border_color` — Color of the main border of an unfocused locked window.
+- `normal_locked_border_color` — Color of the border of an unfocused locked window.
- `urgent_border_color` — Color of the border of an urgent window.
-- `{inner,main,outer}_border_width` — Width of the inner, main and outer borders.
+- `border_width` — Window border width.
- `window_gap` — Value of the gap that separates windows.
- Multiple monitors support (via *Xinerama*)
- EWMH support (`tint2` works)
- Automatic and manual modes
-- Triple window borders
## Panel
- Rewrite `focus_follows_pointer` by using a root sized input only window mapped and unmapped via enter notify events.
-- Optimize border drawing by considering the `{outer,inner}_border_width == 0` case.
- New setting: `windows_per_desktop` that would automatically send the oldest window of the current desktop to the first found desktop having a number of windows inferior to the limit and create a new desktop if there is none when the number of windows in the current desktop reaches the limit.
- Grow/shrink through swap.
- Command line completion for *bspc*.
.IR "true " "or " false .
.TP
.I focused_border_color
-Color of the main border of a focused window of a focused monitor.
+Color of the border of a focused window of a focused monitor.
.TP
.I active_border_color
-Color of the main border of a focused window of an unfocused monitor.
+Color of the border of a focused window of an unfocused monitor.
.TP
.I normal_border_color
-Color of the main border of an unfocused window.
-.TP
-.I inner_border_color
-Color of the inner border of a window.
-.TP
-.I outer_border_color
-Color of the outer border of a window.
+Color of the border of an unfocused window.
.TP
.I presel_border_color
Color of the
message feedback.
.TP
.I focused_locked_border_color
-Color of the main border of a focused locked window of a focused monitor.
+Color of the border of a focused locked window of a focused monitor.
.TP
.I active_locked_border_color
-Color of the main border of a focused locked window of an unfocused monitor.
+Color of the border of a focused locked window of an unfocused monitor.
.TP
.I normal_locked_border_color
-Color of the main border of an unfocused locked window.
+Color of the border of an unfocused locked window.
.TP
.I urgent_border_color
Color of the border of an urgent window.
.TP
-.I inner_border_width
-.TQ
-.I main_border_width
-.TQ
-.I outer_border_width
-Width of the inner, main and outer borders.
+.I border_width
+Window border width.
.TP
.I window_gap
Value of the gap that separates windows.
if (name == NULL || value == NULL)
return;
- if (strcmp(name, "inner_border_width") == 0) {
- sscanf(value, "%u", &inner_border_width);
- border_width = inner_border_width + main_border_width + outer_border_width;
- } else if (strcmp(name, "main_border_width") == 0) {
- sscanf(value, "%u", &main_border_width);
- border_width = inner_border_width + main_border_width + outer_border_width;
- } else if (strcmp(name, "outer_border_width") == 0) {
- sscanf(value, "%u", &outer_border_width);
- border_width = inner_border_width + main_border_width + outer_border_width;
+ if (strcmp(name, "border_width") == 0) {
+ sscanf(value, "%u", &border_width);
} else if (strcmp(name, "fence_grip") == 0) {
sscanf(value, "%u", &fence_grip);
} else if (strcmp(name, "window_gap") == 0) {
} else if (strcmp(name, "normal_border_color") == 0) {
strncpy(normal_border_color, value, sizeof(normal_border_color));
normal_border_color_pxl = get_color(normal_border_color);
- } else if (strcmp(name, "inner_border_color") == 0) {
- strncpy(inner_border_color, value, sizeof(inner_border_color));
- inner_border_color_pxl = get_color(inner_border_color);
- } else if (strcmp(name, "outer_border_color") == 0) {
- strncpy(outer_border_color, value, sizeof(outer_border_color));
- outer_border_color_pxl = get_color(outer_border_color);
} else if (strcmp(name, "presel_border_color") == 0) {
strncpy(presel_border_color, value, sizeof(presel_border_color));
presel_border_color_pxl = get_color(presel_border_color);
if (name == NULL)
return;
- if (strcmp(name, "inner_border_width") == 0)
- snprintf(rsp, BUFSIZ, "%u", inner_border_width);
- else if (strcmp(name, "main_border_width") == 0)
- snprintf(rsp, BUFSIZ, "%u", main_border_width);
- else if (strcmp(name, "outer_border_width") == 0)
- snprintf(rsp, BUFSIZ, "%u", outer_border_width);
- else if (strcmp(name, "border_width") == 0)
+ if (strcmp(name, "border_width") == 0)
snprintf(rsp, BUFSIZ, "%u", border_width);
else if (strcmp(name, "fence_grip") == 0)
snprintf(rsp, BUFSIZ, "%u", fence_grip);
snprintf(rsp, BUFSIZ, "%s (%06X)", active_border_color, active_border_color_pxl);
else if (strcmp(name, "normal_border_color") == 0)
snprintf(rsp, BUFSIZ, "%s (%06X)", normal_border_color, normal_border_color_pxl);
- else if (strcmp(name, "inner_border_color") == 0)
- snprintf(rsp, BUFSIZ, "%s (%06X)", inner_border_color, inner_border_color_pxl);
- else if (strcmp(name, "outer_border_color") == 0)
- snprintf(rsp, BUFSIZ, "%s (%06X)", outer_border_color, outer_border_color_pxl);
else if (strcmp(name, "presel_border_color") == 0)
snprintf(rsp, BUFSIZ, "%s (%06X)", presel_border_color, presel_border_color_pxl);
else if (strcmp(name, "focused_locked_border_color") == 0)
strncpy(normal_border_color, NORMAL_BORDER_COLOR, sizeof(normal_border_color));
strncpy(focused_border_color, FOCUSED_BORDER_COLOR, sizeof(focused_border_color));
strncpy(active_border_color, ACTIVE_BORDER_COLOR, sizeof(active_border_color));
- strncpy(inner_border_color, INNER_BORDER_COLOR, sizeof(inner_border_color));
- strncpy(outer_border_color, OUTER_BORDER_COLOR, sizeof(outer_border_color));
strncpy(presel_border_color, PRESEL_BORDER_COLOR, sizeof(presel_border_color));
strncpy(focused_locked_border_color, FOCUSED_LOCKED_BORDER_COLOR, sizeof(focused_locked_border_color));
strncpy(active_locked_border_color, ACTIVE_LOCKED_BORDER_COLOR, sizeof(active_locked_border_color));
normal_border_color_pxl = get_color(normal_border_color);
focused_border_color_pxl = get_color(active_border_color);
active_border_color_pxl = get_color(active_border_color);
- inner_border_color_pxl = get_color(inner_border_color);
- outer_border_color_pxl = get_color(outer_border_color);
presel_border_color_pxl = get_color(presel_border_color);
focused_locked_border_color_pxl = get_color(active_locked_border_color);
active_locked_border_color_pxl = get_color(active_locked_border_color);
strncpy(wm_name, WM_NAME, sizeof(wm_name));
- inner_border_width = INNER_BORDER_WIDTH;
- main_border_width = MAIN_BORDER_WIDTH;
- outer_border_width = OUTER_BORDER_WIDTH;
-
- border_width = inner_border_width + main_border_width + outer_border_width;
+ border_width = BORDER_WIDTH;
window_gap = WINDOW_GAP;
fence_grip = FENCE_GRIP;
#define FOCUSED_BORDER_COLOR "#7D7F8A"
#define ACTIVE_BORDER_COLOR "#7D7F8A"
#define NORMAL_BORDER_COLOR "#3F3E3B"
-#define INNER_BORDER_COLOR "#32312E"
-#define OUTER_BORDER_COLOR "#32312E"
#define PRESEL_BORDER_COLOR "#97AE71"
#define FOCUSED_LOCKED_BORDER_COLOR "#B6A56A"
#define ACTIVE_LOCKED_BORDER_COLOR "#B6A56A"
#define NORMAL_LOCKED_BORDER_COLOR "#8D7E45"
#define URGENT_BORDER_COLOR "#DE928B"
-#define INNER_BORDER_WIDTH 3
-#define MAIN_BORDER_WIDTH 1
-#define OUTER_BORDER_WIDTH 3
-
-#define WINDOW_GAP 6
-#define SPLIT_RATIO 0.5
-#define FENCE_GRIP 20
+#define BORDER_WIDTH 1
+#define WINDOW_GAP 6
+#define SPLIT_RATIO 0.5
+#define FENCE_GRIP 20
#define BORDERLESS_MONOCLE false
#define GAPLESS_MONOCLE false
char focused_border_color[MAXLEN];
char active_border_color[MAXLEN];
char normal_border_color[MAXLEN];
-char inner_border_color[MAXLEN];
-char outer_border_color[MAXLEN];
char presel_border_color[MAXLEN];
char focused_locked_border_color[MAXLEN];
char active_locked_border_color[MAXLEN];
uint32_t focused_border_color_pxl;
uint32_t active_border_color_pxl;
uint32_t normal_border_color_pxl;
-uint32_t inner_border_color_pxl;
-uint32_t outer_border_color_pxl;
uint32_t presel_border_color_pxl;
uint32_t focused_locked_border_color_pxl;
uint32_t active_locked_border_color_pxl;
uint32_t normal_locked_border_color_pxl;
uint32_t urgent_border_color_pxl;
-unsigned int inner_border_width;
-unsigned int main_border_width;
-unsigned int outer_border_width;
unsigned int border_width;
-
int window_gap;
unsigned int fence_grip;
void window_draw_border(node_t *n, bool focused_window, bool focused_monitor)
{
- if (n == NULL)
- return;
-
- if (border_width < 1 || n->client->border_width < 1)
+ if (n == NULL || border_width < 1 || n->client->border_width < 1)
return;
xcb_window_t win = n->client->window;
+ uint32_t border_color_pxl = get_border_color(n->client, focused_window, focused_monitor);
- xcb_rectangle_t actual_rectangle = (is_tiled(n->client) ? n->client->tiled_rectangle : n->client->floating_rectangle);
-
- uint16_t width = actual_rectangle.width;
- uint16_t height = actual_rectangle.height;
-
- uint16_t full_width = width + 2 * border_width;
- uint16_t full_height = height + 2 * border_width;
-
- xcb_rectangle_t inner_rectangles[] =
- {
- { width, 0, 2 * border_width, height + 2 * border_width },
- { 0, height, width + 2 * border_width, 2 * border_width }
- };
-
- xcb_rectangle_t main_rectangles[] =
- {
- { width + inner_border_width, 0, 2 * (main_border_width + outer_border_width), height + 2 * border_width },
- { 0, height + inner_border_width, width + 2 * border_width, 2 * (main_border_width + outer_border_width) }
- };
-
- xcb_rectangle_t outer_rectangles[] =
- {
- { width + inner_border_width + main_border_width, 0, 2 * outer_border_width, height + 2 * border_width },
- { 0, height + inner_border_width + main_border_width, width + 2 * border_width, 2 * outer_border_width }
- };
+ if (split_mode == MODE_AUTOMATIC || !focused_monitor || !focused_window) {
+ xcb_change_window_attributes(dpy, win, XCB_CW_BORDER_PIXEL, &border_color_pxl);
+ } else {
+ xcb_rectangle_t actual_rectangle = (is_tiled(n->client) ? n->client->tiled_rectangle : n->client->floating_rectangle);
- xcb_rectangle_t *presel_rectangles;
+ uint16_t width = actual_rectangle.width;
+ uint16_t height = actual_rectangle.height;
- xcb_pixmap_t pix = xcb_generate_id(dpy);
- xcb_create_pixmap(dpy, root_depth, pix, win, full_width, full_height);
+ uint16_t full_width = width + 2 * border_width;
+ uint16_t full_height = height + 2 * border_width;
- xcb_gcontext_t gc = xcb_generate_id(dpy);
- xcb_create_gc(dpy, gc, pix, 0, NULL);
+ xcb_rectangle_t border_rectangles[] =
+ {
+ { width, 0, 2 * border_width, height + 2 * border_width },
+ { 0, height, width + 2 * border_width, 2 * border_width }
+ };
- uint32_t main_border_color_pxl = get_main_border_color(n->client, focused_window, focused_monitor);
+ xcb_rectangle_t *presel_rectangles;
- /* inner border */
- if (inner_border_width > 0) {
- xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &inner_border_color_pxl);
- xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(inner_rectangles), inner_rectangles);
- }
+ xcb_pixmap_t pix = xcb_generate_id(dpy);
+ xcb_create_pixmap(dpy, root_depth, pix, win, full_width, full_height);
- /* main border */
- if (main_border_width > 0) {
- xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &main_border_color_pxl);
- xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(main_rectangles), main_rectangles);
- }
+ xcb_gcontext_t gc = xcb_generate_id(dpy);
+ xcb_create_gc(dpy, gc, pix, 0, NULL);
- /* outer border */
- if (outer_border_width > 0) {
- xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &outer_border_color_pxl);
- xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(outer_rectangles), outer_rectangles);
- }
+ xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &border_color_pxl);
+ xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(border_rectangles), border_rectangles);
- if (split_mode == MODE_MANUAL && focused_monitor && focused_window) {
uint16_t fence = (int16_t) (n->split_ratio * ((split_dir == DIR_UP || split_dir == DIR_DOWN) ? height : width));
presel_rectangles = malloc(2 * sizeof(xcb_rectangle_t));
switch (split_dir) {
presel_rectangles[1] = (xcb_rectangle_t) {width, 0, border_width, full_height};
break;
}
+
xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &presel_border_color_pxl);
xcb_poly_fill_rectangle(dpy, pix, gc, 2, presel_rectangles);
+ xcb_change_window_attributes(dpy, win, XCB_CW_BORDER_PIXMAP, &pix);
free(presel_rectangles);
+ xcb_free_gc(dpy, gc);
+ xcb_free_pixmap(dpy, pix);
}
-
- /* apply border pixmap */
- xcb_change_window_attributes(dpy, win, XCB_CW_BORDER_PIXMAP, &pix);
-
- xcb_free_gc(dpy, gc);
- xcb_free_pixmap(dpy, pix);
}
void window_close(node_t *n)
}
}
-uint32_t get_main_border_color(client_t *c, bool focused_window, bool focused_monitor)
+uint32_t get_border_color(client_t *c, bool focused_window, bool focused_monitor)
{
if (c == NULL)
return 0;
void window_hide(xcb_window_t);
void window_show(xcb_window_t);
void toggle_visibility(void);
-uint32_t get_main_border_color(client_t *, bool, bool);
+uint32_t get_border_color(client_t *, bool, bool);
void update_floating_rectangle(client_t *);
void save_pointer_position(xcb_point_t *);
void list_windows(char *);