]> git.sur5r.net Git - i3/i3/commitdiff
Separator color via config; separator width and on/off via ipc
authorArtem Shinkarov <artyom.shinkaroff@gmail.com>
Sun, 27 Jan 2013 20:27:21 +0000 (20:27 +0000)
committerMichael Stapelberg <michael@stapelberg.de>
Mon, 18 Feb 2013 09:44:44 +0000 (10:44 +0100)
This patch adds the following features:
1) Configure a color of the separator via config.  It is done like
   bar {
      colors {
         separator #000000
      }
   }
2) A block can have an integer entry "separator_block_width" which
   sets the width of the gap which would follow after the current block.

3) A block can have a boolean entry "separator" and if it is set
   to false, then the drawing of the separating line would be disabled.

12 files changed:
docs/i3bar-protocol
docs/ipc
docs/userguide
i3bar/include/common.h
i3bar/include/xcb.h
i3bar/src/child.c
i3bar/src/config.c
i3bar/src/xcb.c
include/config.h
parser-specs/config.spec
src/config_directives.c
src/ipc.c

index 2cf6dd0a18ebb263552e263a080e83887ee89913..758628daeb7a0d3ab3a7976efb169c3887fd0a11 100644 (file)
@@ -154,6 +154,14 @@ urgent::
        A boolean which specifies whether the current value is urgent. Examples
        are battery charge values below 1 percent or no more available disk
        space (for non-root users). The presentation of urgency is up to i3bar.
+separator::
+       The boolean value false disables drawing of a separating line after the
+       block.  If the field is not present then the separator will be still
+       drawn.  Keep in mind that absence of a separator is only responsible for
+       the line itself, the gap between the items would be still present.
+separator_block_width::
+       The integer value that sets the width of the gap between items in pixels.
+       In the middle of the gap, a separating line is going to be drawn.
 
 If you want to put in your own entries into a block, prefix the key with an
 underscore (_). i3bar will ignore all keys it doesn’t understand, and prefixing
index c32c59e35864fbc2026ab3f685515299085324c1..e1a1fc5fe1c5a5fc9ff37190974c8199911e7992 100644 (file)
--- a/docs/ipc
+++ b/docs/ipc
@@ -507,6 +507,8 @@ background::
        Background color of the bar.
 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
        has focus.
index 4bf3cc7969c60c86d61119b4453a02e34e58c3f0..a0f521c27b2613806742b35e494e15d351bea26f 100644 (file)
@@ -1155,6 +1155,8 @@ background::
        Background color of the bar.
 statusline::
        Text color to be used for the statusline.
+separator::
+       Text color to be used for the separator.
 focused_workspace::
        Border, background and text color for a workspace button when the workspace
        has focus.
@@ -1176,6 +1178,7 @@ urgent_workspace::
 colors {
     background <color>
     statusline <color>
+    separator <color>
 
     colorclass <border> <background> <text>
 }
@@ -1187,6 +1190,7 @@ bar {
     colors {
         background #000000
         statusline #ffffff
+        separator #666666
 
         focused_workspace  #4c7899 #285577 #ffffff
         active_workspace   #333333 #5f676a #ffffff
index 05fb5aa1151f0cac88f29d6593ab4c5fc05f6704..1365082f54591c0720712ce346ce7c37373ff36d 100644 (file)
@@ -43,6 +43,10 @@ struct status_block {
     blockalign_t align;
 
     bool urgent;
+    bool no_separator;
+
+    /* The amount of pixels necessary to render a separater after the block. */
+    uint32_t sep_block_width;
 
     /* The amount of pixels necessary to render this block. These variables are
      * only temporarily used in refresh_statusline(). */
index 69440537448c99096306b04dbc95659c04b9aeb4..d8d0c09049287cf0cc4768836e6325680a3d223d 100644 (file)
@@ -28,6 +28,7 @@
 struct xcb_color_strings_t {
     char *bar_fg;
     char *bar_bg;
+    char *sep_fg;
     char *active_ws_fg;
     char *active_ws_bg;
     char *active_ws_border;
index bea1d58e43bb677f6fe25192f450f461ae396587..72e4e7452029d0bcb5bd32879e3ac97b18a9f904 100644 (file)
@@ -98,6 +98,10 @@ static int stdin_start_array(void *context) {
 static int stdin_start_map(void *context) {
     parser_ctx *ctx = context;
     memset(&(ctx->block), '\0', sizeof(struct status_block));
+
+    /* Default width of the separator block. */
+    ctx->block.sep_block_width = 9;
+
     return 1;
 }
 
@@ -117,6 +121,9 @@ static int stdin_boolean(void *context, int val) {
     if (strcasecmp(ctx->last_map_key, "urgent") == 0) {
         ctx->block.urgent = val;
     }
+    if (strcasecmp(ctx->last_map_key, "separator") == 0) {
+        ctx->block.no_separator = !val;
+    }
     return 1;
 }
 
@@ -153,6 +160,9 @@ static int stdin_integer(void *context, long val) {
     if (strcasecmp(ctx->last_map_key, "min_width") == 0) {
         ctx->block.min_width = (uint32_t)val;
     }
+    if (strcasecmp(ctx->last_map_key, "separator_block_width") == 0) {
+        ctx->block.sep_block_width = (uint32_t)val;
+    }
     return 1;
 }
 
index 69355b69b916c8bf75fafdae32da2ee3e62a9467..6c7286c4afd62d5094de71b7c4e76bf56c3579e9 100644 (file)
@@ -161,6 +161,7 @@ static int config_string_cb(void *params_, const unsigned char *val, unsigned in
 
     COLOR(statusline, bar_fg);
     COLOR(background, bar_bg);
+    COLOR(separator, sep_fg);
     COLOR(focused_workspace_border, focus_ws_border);
     COLOR(focused_workspace_bg, focus_ws_bg);
     COLOR(focused_workspace_text, focus_ws_fg);
@@ -260,6 +261,7 @@ void free_colors(struct xcb_color_strings_t *colors) {
     } while (0)
     FREE_COLOR(bar_fg);
     FREE_COLOR(bar_bg);
+    FREE_COLOR(sep_fg);
     FREE_COLOR(active_ws_fg);
     FREE_COLOR(active_ws_bg);
     FREE_COLOR(active_ws_border);
index 713311793716978c865597d24f86981bf2a97143..d354d596b84c32ab8667bb6e66902d27547601a3 100644 (file)
@@ -84,6 +84,7 @@ static mode binding;
 struct xcb_colors_t {
     uint32_t bar_fg;
     uint32_t bar_bg;
+    uint32_t sep_fg;
     uint32_t active_ws_fg;
     uint32_t active_ws_bg;
     uint32_t active_ws_border;
@@ -149,7 +150,8 @@ void refresh_statusline(void) {
 
         /* If this is not the last block, add some pixels for a separator. */
         if (TAILQ_NEXT(block, blocks) != NULL)
-            block->width += 9;
+            block->width += block->sep_block_width;
+
         statusline_width += block->width + block->x_offset + block->x_append;
     }
 
@@ -174,12 +176,14 @@ void refresh_statusline(void) {
         draw_text(block->full_text, statusline_pm, statusline_ctx, x + block->x_offset, 1, block->width);
         x += block->width + block->x_offset + block->x_append;
 
-        if (TAILQ_NEXT(block, blocks) != NULL) {
+        if (TAILQ_NEXT(block, blocks) != NULL && !block->no_separator && block->sep_block_width > 0) {
             /* This is not the last block, draw a separator. */
-            set_font_colors(statusline_ctx, get_colorpixel("#666666"), colors.bar_bg);
+            uint32_t sep_offset = block->sep_block_width/2 + block->sep_block_width % 2;
+            set_font_colors(statusline_ctx, colors.sep_fg, colors.bar_bg);
             xcb_poly_line(xcb_connection, XCB_COORD_MODE_ORIGIN, statusline_pm,
                           statusline_ctx, 2,
-                          (xcb_point_t[]){ { x - 5, 2 }, { x - 5, font.height - 2 } });
+                          (xcb_point_t[]){ { x - sep_offset, 2 },
+                                           { x - sep_offset, font.height - 2 } });
         }
     }
 }
@@ -259,6 +263,7 @@ void init_colors(const struct xcb_color_strings_t *new_colors) {
     } while  (0)
     PARSE_COLOR(bar_fg, "#FFFFFF");
     PARSE_COLOR(bar_bg, "#000000");
+    PARSE_COLOR(sep_fg, "#666666");
     PARSE_COLOR(active_ws_fg, "#FFFFFF");
     PARSE_COLOR(active_ws_bg, "#333333");
     PARSE_COLOR(active_ws_border, "#333333");
index 4a95d43fee8e7f25df2ce4979dc0c97595715f1e..7056af8587fe0ffba0cc2f3d69058157f8df2b07 100644 (file)
@@ -267,6 +267,7 @@ struct Barconfig {
     struct bar_colors {
         char *background;
         char *statusline;
+        char *separator;
 
         char *focused_workspace_border;
         char *focused_workspace_bg;
index 7538bf38047cadd4076a0c1d237d884f22a720c1..9a4bf559c84116665fa6dd9ea08b9529e02b8a97 100644 (file)
@@ -419,7 +419,7 @@ state BAR_COLORS:
   end ->
   '#' -> BAR_COLORS_IGNORE_LINE
   'set' -> BAR_COLORS_IGNORE_LINE
-  colorclass = 'background', 'statusline'
+  colorclass = 'background', 'statusline', 'separator'
       -> BAR_COLORS_SINGLE
   colorclass = 'focused_workspace', 'active_workspace', 'inactive_workspace', 'urgent_workspace'
       -> BAR_COLORS_BORDER
index 8b636c026547c4f910ee7ff1afa512b22401b19f..0a83d46febefd48644964c4b4086c23db1d4207c 100644 (file)
@@ -526,7 +526,10 @@ CFGFUN(bar_tray_output, const char *output) {
 CFGFUN(bar_color_single, const char *colorclass, const char *color) {
     if (strcmp(colorclass, "background") == 0)
         current_bar.colors.background = sstrdup(color);
-    else current_bar.colors.statusline = sstrdup(color);
+    else if (strcmp(colorclass, "separator") == 0)
+        current_bar.colors.separator = sstrdup(color);
+    else
+        current_bar.colors.statusline = sstrdup(color);
 }
 
 CFGFUN(bar_status_command, const char *command) {
index 2379ba5fae2a072b19c49780973b6a6c4978d0c0..cf2535733e46123fe8aa7a0540d6c18b052a4441 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -677,6 +677,7 @@ IPC_HANDLER(get_bar_config) {
         y(map_open);
         YSTR_IF_SET(background);
         YSTR_IF_SET(statusline);
+        YSTR_IF_SET(separator);
         YSTR_IF_SET(focused_workspace_border);
         YSTR_IF_SET(focused_workspace_bg);
         YSTR_IF_SET(focused_workspace_text);