]> git.sur5r.net Git - i3/i3/commitdiff
Re-implement bar borders (by Angelo Haller)
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 20 Jan 2012 21:36:50 +0000 (21:36 +0000)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 20 Jan 2012 21:36:50 +0000 (21:36 +0000)
This re-introduces borders around the workspace buttons in i3bar.
No additional pixels will be consumed (you will not lose any space for your
windows).

docs/userguide
i3bar/include/xcb.h
i3bar/src/config.c
i3bar/src/xcb.c
include/config.h
src/cfgparse.l
src/cfgparse.y
src/config.c
src/ipc.c
testcases/t/177-bar-config.t

index 0ba705a626e1fa8d139d45a0b1f805d9190a2093..270627ab15f9c90c40846264d79eddcae99dcc29 100644 (file)
@@ -998,19 +998,19 @@ background::
 statusline::
        Text color to be used for the statusline.
 focused_workspace::
-       Text color/background color for a workspace button when the workspace
+       Border, background and text color for a workspace button when the workspace
        has focus.
 active_workspace::
-       Text color/background color for a workspace button when the workspace
+       Border, background and text 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 color/background color for a workspace button when the workspace
+       Border, background and text 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 color/background color for workspaces which contain at least one
+       Border, background and text color for a workspace button when the workspace
        window with the urgency hint set.
 
 *Syntax*:
@@ -1019,21 +1019,21 @@ colors {
     background <color>
     statusline <color>
 
-    colorclass <foreground> <background>
+    colorclass <border> <background> <text>
 }
 ----------------------------------------
 
-*Example*:
+*Example (default colors)*:
 --------------------------------------
 bar {
     colors {
         background #000000
         statusline #ffffff
 
-        focused_workspace  #ffffff #285577
-        active_workspace   #ffffff #333333
-        inactive_workspace #888888 #222222
-        urgent_workspace   #ffffff #900000
+        focused_workspace  #4c7899 #285577 #ffffff
+        active_workspace   #333333 #5f676a #ffffff
+        inactive_workspace #333333 #222222 #888888
+        urgent_workspace   #2f343a #900000 #ffffff
     }
 }
 --------------------------------------
index f82c71159d7a10abb6023e54374ebe1cdddffe4c..c5a507877c9444c744dd3faaf163633bd4b0ab30 100644 (file)
@@ -30,12 +30,16 @@ struct xcb_color_strings_t {
     char *bar_bg;
     char *active_ws_fg;
     char *active_ws_bg;
+    char *active_ws_border;
     char *inactive_ws_fg;
     char *inactive_ws_bg;
+    char *inactive_ws_border;
     char *focus_ws_bg;
     char *focus_ws_fg;
+    char *focus_ws_border;
     char *urgent_ws_bg;
     char *urgent_ws_fg;
+    char *urgent_ws_border;
 };
 
 typedef struct xcb_colors_t xcb_colors_t;
index 397162b6b387f7a7d5d6c7037f494e2efdd820f7..567d0002e3768299c65df4927ae516f921c0442f 100644 (file)
@@ -161,14 +161,18 @@ static int config_string_cb(void *params_, const unsigned char *val, unsigned in
 
     COLOR(statusline, bar_fg);
     COLOR(background, bar_bg);
+    COLOR(focused_workspace_border, focus_ws_border);
+    COLOR(focused_workspace_background, focus_ws_bg);
     COLOR(focused_workspace_text, focus_ws_fg);
-    COLOR(focused_workspace_bg, focus_ws_bg);
+    COLOR(active_workspace_border, active_ws_border);
+    COLOR(active_workspace_background, active_ws_bg);
     COLOR(active_workspace_text, active_ws_fg);
-    COLOR(active_workspace_bg, active_ws_bg);
+    COLOR(inactive_workspace_border, inactive_ws_border);
+    COLOR(inactive_workspace_background, inactive_ws_bg);
     COLOR(inactive_workspace_text, inactive_ws_fg);
-    COLOR(inactive_workspace_bg, inactive_ws_bg);
+    COLOR(urgent_workspace_border, urgent_ws_border);
+    COLOR(urgent_workspace_background, urgent_ws_bg);
     COLOR(urgent_workspace_text, urgent_ws_fg);
-    COLOR(urgent_workspace_bg, urgent_ws_bg);
 
     printf("got unexpected string %.*s for cur_key = %s\n", len, val, cur_key);
 
@@ -258,12 +262,16 @@ void free_colors(struct xcb_color_strings_t *colors) {
     FREE_COLOR(bar_bg);
     FREE_COLOR(active_ws_fg);
     FREE_COLOR(active_ws_bg);
+    FREE_COLOR(active_ws_border);
     FREE_COLOR(inactive_ws_fg);
     FREE_COLOR(inactive_ws_bg);
+    FREE_COLOR(inactive_ws_border);
     FREE_COLOR(urgent_ws_fg);
     FREE_COLOR(urgent_ws_bg);
+    FREE_COLOR(urgent_ws_border);
     FREE_COLOR(focus_ws_fg);
     FREE_COLOR(focus_ws_bg);
+    FREE_COLOR(focus_ws_border);
 #undef FREE_COLOR
 }
 
index 1317b4755aaa753bd8bba4045324c5e491210ba7..adb4c76dfcb835fe21c2deb0126760a92db4fd35 100644 (file)
@@ -79,12 +79,16 @@ struct xcb_colors_t {
     uint32_t bar_bg;
     uint32_t active_ws_fg;
     uint32_t active_ws_bg;
+    uint32_t active_ws_border;
     uint32_t inactive_ws_fg;
     uint32_t inactive_ws_bg;
+    uint32_t inactive_ws_border;
     uint32_t urgent_ws_bg;
     uint32_t urgent_ws_fg;
+    uint32_t urgent_ws_border;
     uint32_t focus_ws_bg;
     uint32_t focus_ws_fg;
+    uint32_t focus_ws_border;
 };
 struct xcb_colors_t colors;
 
@@ -205,12 +209,16 @@ void init_colors(const struct xcb_color_strings_t *new_colors) {
     PARSE_COLOR(bar_bg, "#000000");
     PARSE_COLOR(active_ws_fg, "#FFFFFF");
     PARSE_COLOR(active_ws_bg, "#333333");
+    PARSE_COLOR(active_ws_border, "#333333");
     PARSE_COLOR(inactive_ws_fg, "#888888");
     PARSE_COLOR(inactive_ws_bg, "#222222");
+    PARSE_COLOR(inactive_ws_border, "#333333");
     PARSE_COLOR(urgent_ws_fg, "#FFFFFF");
     PARSE_COLOR(urgent_ws_bg, "#900000");
+    PARSE_COLOR(urgent_ws_border, "#2f343a");
     PARSE_COLOR(focus_ws_fg, "#FFFFFF");
     PARSE_COLOR(focus_ws_bg, "#285577");
+    PARSE_COLOR(focus_ws_border, "#4c7899");
 #undef PARSE_COLOR
 }
 
@@ -1367,29 +1375,44 @@ void draw_bars() {
             DLOG("Drawing Button for WS %s at x = %d\n", ws_walk->name, i);
             uint32_t fg_color = colors.inactive_ws_fg;
             uint32_t bg_color = colors.inactive_ws_bg;
+            uint32_t border_color = colors.inactive_ws_border;
             if (ws_walk->visible) {
                 if (!ws_walk->focused) {
                     fg_color = colors.active_ws_fg;
                     bg_color = colors.active_ws_bg;
+                    border_color = colors.active_ws_border;
                 } else {
                     fg_color = colors.focus_ws_fg;
                     bg_color = colors.focus_ws_bg;
+                    border_color = colors.focus_ws_border;
                 }
             }
             if (ws_walk->urgent) {
                 DLOG("WS %s is urgent!\n", ws_walk->name);
                 fg_color = colors.urgent_ws_fg;
                 bg_color = colors.urgent_ws_bg;
+                border_color = colors.urgent_ws_border;
                 /* The urgent-hint should get noticed, so we unhide the bars shortly */
                 unhide_bars();
             }
             uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND;
+            uint32_t vals_border[] = { border_color, border_color };
+            xcb_change_gc(xcb_connection,
+                          outputs_walk->bargc,
+                          mask,
+                          vals_border);
+            xcb_rectangle_t rect_border = { i + 1, 0, ws_walk->name_width + 10, font.height + 4 };
+            xcb_poly_fill_rectangle(xcb_connection,
+                                    outputs_walk->buffer,
+                                    outputs_walk->bargc,
+                                    1,
+                                    &rect_border);
             uint32_t vals[] = { bg_color, bg_color };
             xcb_change_gc(xcb_connection,
                           outputs_walk->bargc,
                           mask,
                           vals);
-            xcb_rectangle_t rect = { i + 1, 1, ws_walk->name_width + 8, font.height + 4 };
+            xcb_rectangle_t rect = { i + 2, 1, ws_walk->name_width + 8, font.height + 2 };
             xcb_poly_fill_rectangle(xcb_connection,
                                     outputs_walk->buffer,
                                     outputs_walk->bargc,
@@ -1397,8 +1420,8 @@ void draw_bars() {
                                     &rect);
             set_font_colors(outputs_walk->bargc, fg_color, bg_color);
             draw_text((char*)ws_walk->ucs2_name, ws_walk->name_glyphs, true,
-                    outputs_walk->buffer, outputs_walk->bargc, i + 5, 2, ws_walk->name_width);
-            i += 10 + ws_walk->name_width;
+                    outputs_walk->buffer, outputs_walk->bargc, i + 6, 2, ws_walk->name_width);
+            i += 12 + ws_walk->name_width;
         }
 
         i = 0;
index 3144263dccb0bf37ee918727f62e4c5363b95e04..2d72283d5496c66fbe6f87e4eb46291337315570 100644 (file)
@@ -2,7 +2,7 @@
  * vim:ts=4:sw=4:expandtab
  *
  * i3 - an improved dynamic tiling window manager
- * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ * © 2009-2012 Michael Stapelberg and contributors (see also: LICENSE)
  *
  * include/config.h: Contains all structs/variables for the configurable
  * part of i3 as well as functions handling the configuration file (calling
@@ -237,17 +237,21 @@ struct Barconfig {
         char *background;
         char *statusline;
 
-        char *focused_workspace_text;
+        char *focused_workspace_border;
         char *focused_workspace_bg;
+        char *focused_workspace_text;
 
-        char *active_workspace_text;
+        char *active_workspace_border;
         char *active_workspace_bg;
+        char *active_workspace_text;
 
-        char *inactive_workspace_text;
+        char *inactive_workspace_border;
         char *inactive_workspace_bg;
+        char *inactive_workspace_text;
 
-        char *urgent_workspace_text;
+        char *urgent_workspace_border;
         char *urgent_workspace_bg;
+        char *urgent_workspace_text;
     } colors;
 
     TAILQ_ENTRY(Barconfig) configs;
index 13ea2636a828a60dcafd06ebcb3b52a5f7727def..6dfec224e842e4eb1bec7d6fe7783ca287230ce2 100644 (file)
@@ -37,7 +37,8 @@ int yycolumn = 1;
     yy_push_state(EAT_WHITESPACE); \
 } while (0)
 
-#define BAR_DOUBLE_COLOR do { \
+#define BAR_TRIPLE_COLOR do { \
+    yy_push_state(BAR_COLOR); \
     yy_push_state(BAR_COLOR); \
     yy_push_state(BAR_COLOR); \
 } while (0)
@@ -122,10 +123,10 @@ EOL     (\r?\n)
 <BAR_COLORS>^[ \t]*#[^\n]*      { return TOKCOMMENT; }
 <BAR_COLORS>background          { yy_push_state(BAR_COLOR); return TOK_BAR_COLOR_BACKGROUND; }
 <BAR_COLORS>statusline          { yy_push_state(BAR_COLOR); return TOK_BAR_COLOR_STATUSLINE; }
-<BAR_COLORS>focused_workspace   { BAR_DOUBLE_COLOR; return TOK_BAR_COLOR_FOCUSED_WORKSPACE; }
-<BAR_COLORS>active_workspace    { BAR_DOUBLE_COLOR; return TOK_BAR_COLOR_ACTIVE_WORKSPACE; }
-<BAR_COLORS>inactive_workspace  { BAR_DOUBLE_COLOR; return TOK_BAR_COLOR_INACTIVE_WORKSPACE; }
-<BAR_COLORS>urgent_workspace    { BAR_DOUBLE_COLOR; return TOK_BAR_COLOR_URGENT_WORKSPACE; }
+<BAR_COLORS>focused_workspace   { BAR_TRIPLE_COLOR; return TOK_BAR_COLOR_FOCUSED_WORKSPACE; }
+<BAR_COLORS>active_workspace    { BAR_TRIPLE_COLOR; return TOK_BAR_COLOR_ACTIVE_WORKSPACE; }
+<BAR_COLORS>inactive_workspace  { BAR_TRIPLE_COLOR; return TOK_BAR_COLOR_INACTIVE_WORKSPACE; }
+<BAR_COLORS>urgent_workspace    { BAR_TRIPLE_COLOR; return TOK_BAR_COLOR_URGENT_WORKSPACE; }
 <BAR_COLOR>#[0-9a-fA-F]+        { yy_pop_state(); yylval.string = sstrdup(yytext); return HEXCOLOR; }
 <BAR,BAR_COLORS,BAR_MODE,BAR_MODIFIER,BAR_POSITION>[a-zA-Z]+ { yylval.string = sstrdup(yytext); return WORD; }
 
index 2a24f389d72d44b1834c9e2b3354a469ff22ca9c..2edc76987e5ee094a880398f344cf4ed78d2d778 100644 (file)
@@ -1208,38 +1208,42 @@ bar_color_statusline:
     ;
 
 bar_color_focused_workspace:
-    TOK_BAR_COLOR_FOCUSED_WORKSPACE HEXCOLOR HEXCOLOR
+    TOK_BAR_COLOR_FOCUSED_WORKSPACE HEXCOLOR HEXCOLOR HEXCOLOR
     {
-        DLOG("focused_ws = %s and %s\n", $2, $3);
-        current_bar.colors.focused_workspace_text = $2;
+        DLOG("focused_ws = %s, %s and %s\n", $2, $3, $4);
+        current_bar.colors.focused_workspace_border = $2;
         current_bar.colors.focused_workspace_bg = $3;
+        current_bar.colors.focused_workspace_text = $4;
     }
     ;
 
 bar_color_active_workspace:
-    TOK_BAR_COLOR_ACTIVE_WORKSPACE HEXCOLOR HEXCOLOR
+    TOK_BAR_COLOR_ACTIVE_WORKSPACE HEXCOLOR HEXCOLOR HEXCOLOR
     {
-        DLOG("active_ws = %s and %s\n", $2, $3);
-        current_bar.colors.active_workspace_text = $2;
+        DLOG("active_ws = %s, %s and %s\n", $2, $3, $4);
+        current_bar.colors.active_workspace_border = $2;
         current_bar.colors.active_workspace_bg = $3;
+        current_bar.colors.active_workspace_text = $4;
     }
     ;
 
 bar_color_inactive_workspace:
-    TOK_BAR_COLOR_INACTIVE_WORKSPACE HEXCOLOR HEXCOLOR
+    TOK_BAR_COLOR_INACTIVE_WORKSPACE HEXCOLOR HEXCOLOR HEXCOLOR
     {
-        DLOG("inactive_ws = %s and %s\n", $2, $3);
-        current_bar.colors.inactive_workspace_text = $2;
+        DLOG("inactive_ws = %s, %s and %s\n", $2, $3, $4);
+        current_bar.colors.inactive_workspace_border = $2;
         current_bar.colors.inactive_workspace_bg = $3;
+        current_bar.colors.inactive_workspace_text = $4;
     }
     ;
 
 bar_color_urgent_workspace:
-    TOK_BAR_COLOR_URGENT_WORKSPACE HEXCOLOR HEXCOLOR
+    TOK_BAR_COLOR_URGENT_WORKSPACE HEXCOLOR HEXCOLOR HEXCOLOR
     {
-        DLOG("urgent_ws = %s and %s\n", $2, $3);
-        current_bar.colors.urgent_workspace_text = $2;
+        DLOG("urgent_ws = %s, %s and %s\n", $2, $3, $4);
+        current_bar.colors.urgent_workspace_border = $2;
         current_bar.colors.urgent_workspace_bg = $3;
+        current_bar.colors.urgent_workspace_text = $4;
     }
     ;
 
index c2ce8dcb67fc5a8ca731aecae13cb510bc02f77d..130df6af7a84e52bb587c25bce9148d1bec7996e 100644 (file)
@@ -311,14 +311,18 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath,
             FREE(barconfig->font);
             FREE(barconfig->colors.background);
             FREE(barconfig->colors.statusline);
-            FREE(barconfig->colors.focused_workspace_text);
+            FREE(barconfig->colors.focused_workspace_border);
             FREE(barconfig->colors.focused_workspace_bg);
-            FREE(barconfig->colors.active_workspace_text);
+            FREE(barconfig->colors.focused_workspace_text);
+            FREE(barconfig->colors.active_workspace_border);
             FREE(barconfig->colors.active_workspace_bg);
-            FREE(barconfig->colors.inactive_workspace_text);
+            FREE(barconfig->colors.active_workspace_text);
+            FREE(barconfig->colors.inactive_workspace_border);
             FREE(barconfig->colors.inactive_workspace_bg);
-            FREE(barconfig->colors.urgent_workspace_text);
+            FREE(barconfig->colors.inactive_workspace_text);
+            FREE(barconfig->colors.urgent_workspace_border);
             FREE(barconfig->colors.urgent_workspace_bg);
+            FREE(barconfig->colors.urgent_workspace_text);
             TAILQ_REMOVE(&barconfigs, barconfig, configs);
             FREE(barconfig);
         }
index c43e622962776af0251bc5276091cceed42a2862..2fd3a224cf25b0fe95b8710728eeaeb27836d8b7 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -646,14 +646,18 @@ IPC_HANDLER(get_bar_config) {
         y(map_open);
         YSTR_IF_SET(background);
         YSTR_IF_SET(statusline);
-        YSTR_IF_SET(focused_workspace_text);
+        YSTR_IF_SET(focused_workspace_border);
         YSTR_IF_SET(focused_workspace_bg);
-        YSTR_IF_SET(active_workspace_text);
+        YSTR_IF_SET(focused_workspace_text);
+        YSTR_IF_SET(active_workspace_border);
         YSTR_IF_SET(active_workspace_bg);
-        YSTR_IF_SET(inactive_workspace_text);
+        YSTR_IF_SET(active_workspace_text);
+        YSTR_IF_SET(inactive_workspace_border);
         YSTR_IF_SET(inactive_workspace_bg);
-        YSTR_IF_SET(urgent_workspace_text);
+        YSTR_IF_SET(inactive_workspace_text);
+        YSTR_IF_SET(urgent_workspace_border);
         YSTR_IF_SET(urgent_workspace_bg);
+        YSTR_IF_SET(urgent_workspace_text);
         y(map_close);
 
 #undef YSTR_IF_SET
index fda5343254604c76a2738dd60cfe513cb280cc8d..eb92c7518bdf90d97ea41a9e342bba791c599ff5 100644 (file)
@@ -92,10 +92,10 @@ bar {
         background #ff0000
         statusline   #00ff00
 
-        focused_workspace   #ffffff #285577
-        active_workspace    #888888 #222222
-        inactive_workspace  #888888 #222222
-        urgent_workspace    #ffffff #900000
+        focused_workspace   #4c7899 #285577 #ffffff
+        active_workspace    #333333 #222222 #888888
+        inactive_workspace  #333333 #222222 #888888
+        urgent_workspace    #2f343a #900000 #ffffff
     }
 }
 EOT
@@ -122,12 +122,16 @@ is_deeply($bar_config->{colors},
     {
         background => '#ff0000',
         statusline => '#00ff00',
+        focused_workspace_border => '#4c7899',
         focused_workspace_text => '#ffffff',
         focused_workspace_bg => '#285577',
+        active_workspace_border => '#333333',
         active_workspace_text => '#888888',
         active_workspace_bg => '#222222',
+        inactive_workspace_border => '#333333',
         inactive_workspace_text => '#888888',
         inactive_workspace_bg => '#222222',
+        urgent_workspace_border => '#2f343a',
         urgent_workspace_text => '#ffffff',
         urgent_workspace_bg => '#900000',
     }, 'colors ok');