Merge pull request #2136 from lotheac/next

draw client borders in border color, not background
This commit is contained in:
Michael Stapelberg 2016-01-05 22:24:53 +01:00
commit c8d84af415
8 changed files with 65 additions and 51 deletions

View File

@ -836,9 +836,9 @@ workspace "2: vim" output VGA1
You can change all colors which i3 uses to draw the window decorations. You can change all colors which i3 uses to draw the window decorations.
*Syntax*: *Syntax*:
------------------------------------------------------ -------------------------------------------------------------------------
<colorclass> <border> <background> <text> <indicator> <colorclass> <border> <background> <text> <indicator> <decoration_border>
------------------------------------------------------ -------------------------------------------------------------------------
Where colorclass can be one of: Where colorclass can be one of:
@ -864,19 +864,19 @@ Colors are in HTML hex format (#rrggbb), see the following example:
*Examples (default colors)*: *Examples (default colors)*:
--------------------------------------------------------- ---------------------------------------------------------
# class border backgr. text indicator # class border backgr. text indicator decoration_border
client.focused #4c7899 #285577 #ffffff #2e9ef4 client.focused #4c7899 #285577 #ffffff #2e9ef4 #285577
client.focused_inactive #333333 #5f676a #ffffff #484e50 client.focused_inactive #333333 #5f676a #ffffff #484e50 #5f676a
client.unfocused #333333 #222222 #888888 #292d2e client.unfocused #333333 #222222 #888888 #292d2e #222222
client.urgent #2f343a #900000 #ffffff #900000 client.urgent #2f343a #900000 #ffffff #900000 #900000
client.placeholder #000000 #0c0c0c #ffffff #000000 client.placeholder #000000 #0c0c0c #ffffff #000000 #0c0c0c
client.background #ffffff client.background #ffffff
--------------------------------------------------------- ---------------------------------------------------------
Note that for the window decorations, the color around the child window is the Note that for the window decorations, the color around the child window is the
background color, and the border color is only the two thin lines at the top of "decoration_border", and "border" color is only the two thin lines around the
the window. titlebar.
The indicator color is used for indicating where a new window will be opened. The indicator color is used for indicating where a new window will be opened.
For horizontal split containers, the right border will be painted in indicator For horizontal split containers, the right border will be painted in indicator

View File

@ -54,6 +54,7 @@ struct Colortriple {
color_t background; color_t background;
color_t text; color_t text;
color_t indicator; color_t indicator;
color_t decoration_border;
}; };
/** /**

View File

@ -59,7 +59,7 @@ CFGFUN(no_focus);
CFGFUN(ipc_socket, const char *path); CFGFUN(ipc_socket, const char *path);
CFGFUN(restart_state, const char *path); CFGFUN(restart_state, const char *path);
CFGFUN(popup_during_fullscreen, const char *value); CFGFUN(popup_during_fullscreen, const char *value);
CFGFUN(color, const char *colorclass, const char *border, const char *background, const char *text, const char *indicator); CFGFUN(color, const char *colorclass, const char *border, const char *background, const char *text, const char *indicator, const char *decoration_border);
CFGFUN(color_single, const char *colorclass, const char *color); CFGFUN(color_single, const char *colorclass, const char *color);
CFGFUN(floating_modifier, const char *modifiers); CFGFUN(floating_modifier, const char *modifiers);
CFGFUN(new_window, const char *windowtype, const char *border, const long width); CFGFUN(new_window, const char *windowtype, const char *border, const long width);

View File

@ -282,9 +282,15 @@ state COLOR_TEXT:
state COLOR_INDICATOR: state COLOR_INDICATOR:
indicator = word indicator = word
-> call cfg_color($colorclass, $border, $background, $text, $indicator) -> COLOR_DECORATION_BORDER
end end
-> call cfg_color($colorclass, $border, $background, $text, NULL) -> call cfg_color($colorclass, $border, $background, $text, NULL, NULL)
state COLOR_DECORATION_BORDER:
decoration_border = word
-> call cfg_color($colorclass, $border, $background, $text, $indicator, $decoration_border)
end
-> call cfg_color($colorclass, $border, $background, $text, $indicator, NULL)
# <exec|exec_always> [--no-startup-id] command # <exec|exec_always> [--no-startup-id] command
state EXEC: state EXEC:

View File

@ -189,12 +189,13 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath,
memset(&config, 0, sizeof(config)); memset(&config, 0, sizeof(config));
/* Initialize default colors */ /* Initialize default colors */
#define INIT_COLOR(x, cborder, cbackground, ctext, cindicator) \ #define INIT_COLOR(x, cborder, cbackground, ctext, cindicator) \
do { \ do { \
x.border = draw_util_hex_to_color(cborder); \ x.border = draw_util_hex_to_color(cborder); \
x.background = draw_util_hex_to_color(cbackground); \ x.background = draw_util_hex_to_color(cbackground); \
x.text = draw_util_hex_to_color(ctext); \ x.text = draw_util_hex_to_color(ctext); \
x.indicator = draw_util_hex_to_color(cindicator); \ x.indicator = draw_util_hex_to_color(cindicator); \
x.decoration_border = draw_util_hex_to_color(cbackground); \
} while (0) } while (0)
config.client.background = draw_util_hex_to_color("#000000"); config.client.background = draw_util_hex_to_color("#000000");

View File

@ -335,17 +335,20 @@ CFGFUN(color_single, const char *colorclass, const char *color) {
config.client.background = draw_util_hex_to_color(color); config.client.background = draw_util_hex_to_color(color);
} }
CFGFUN(color, const char *colorclass, const char *border, const char *background, const char *text, const char *indicator) { CFGFUN(color, const char *colorclass, const char *border, const char *background, const char *text, const char *indicator, const char *decoration_border) {
#define APPLY_COLORS(classname) \ #define APPLY_COLORS(classname) \
do { \ do { \
if (strcmp(colorclass, "client." #classname) == 0) { \ if (strcmp(colorclass, "client." #classname) == 0) { \
config.client.classname.border = draw_util_hex_to_color(border); \ config.client.classname.border = draw_util_hex_to_color(border); \
config.client.classname.background = draw_util_hex_to_color(background); \ config.client.classname.background = draw_util_hex_to_color(background); \
config.client.classname.text = draw_util_hex_to_color(text); \ config.client.classname.text = draw_util_hex_to_color(text); \
if (indicator != NULL) { \ if (indicator != NULL) { \
config.client.classname.indicator = draw_util_hex_to_color(indicator); \ config.client.classname.indicator = draw_util_hex_to_color(indicator); \
} \ } \
} \ if (decoration_border != NULL) { \
config.client.classname.decoration_border = draw_util_hex_to_color(decoration_border); \
} \
} \
} while (0) } while (0)
APPLY_COLORS(focused_inactive); APPLY_COLORS(focused_inactive);

25
src/x.c
View File

@ -299,7 +299,7 @@ void x_window_kill(xcb_window_t window, kill_window_t kill_window) {
free(event); free(event);
} }
static void x_draw_decoration_border(Con *con, struct deco_render_params *p) { static void x_draw_title_border(Con *con, struct deco_render_params *p) {
assert(con->parent != NULL); assert(con->parent != NULL);
Rect *dr = &(con->deco_rect); Rect *dr = &(con->deco_rect);
@ -344,7 +344,7 @@ static void x_draw_decoration_after_title(Con *con, struct deco_render_params *p
} }
/* Redraw the border. */ /* Redraw the border. */
x_draw_decoration_border(con, p); x_draw_title_border(con, p);
} }
/* /*
@ -464,21 +464,24 @@ void x_draw_decoration(Con *con) {
* rectangle because some childs are not freely resizable and we want * rectangle because some childs are not freely resizable and we want
* their background color to "shine through". */ * their background color to "shine through". */
if (!(borders_to_hide & ADJ_LEFT_SCREEN_EDGE)) { if (!(borders_to_hide & ADJ_LEFT_SCREEN_EDGE)) {
draw_util_rectangle(conn, &(con->frame_buffer), p->color->background, draw_util_rectangle(conn, &(con->frame_buffer), p->color->decoration_border, 0, 0, br.x, r->height);
0, 0, br.x, r->height);
} }
if (!(borders_to_hide & ADJ_RIGHT_SCREEN_EDGE)) { if (!(borders_to_hide & ADJ_RIGHT_SCREEN_EDGE)) {
draw_util_rectangle(conn, &(con->frame_buffer), p->color->background, draw_util_rectangle(conn, &(con->frame_buffer),
r->width + (br.width + br.x), 0, -(br.width + br.x), r->height); p->color->decoration_border, r->width + (br.width + br.x), 0,
-(br.width + br.x), r->height);
} }
if (!(borders_to_hide & ADJ_LOWER_SCREEN_EDGE)) { if (!(borders_to_hide & ADJ_LOWER_SCREEN_EDGE)) {
draw_util_rectangle(conn, &(con->frame_buffer), p->color->background, draw_util_rectangle(conn, &(con->frame_buffer),
br.x, r->height + (br.height + br.y), r->width + br.width, -(br.height + br.y)); p->color->decoration_border, br.x, r->height + (br.height +
br.y),
r->width + br.width, -(br.height + br.y));
} }
/* pixel border needs an additional line at the top */ /* pixel border needs an additional line at the top */
if (p->border_style == BS_PIXEL && !(borders_to_hide & ADJ_UPPER_SCREEN_EDGE)) { if (p->border_style == BS_PIXEL && !(borders_to_hide & ADJ_UPPER_SCREEN_EDGE)) {
draw_util_rectangle(conn, &(con->frame_buffer), p->color->background, draw_util_rectangle(conn, &(con->frame_buffer),
br.x, 0, r->width + br.width, br.y); p->color->decoration_border, br.x, 0, r->width + br.width,
br.y);
} }
/* Highlight the side of the border at which the next window will be /* Highlight the side of the border at which the next window will be
@ -521,7 +524,7 @@ void x_draw_decoration(Con *con) {
con->deco_rect.x, con->deco_rect.y, con->deco_rect.width, con->deco_rect.height); con->deco_rect.x, con->deco_rect.y, con->deco_rect.width, con->deco_rect.height);
/* 5: draw two unconnected horizontal lines in border color */ /* 5: draw two unconnected horizontal lines in border color */
x_draw_decoration_border(con, p); x_draw_title_border(con, p);
/* 6: draw the title */ /* 6: draw the title */
int text_offset_y = (con->deco_rect.height - config.font.height) / 2; int text_offset_y = (con->deco_rect.height - config.font.height) / 2;

View File

@ -412,19 +412,19 @@ is(parser_calls($config),
################################################################################ ################################################################################
$config = <<'EOT'; $config = <<'EOT';
client.focused #4c7899 #285577 #ffffff #2e9ef4 client.focused #4c7899 #285577 #ffffff #2e9ef4 #b34d4c
client.focused_inactive #333333 #5f676a #ffffff #484e50 client.focused_inactive #333333 #5f676a #ffffff #484e50
client.unfocused #333333 #222222 #888888 #292d2e client.unfocused #333333 #222222 #888888 #292d2e
client.urgent #2f343a #900000 #ffffff #900000 client.urgent #2f343a #900000 #ffffff #900000 #c00000
client.placeholder #000000 #0c0c0c #ffffff #000000 client.placeholder #000000 #0c0c0c #ffffff #000000
EOT EOT
$expected = <<'EOT'; $expected = <<'EOT';
cfg_color(client.focused, #4c7899, #285577, #ffffff, #2e9ef4) cfg_color(client.focused, #4c7899, #285577, #ffffff, #2e9ef4, #b34d4c)
cfg_color(client.focused_inactive, #333333, #5f676a, #ffffff, #484e50) cfg_color(client.focused_inactive, #333333, #5f676a, #ffffff, #484e50, NULL)
cfg_color(client.unfocused, #333333, #222222, #888888, #292d2e) cfg_color(client.unfocused, #333333, #222222, #888888, #292d2e, NULL)
cfg_color(client.urgent, #2f343a, #900000, #ffffff, #900000) cfg_color(client.urgent, #2f343a, #900000, #ffffff, #900000, #c00000)
cfg_color(client.placeholder, #000000, #0c0c0c, #ffffff, #000000) cfg_color(client.placeholder, #000000, #0c0c0c, #ffffff, #000000, NULL)
EOT EOT
is(parser_calls($config), is(parser_calls($config),
@ -449,7 +449,7 @@ ERROR: CONFIG: (in file <stdin>)
ERROR: CONFIG: Line 1: hide_edge_border both ERROR: CONFIG: Line 1: hide_edge_border both
ERROR: CONFIG: ^^^^^^^^^^^^^^^^^^^^^ ERROR: CONFIG: ^^^^^^^^^^^^^^^^^^^^^
ERROR: CONFIG: Line 2: client.focused #4c7899 #285577 #ffffff #2e9ef4 ERROR: CONFIG: Line 2: client.focused #4c7899 #285577 #ffffff #2e9ef4
cfg_color(client.focused, #4c7899, #285577, #ffffff, #2e9ef4) cfg_color(client.focused, #4c7899, #285577, #ffffff, #2e9ef4, NULL)
EOT EOT
$expected = $expected_all_tokens . $expected_end; $expected = $expected_all_tokens . $expected_end;
@ -469,7 +469,7 @@ ERROR: CONFIG: (in file <stdin>)
ERROR: CONFIG: Line 1: hide_edge_borders FOOBAR ERROR: CONFIG: Line 1: hide_edge_borders FOOBAR
ERROR: CONFIG: ^^^^^^ ERROR: CONFIG: ^^^^^^
ERROR: CONFIG: Line 2: client.focused #4c7899 #285577 #ffffff #2e9ef4 ERROR: CONFIG: Line 2: client.focused #4c7899 #285577 #ffffff #2e9ef4
cfg_color(client.focused, #4c7899, #285577, #ffffff, #2e9ef4) cfg_color(client.focused, #4c7899, #285577, #ffffff, #2e9ef4, NULL)
EOT EOT
is(parser_calls($config), is(parser_calls($config),