i3bar: Simplify hide mode logic
Patch status: merged
Patch by Tony Crisci
Long description:
When determining whether to hide or unhide the bar on redraw in hide mode, use simpler rules. When the config specifies the 'show' state or a workspace is urgent, or if the caller requests it, or the modifier is pressed, show the bar. Otherwise, hide the bar.
To apply this patch, use:
curl http://cr.i3wm.org/patch/287/raw.patch | git am
b/i3bar/src/xcb.c
| 17 | @@ -1626,9 +1626,6 @@ void draw_bars(bool unhide) { | 
| 18 |  | 
| 19 | refresh_statusline(); | 
| 20 |  | 
| 21 | - static char *last_urgent_ws = NULL; | 
| 22 | - bool walks_away = true; | 
| 23 | - | 
| 24 | i3_output *outputs_walk; | 
| 25 |      SLIST_FOREACH(outputs_walk, outputs, slist) { | 
| 26 |          if (!outputs_walk->active) { | 
| 27 | @@ -1697,9 +1694,6 @@ void draw_bars(bool unhide) { | 
| 28 | fg_color = colors.focus_ws_fg; | 
| 29 | bg_color = colors.focus_ws_bg; | 
| 30 | border_color = colors.focus_ws_border; | 
| 31 | - if (last_urgent_ws && strcmp(i3string_as_utf8(ws_walk->name), | 
| 32 | - last_urgent_ws) == 0) | 
| 33 | - walks_away = false; | 
| 34 | } | 
| 35 | } | 
| 36 |                  if (ws_walk->urgent) { | 
| 37 | @@ -1708,10 +1702,6 @@ void draw_bars(bool unhide) { | 
| 38 | bg_color = colors.urgent_ws_bg; | 
| 39 | border_color = colors.urgent_ws_border; | 
| 40 | unhide = true; | 
| 41 | -                    if (!ws_walk->focused) { | 
| 42 | - FREE(last_urgent_ws); | 
| 43 | - last_urgent_ws = sstrdup(i3string_as_utf8(ws_walk->name)); | 
| 44 | - } | 
| 45 | } | 
| 46 | uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND; | 
| 47 |                  uint32_t vals_border[] = { border_color, border_color }; | 
| 48 | @@ -1783,13 +1773,11 @@ void draw_bars(bool unhide) { | 
| 49 | } | 
| 50 |  | 
| 51 | /* Assure the bar is hidden/unhidden according to the specified hidden_state and mode */ | 
| 52 | - bool should_unhide = (config.hidden_state == S_SHOW || (unhide && config.hidden_state == S_HIDE)); | 
| 53 | - bool should_hide = (config.hide_on_modifier == M_INVISIBLE); | 
| 54 | - | 
| 55 | -    if (mod_pressed || (should_unhide && !should_hide)) { | 
| 56 | + if (mod_pressed || | 
| 57 | + config.hidden_state == S_SHOW || | 
| 58 | +            unhide) { | 
| 59 | unhide_bars(); | 
| 60 | -    } else if (!mod_pressed && (walks_away || should_hide)) { | 
| 61 | - FREE(last_urgent_ws); | 
| 62 | +    } else if (config.hide_on_modifier == M_HIDE) { | 
| 63 | hide_bars(); | 
| 64 | } | 
| 65 |  |