diff options
-rw-r--r-- | include/swaybar/bar.h | 1 | ||||
-rw-r--r-- | swaybar/bar.c | 3 | ||||
-rw-r--r-- | swaybar/ipc.c | 9 |
3 files changed, 12 insertions, 1 deletions
diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h index 031993b5..84619237 100644 --- a/include/swaybar/bar.h +++ b/include/swaybar/bar.h | |||
@@ -23,6 +23,7 @@ struct swaybar { | |||
23 | // only relevant when bar is in "hide" mode | 23 | // only relevant when bar is in "hide" mode |
24 | bool visible_by_modifier; | 24 | bool visible_by_modifier; |
25 | bool visible_by_urgency; | 25 | bool visible_by_urgency; |
26 | bool visible_by_mode; | ||
26 | bool visible; | 27 | bool visible; |
27 | 28 | ||
28 | struct wl_display *display; | 29 | struct wl_display *display; |
diff --git a/swaybar/bar.c b/swaybar/bar.c index ca7cd88c..a95464f5 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c | |||
@@ -148,7 +148,8 @@ bool determine_bar_visibility(struct swaybar *bar, bool moving_layer) { | |||
148 | struct swaybar_config *config = bar->config; | 148 | struct swaybar_config *config = bar->config; |
149 | bool visible = !(strcmp(config->mode, "invisible") == 0 || | 149 | bool visible = !(strcmp(config->mode, "invisible") == 0 || |
150 | (strcmp(config->mode, config->hidden_state) == 0 // both "hide" | 150 | (strcmp(config->mode, config->hidden_state) == 0 // both "hide" |
151 | && !bar->visible_by_modifier && !bar->visible_by_urgency)); | 151 | && !bar->visible_by_modifier && !bar->visible_by_urgency |
152 | && !bar->visible_by_mode)); | ||
152 | 153 | ||
153 | // Create/destroy layer surfaces as needed | 154 | // Create/destroy layer surfaces as needed |
154 | struct swaybar_output *output; | 155 | struct swaybar_output *output; |
diff --git a/swaybar/ipc.c b/swaybar/ipc.c index 1cc55b43..a096f01a 100644 --- a/swaybar/ipc.c +++ b/swaybar/ipc.c | |||
@@ -499,6 +499,13 @@ static bool handle_bar_state_update(struct swaybar *bar, json_object *event) { | |||
499 | json_object *visible_by_modifier; | 499 | json_object *visible_by_modifier; |
500 | json_object_object_get_ex(event, "visible_by_modifier", &visible_by_modifier); | 500 | json_object_object_get_ex(event, "visible_by_modifier", &visible_by_modifier); |
501 | bar->visible_by_modifier = json_object_get_boolean(visible_by_modifier); | 501 | bar->visible_by_modifier = json_object_get_boolean(visible_by_modifier); |
502 | if (bar->visible_by_modifier) { | ||
503 | // If the bar is visible by modifier, clear both visible by mode and | ||
504 | // urgency as modifier has precedence and the bar should be hidden | ||
505 | // again when it is no longer visible by modifier. | ||
506 | bar->visible_by_mode = false; | ||
507 | bar->visible_by_urgency = false; | ||
508 | } | ||
502 | return determine_bar_visibility(bar, false); | 509 | return determine_bar_visibility(bar, false); |
503 | } | 510 | } |
504 | 511 | ||
@@ -578,6 +585,8 @@ bool handle_ipc_readable(struct swaybar *bar) { | |||
578 | const char *change = json_object_get_string(json_change); | 585 | const char *change = json_object_get_string(json_change); |
579 | free(bar->mode); | 586 | free(bar->mode); |
580 | bar->mode = strcmp(change, "default") != 0 ? strdup(change) : NULL; | 587 | bar->mode = strcmp(change, "default") != 0 ? strdup(change) : NULL; |
588 | bar->visible_by_mode = bar->mode != NULL; | ||
589 | determine_bar_visibility(bar, false); | ||
581 | } else { | 590 | } else { |
582 | sway_log(SWAY_ERROR, "failed to parse response"); | 591 | sway_log(SWAY_ERROR, "failed to parse response"); |
583 | bar_is_dirty = false; | 592 | bar_is_dirty = false; |