mirror of
https://github.com/swaywm/sway.git
synced 2024-11-04 15:33:13 +00:00
swaybar: hide mode visibility improvements
This allows swaybar to become visible when the mode changes (to any mode other than the default). swaybar will be hidden again when the modifier is pressed and released or when switching back to the default mode. This also applies the same logic to visible by urgency to hide swaybar when the modifier is pressed and released. These changes are to match i3's behavior.
This commit is contained in:
parent
b6e55064fe
commit
583ceff6f6
|
@ -23,6 +23,7 @@ struct swaybar {
|
||||||
// only relevant when bar is in "hide" mode
|
// only relevant when bar is in "hide" mode
|
||||||
bool visible_by_modifier;
|
bool visible_by_modifier;
|
||||||
bool visible_by_urgency;
|
bool visible_by_urgency;
|
||||||
|
bool visible_by_mode;
|
||||||
bool visible;
|
bool visible;
|
||||||
|
|
||||||
struct wl_display *display;
|
struct wl_display *display;
|
||||||
|
|
|
@ -148,7 +148,8 @@ bool determine_bar_visibility(struct swaybar *bar, bool moving_layer) {
|
||||||
struct swaybar_config *config = bar->config;
|
struct swaybar_config *config = bar->config;
|
||||||
bool visible = !(strcmp(config->mode, "invisible") == 0 ||
|
bool visible = !(strcmp(config->mode, "invisible") == 0 ||
|
||||||
(strcmp(config->mode, config->hidden_state) == 0 // both "hide"
|
(strcmp(config->mode, config->hidden_state) == 0 // both "hide"
|
||||||
&& !bar->visible_by_modifier && !bar->visible_by_urgency));
|
&& !bar->visible_by_modifier && !bar->visible_by_urgency
|
||||||
|
&& !bar->visible_by_mode));
|
||||||
|
|
||||||
// Create/destroy layer surfaces as needed
|
// Create/destroy layer surfaces as needed
|
||||||
struct swaybar_output *output;
|
struct swaybar_output *output;
|
||||||
|
|
|
@ -499,6 +499,13 @@ static bool handle_bar_state_update(struct swaybar *bar, json_object *event) {
|
||||||
json_object *visible_by_modifier;
|
json_object *visible_by_modifier;
|
||||||
json_object_object_get_ex(event, "visible_by_modifier", &visible_by_modifier);
|
json_object_object_get_ex(event, "visible_by_modifier", &visible_by_modifier);
|
||||||
bar->visible_by_modifier = json_object_get_boolean(visible_by_modifier);
|
bar->visible_by_modifier = json_object_get_boolean(visible_by_modifier);
|
||||||
|
if (bar->visible_by_modifier) {
|
||||||
|
// If the bar is visible by modifier, clear both visible by mode and
|
||||||
|
// urgency as modifier has precedence and the bar should be hidden
|
||||||
|
// again when it is no longer visible by modifier.
|
||||||
|
bar->visible_by_mode = false;
|
||||||
|
bar->visible_by_urgency = false;
|
||||||
|
}
|
||||||
return determine_bar_visibility(bar, false);
|
return determine_bar_visibility(bar, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -578,6 +585,8 @@ bool handle_ipc_readable(struct swaybar *bar) {
|
||||||
const char *change = json_object_get_string(json_change);
|
const char *change = json_object_get_string(json_change);
|
||||||
free(bar->mode);
|
free(bar->mode);
|
||||||
bar->mode = strcmp(change, "default") != 0 ? strdup(change) : NULL;
|
bar->mode = strcmp(change, "default") != 0 ? strdup(change) : NULL;
|
||||||
|
bar->visible_by_mode = bar->mode != NULL;
|
||||||
|
determine_bar_visibility(bar, false);
|
||||||
} else {
|
} else {
|
||||||
sway_log(SWAY_ERROR, "failed to parse response");
|
sway_log(SWAY_ERROR, "failed to parse response");
|
||||||
bar_is_dirty = false;
|
bar_is_dirty = false;
|
||||||
|
|
Loading…
Reference in a new issue