i3 - improved tiling WM


i3bar: Respect the urgency flag on status blocks by drawing urgent blocks with the same settings as an urgent workspace.

Patch status: merged

Patch by Ingo Bürk

To apply this patch, use:
curl http://cr.i3wm.org/patch/682/raw.patch | git am

b/i3bar/src/xcb.c

14
@@ -156,7 +156,7 @@ void refresh_statusline(void) {
15
 
16
         /* If this is not the last block, add some pixels for a separator. */
17
         if (TAILQ_NEXT(block, blocks) != NULL)
18
-            block->width += block->sep_block_width;
19
+            statusline_width += block->sep_block_width;
20
 
21
         statusline_width += block->width + block->x_offset + block->x_append;
22
     }
23
@@ -168,7 +168,7 @@ void refresh_statusline(void) {
24
         realloc_sl_buffer();
25
 
26
     /* Clear the statusline pixmap. */
27
-    xcb_rectangle_t rect = {0, 0, root_screen->width_in_pixels, font.height + logical_px(5)};
28
+    xcb_rectangle_t rect = {0, 0, root_screen->width_in_pixels, bar_height};
29
     xcb_poly_fill_rectangle(xcb_connection, statusline_pm, statusline_clear, 1, &rect);
30
 
31
     /* Draw the text of each block. */
32
@@ -176,11 +176,39 @@ void refresh_statusline(void) {
33
     TAILQ_FOREACH(block, &statusline_head, blocks) {
34
         if (i3string_get_num_bytes(block->full_text) == 0)
35
             continue;
36
+        uint32_t fg_color;
37
 
38
-        uint32_t colorpixel = (block->color ? get_colorpixel(block->color) : colors.bar_fg);
39
-        set_font_colors(statusline_ctx, colorpixel, colors.bar_bg);
40
-        draw_text(block->full_text, statusline_pm, statusline_ctx, x + block->x_offset, 1, block->width);
41
-        x += block->width + block->x_offset + block->x_append;
42
+        /* If this block is urgent, draw it with the defined color and border. */
43
+        if (block->urgent) {
44
+            fg_color = colors.urgent_ws_fg;
45
+
46
+            uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND;
47
+
48
+            /* Draw the border. */
49
+            uint32_t border_color = colors.urgent_ws_border;
50
+            uint32_t border_values[] = { border_color, border_color };
51
+            xcb_change_gc(xcb_connection, statusline_ctx, mask, border_values);
52
+
53
+            xcb_rectangle_t border_rect = { x, 0,
54
+                                            block->width + block->x_offset + block->x_append, bar_height };
55
+            xcb_poly_fill_rectangle(xcb_connection, statusline_pm, statusline_ctx, 1, &border_rect);
56
+
57
+            /* Draw the background */
58
+            uint32_t bg_color = colors.urgent_ws_bg;
59
+            uint32_t bg_values[] = { bg_color, bg_color };
60
+            xcb_change_gc(xcb_connection, statusline_ctx, mask, bg_values);
61
+
62
+            xcb_rectangle_t bg_rect = { x + 1, 1,
63
+                                        block->width + block->x_offset + block->x_append - 2,
64
+                                        bar_height - 2 };
65
+            xcb_poly_fill_rectangle(xcb_connection, statusline_pm, statusline_ctx, 1, &bg_rect);
66
+        } else {
67
+            fg_color = (block->color ? get_colorpixel(block->color) : colors.bar_fg);
68
+        }
69
+
70
+        set_font_colors(statusline_ctx, fg_color, colors.bar_bg);
71
+        draw_text(block->full_text, statusline_pm, statusline_ctx, x + block->x_offset, 3, block->width);
72
+        x += block->width + block->sep_block_width + block->x_offset + block->x_append;
73
 
74
         if (TAILQ_NEXT(block, blocks) != NULL && !block->no_separator && block->sep_block_width > 0) {
75
             /* This is not the last block, draw a separator. */
76
@@ -190,8 +218,8 @@ void refresh_statusline(void) {
77
             xcb_change_gc(xcb_connection, statusline_ctx, mask, values);
78
             xcb_poly_line(xcb_connection, XCB_COORD_MODE_ORIGIN, statusline_pm,
79
                           statusline_ctx, 2,
80
-                          (xcb_point_t[]) {{x - sep_offset, 2},
81
-                                           {x - sep_offset, font.height - 2}});
82
+                          (xcb_point_t[]) { { x - sep_offset, 4 },
83
+                                            { x - sep_offset, bar_height - 4 } });
84
         }
85
     }
86
 }
87
@@ -1713,8 +1741,8 @@ void draw_bars(bool unhide) {
88
                           outputs_walk->buffer,
89
                           outputs_walk->bargc,
90
                           MAX(0, (int16_t)(statusline_width - outputs_walk->rect.w + 4)), 0,
91
-                          MAX(0, (int16_t)(outputs_walk->rect.w - statusline_width - traypx - 4)), 3,
92
-                          MIN(outputs_walk->rect.w - traypx - 4, (int)statusline_width), font.height + 2);
93
+                          MAX(0, (int16_t)(outputs_walk->rect.w - statusline_width - traypx - 4)), 0,
94
+                          MIN(outputs_walk->rect.w - traypx - 4, (int)statusline_width), bar_height);
95
         }
96
 
97
         if (!config.disable_ws) {