From 2f7247e08a16610228067c9ec34d2b6d897e15fa Mon Sep 17 00:00:00 2001 From: Milkey Mouse Date: Sat, 23 Feb 2019 21:59:36 -0800 Subject: [PATCH] swaybar: add overlay mode (fix #1620) Overlay mode puts the bar above normal windows and passes through/ignores any touch/mouse/keyboard events that would be sent to it. --- include/swaybar/bar.h | 1 + sway/commands/bar/mode.c | 2 ++ sway/sway-bar.5.scd | 6 ++++-- swaybar/bar.c | 16 ++++++++++++++-- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h index dfadc200a..031993b57 100644 --- a/include/swaybar/bar.h +++ b/include/swaybar/bar.h @@ -58,6 +58,7 @@ struct swaybar_output { struct zxdg_output_v1 *xdg_output; struct wl_surface *surface; struct zwlr_layer_surface_v1 *layer_surface; + struct wl_region *input_region; uint32_t wl_name; struct wl_list workspaces; // swaybar_workspace::link diff --git a/sway/commands/bar/mode.c b/sway/commands/bar/mode.c index 68a80abf6..1081ad4b8 100644 --- a/sway/commands/bar/mode.c +++ b/sway/commands/bar/mode.c @@ -20,6 +20,8 @@ static struct cmd_results *bar_set_mode(struct bar_config *bar, const char *mode bar->mode = strdup("hide"); } else if (strcasecmp("invisible", mode) == 0) { bar->mode = strdup("invisible"); + } else if (strcasecmp("overlay", mode) == 0) { + bar->mode = strdup("overlay"); } else { return cmd_results_new(CMD_INVALID, "Invalid value %s", mode); } diff --git a/sway/sway-bar.5.scd b/sway/sway-bar.5.scd index 13827e5ee..1f4ceaf2f 100644 --- a/sway/sway-bar.5.scd +++ b/sway/sway-bar.5.scd @@ -84,11 +84,13 @@ Sway allows configuring swaybar in the sway configuration file. debug-events`. To disable the default behavior for a button, use the command _nop_. -*mode* dock|hide|invisible +*mode* dock|hide|invisible|overlay Specifies the visibility of the bar. In _dock_ mode, it is permanently visible at one edge of the screen. In _hide_ mode, it is hidden unless the modifier key is pressed, though this behaviour depends on the hidden state. - In _invisible_ mode, it is permanently hidden. Default is _dock_. + In _invisible_ mode, it is permanently hidden. In _overlay_ mode, it is + permanently visible on top of other windows. (In _overlay_ mode the bar is + transparent to input events.) Default is _dock_. *hidden_state* hide|show Specifies the behaviour of the bar when it is in _hide_ mode. When the diff --git a/swaybar/bar.c b/swaybar/bar.c index db1c12228..ca7cd88c4 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c @@ -51,6 +51,9 @@ static void swaybar_output_free(struct swaybar_output *output) { if (output->surface != NULL) { wl_surface_destroy(output->surface); } + if (output->input_region != NULL) { + wl_region_destroy(output->input_region); + } zxdg_output_v1_destroy(output->xdg_output); wl_output_destroy(output->output); destroy_buffer(&output->buffers[0]); @@ -100,16 +103,25 @@ static void add_layer_surface(struct swaybar_output *output) { struct swaybar_config *config = bar->config; bool hidden = strcmp(config->mode, "hide") == 0; + bool overlay = !hidden && strcmp(config->mode, "overlay") == 0; output->layer_surface = zwlr_layer_shell_v1_get_layer_surface( bar->layer_shell, output->surface, output->output, - hidden ? ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY : + hidden || overlay ? ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY : ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM, "panel"); assert(output->layer_surface); zwlr_layer_surface_v1_add_listener(output->layer_surface, &layer_surface_listener, output); + if (overlay) { + // Empty input region + output->input_region = wl_compositor_create_region(bar->compositor); + assert(output->input_region); + + wl_surface_set_input_region(output->surface, output->input_region); + } + zwlr_layer_surface_v1_set_anchor(output->layer_surface, config->position); - if (hidden) { + if (hidden || overlay) { zwlr_layer_surface_v1_set_exclusive_zone(output->layer_surface, -1); } }