From 9b691bcca28926cc8e5da47a77b68dae334cfe52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20B=C3=BCrk?= Date: Sun, 31 May 2015 16:07:23 +0200 Subject: [PATCH 1/3] Introduce a config directive 'binding_mode' in the 'bar' config, pass it through the IPC and parse it in i3bar. --- i3bar/include/xcb.h | 3 +++ i3bar/src/config.c | 6 ++++++ i3bar/src/xcb.c | 15 +++++++++++++++ include/config.h | 4 ++++ parser-specs/config.spec | 2 +- src/config.c | 3 +++ src/config_directives.c | 1 + src/ipc.c | 3 +++ testcases/t/177-bar-config.t | 4 ++++ 9 files changed, 40 insertions(+), 1 deletion(-) 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); From b118b588ee85ac23548281dfc836edb121256156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20B=C3=BCrk?= Date: Sun, 31 May 2015 16:07:40 +0200 Subject: [PATCH 2/3] Added the 'binding_mode' color directive to the documentation. --- docs/ipc | 18 ++++++++++-------- docs/userguide | 6 +++++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/ipc b/docs/ipc index 210ab45d..837b4d98 100644 --- a/docs/ipc +++ b/docs/ipc @@ -520,21 +520,23 @@ statusline:: Text color to be used for the statusline. separator:: Text color to be used for the separator. -focused_workspace_text/focused_workspace_bg:: - Text color/background color for a workspace button when the workspace +focused_workspace_text/focused_workspace_bg/focused_workspace_border:: + Text/background/border color for a workspace button when the workspace has focus. -active_workspace_text/active_workspace_bg:: - Text color/background color for a workspace button when the workspace +active_workspace_text/active_workspace_bg/active_workspace_border:: + Text/background/border color for a workspace button when the workspace is active (visible) on some output, but the focus is on another one. You can only tell this apart from the focused workspace when you are using multiple monitors. -inactive_workspace_text/inactive_workspace_bg:: - Text color/background color for a workspace button when the workspace +inactive_workspace_text/inactive_workspace_bg/inactive_workspace_border:: + Text/background/border color for a workspace button when the workspace does not have focus and is not active (visible) on any output. This will be the case for most workspaces. -urgent_workspace_text/urgent_workspace_bar:: - Text color/background color for workspaces which contain at least one +urgent_workspace_text/urgent_workspace_bg/urgent_workspace_border:: + Text/background/border color for workspaces which contain at least one window with the urgency hint set. +binding_mode_text/binding_mode_bg/binding_mode_border:: + Text/background/border color for the binding mode indicator. *Example of configured bars:* diff --git a/docs/userguide b/docs/userguide index 2ef17f38..2c90c50d 100644 --- a/docs/userguide +++ b/docs/userguide @@ -1457,7 +1457,10 @@ inactive_workspace:: will be the case for most workspaces. urgent_workspace:: Border, background and text color for a workspace button when the workspace - contains a window with the urgency hint set. Also applies to +mode+ indicators. + contains a window with the urgency hint set. +binding_mode:: + Border, background and text color for the binding mode indicator. If not used, + the colors will be taken from +urgent_workspace+. *Syntax*: ---------------------------------------- @@ -1482,6 +1485,7 @@ bar { active_workspace #333333 #5f676a #ffffff inactive_workspace #333333 #222222 #888888 urgent_workspace #2f343a #900000 #ffffff + binding_mode #2f343a #900000 #ffffff } } -------------------------------------- From 0a0f59038ab1e836ee65b5123c23d97563a67bb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20B=C3=BCrk?= Date: Sun, 31 May 2015 16:27:58 +0200 Subject: [PATCH 3/3] Use the introduced binding_mode_* colors to draw the binding mode. fixes #1732 --- i3bar/src/xcb.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 099ea21a..b59288a0 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -1912,11 +1912,11 @@ void draw_bars(bool unhide) { if (binding.name && !config.disable_binding_mode_indicator) { workspace_width += logical_px(ws_spacing_px); - uint32_t fg_color = colors.urgent_ws_fg; - uint32_t bg_color = colors.urgent_ws_bg; + uint32_t fg_color = colors.binding_mode_fg; + uint32_t bg_color = colors.binding_mode_bg; uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND; - uint32_t vals_border[] = {colors.urgent_ws_border, colors.urgent_ws_border}; + uint32_t vals_border[] = {colors.binding_mode_border, colors.binding_mode_border}; xcb_change_gc(xcb_connection, outputs_walk->bargc, mask,