Merge pull request #2136 from lotheac/next
draw client borders in border color, not background
This commit is contained in:
commit
c8d84af415
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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:
|
||||||
|
|
13
src/config.c
13
src/config.c
|
@ -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");
|
||||||
|
|
|
@ -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
25
src/x.c
|
@ -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;
|
||||||
|
|
|
@ -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),
|
||||||
|
|
Loading…
Reference in New Issue