From 140321577e965ce196018e6a486adbad3042fe66 Mon Sep 17 00:00:00 2001 From: Aleksei Bavshin Date: Fri, 22 Jan 2021 07:40:21 -0800 Subject: [PATCH] layer-shell: implement on-demand keyboard interactivity --- sway/desktop/layer_shell.c | 6 ++++-- sway/input/seatop_default.c | 6 +++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c index d4ca4fb43..83bb330db 100644 --- a/sway/desktop/layer_shell.c +++ b/sway/desktop/layer_shell.c @@ -211,7 +211,8 @@ void arrange_layers(struct sway_output *output) { for (size_t i = 0; i < nlayers; ++i) { wl_list_for_each_reverse(layer, &output->layers[layers_above_shell[i]], link) { - if (layer->layer_surface->current.keyboard_interactive && + if (layer->layer_surface->current.keyboard_interactive == + ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE && layer->layer_surface->mapped) { topmost = layer; break; @@ -227,7 +228,8 @@ void arrange_layers(struct sway_output *output) { if (topmost != NULL) { seat_set_focus_layer(seat, topmost->layer_surface); } else if (seat->focused_layer && - !seat->focused_layer->current.keyboard_interactive) { + seat->focused_layer->current.keyboard_interactive != + ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) { seat_set_focus_layer(seat, NULL); } } diff --git a/sway/input/seatop_default.c b/sway/input/seatop_default.c index a583ed623..41fd62977 100644 --- a/sway/input/seatop_default.c +++ b/sway/input/seatop_default.c @@ -365,8 +365,12 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec, if (surface && wlr_surface_is_layer_surface(surface)) { struct wlr_layer_surface_v1 *layer = wlr_layer_surface_v1_from_wlr_surface(surface); - if (layer->current.keyboard_interactive) { + if (layer->current.keyboard_interactive == + ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) { seat_set_focus_layer(seat, layer); + } else if (layer->current.keyboard_interactive == + ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ON_DEMAND) { + seat_set_focus_surface(seat, surface, true); } seat_pointer_notify_button(seat, time_msec, button, state); return;