aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/swaybar/bar.h1
-rw-r--r--sway/commands/bar/mode.c2
-rw-r--r--sway/sway-bar.5.scd6
-rw-r--r--swaybar/bar.c16
4 files changed, 21 insertions, 4 deletions
diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h
index dfadc200..031993b5 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 68a80abf..1081ad4b 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 13827e5e..1f4ceaf2 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 db1c1222..ca7cd88c 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);
}
}