diff --git a/i3bar/include/xcb.h b/i3bar/include/xcb.h index 2e34c776..835105e7 100644 --- a/i3bar/include/xcb.h +++ b/i3bar/include/xcb.h @@ -40,6 +40,9 @@ struct xcb_color_strings_t { char *urgent_ws_bg; char *urgent_ws_fg; char *urgent_ws_border; + char *binding_mode_bg; + char *binding_mode_fg; + char *binding_mode_border; }; typedef struct xcb_colors_t xcb_colors_t; diff --git a/i3bar/src/config.c b/i3bar/src/config.c index 86f66cbb..b708895a 100644 --- a/i3bar/src/config.c +++ b/i3bar/src/config.c @@ -191,6 +191,9 @@ static int config_string_cb(void *params_, const unsigned char *val, size_t _len COLOR(urgent_workspace_border, urgent_ws_border); COLOR(urgent_workspace_bg, urgent_ws_bg); COLOR(urgent_workspace_text, urgent_ws_fg); + COLOR(binding_mode_border, binding_mode_border); + COLOR(binding_mode_bg, binding_mode_bg); + COLOR(binding_mode_text, binding_mode_fg); printf("got unexpected string %.*s for cur_key = %s\n", len, val, cur_key); @@ -286,5 +289,8 @@ void free_colors(struct xcb_color_strings_t *colors) { FREE_COLOR(focus_ws_fg); FREE_COLOR(focus_ws_bg); FREE_COLOR(focus_ws_border); + FREE_COLOR(binding_mode_fg); + FREE_COLOR(binding_mode_bg); + FREE_COLOR(binding_mode_border); #undef FREE_COLOR } diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index b9e5659f..099ea21a 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -106,6 +106,9 @@ struct xcb_colors_t { uint32_t focus_ws_bg; uint32_t focus_ws_fg; uint32_t focus_ws_border; + uint32_t binding_mode_bg; + uint32_t binding_mode_fg; + uint32_t binding_mode_border; }; struct xcb_colors_t colors; @@ -374,6 +377,18 @@ void init_colors(const struct xcb_color_strings_t *new_colors) { PARSE_COLOR(focus_ws_border, "#4c7899"); #undef PARSE_COLOR +#define PARSE_COLOR_FALLBACK(name, fallback) \ + do { \ + colors.name = new_colors->name ? get_colorpixel(new_colors->name) : colors.fallback; \ + } while (0) + + /* For the binding mode indicator colors, we don't hardcode a default. + * Instead, we fall back to urgent_ws_* colors. */ + PARSE_COLOR_FALLBACK(binding_mode_fg, urgent_ws_fg); + PARSE_COLOR_FALLBACK(binding_mode_bg, urgent_ws_bg); + PARSE_COLOR_FALLBACK(binding_mode_border, urgent_ws_border); +#undef PARSE_COLOR_FALLBACK + init_tray_colors(); xcb_flush(xcb_connection); } diff --git a/include/config.h b/include/config.h index 75e0b127..33cbaba0 100644 --- a/include/config.h +++ b/include/config.h @@ -344,6 +344,10 @@ struct Barconfig { char *urgent_workspace_border; char *urgent_workspace_bg; char *urgent_workspace_text; + + char *binding_mode_border; + char *binding_mode_bg; + char *binding_mode_text; } colors; TAILQ_ENTRY(Barconfig) configs; diff --git a/parser-specs/config.spec b/parser-specs/config.spec index a0218ba6..b52fafc2 100644 --- a/parser-specs/config.spec +++ b/parser-specs/config.spec @@ -511,7 +511,7 @@ state BAR_COLORS: 'set' -> BAR_COLORS_IGNORE_LINE colorclass = 'background', 'statusline', 'separator' -> BAR_COLORS_SINGLE - colorclass = 'focused_workspace', 'active_workspace', 'inactive_workspace', 'urgent_workspace' + colorclass = 'focused_workspace', 'active_workspace', 'inactive_workspace', 'urgent_workspace', 'binding_mode' -> BAR_COLORS_BORDER '}' -> BAR diff --git a/src/config.c b/src/config.c index bac9d7f3..a931ba1f 100644 --- a/src/config.c +++ b/src/config.c @@ -130,6 +130,9 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath, FREE(barconfig->colors.urgent_workspace_border); FREE(barconfig->colors.urgent_workspace_bg); FREE(barconfig->colors.urgent_workspace_text); + FREE(barconfig->colors.binding_mode_border); + FREE(barconfig->colors.binding_mode_bg); + FREE(barconfig->colors.binding_mode_text); TAILQ_REMOVE(&barconfigs, barconfig, configs); FREE(barconfig); } diff --git a/src/config_directives.c b/src/config_directives.c index ae78e0c0..37bd0121 100644 --- a/src/config_directives.c +++ b/src/config_directives.c @@ -570,6 +570,7 @@ CFGFUN(bar_color, const char *colorclass, const char *border, const char *backgr APPLY_COLORS(active_workspace); APPLY_COLORS(inactive_workspace); APPLY_COLORS(urgent_workspace); + APPLY_COLORS(binding_mode); #undef APPLY_COLORS } diff --git a/src/ipc.c b/src/ipc.c index a60b1900..ae213b3a 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -611,6 +611,9 @@ static void dump_bar_config(yajl_gen gen, Barconfig *config) { YSTR_IF_SET(urgent_workspace_border); YSTR_IF_SET(urgent_workspace_bg); YSTR_IF_SET(urgent_workspace_text); + YSTR_IF_SET(binding_mode_border); + YSTR_IF_SET(binding_mode_bg); + YSTR_IF_SET(binding_mode_text); y(map_close); y(map_close); diff --git a/testcases/t/177-bar-config.t b/testcases/t/177-bar-config.t index 8675dd71..4e7d988b 100644 --- a/testcases/t/177-bar-config.t +++ b/testcases/t/177-bar-config.t @@ -112,6 +112,7 @@ bar { active_workspace #333333 #222222 #888888 inactive_workspace #333333 #222222 #888888 urgent_workspace #2f343a #900000 #ffffff + binding_mode #abc123 #123abc #ababab } } EOT @@ -151,6 +152,9 @@ is_deeply($bar_config->{colors}, urgent_workspace_border => '#2f343a', urgent_workspace_text => '#ffffff', urgent_workspace_bg => '#900000', + binding_mode_border => '#abc123', + binding_mode_text => '#ababab', + binding_mode_bg => '#123abc', }, 'colors ok'); exit_gracefully($pid);