diff options
author | Erik Reider <35975961+ErikReider@users.noreply.github.com> | 2023-06-05 15:31:16 +0200 |
---|---|---|
committer | Kenny Levinsen <kl@kl.wtf> | 2023-06-06 09:07:05 +0200 |
commit | 913a7679cbde98df0722b326d8c3cfc0f0576f6d (patch) | |
tree | 752fea000515bcd93a40fc175dbbace5221ee9c4 /sway/input/seat.c | |
parent | chase wlroots wlr_renderer_begin_buffer_pass change (diff) | |
download | sway-913a7679cbde98df0722b326d8c3cfc0f0576f6d.tar.gz sway-913a7679cbde98df0722b326d8c3cfc0f0576f6d.tar.zst sway-913a7679cbde98df0722b326d8c3cfc0f0576f6d.zip |
Add support for wlr-layer-shell ON_DEMAND keyboard interactivity
This allows for layer shell surfaces to receive focus while the surface is explicitly focused, i.e allowing
text fields to receive keyboard input just like a regular surface.
Diffstat (limited to 'sway/input/seat.c')
-rw-r--r-- | sway/input/seat.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c index 5795f40f..fdd21057 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c | |||
@@ -1295,11 +1295,15 @@ static void seat_set_workspace_focus(struct sway_seat *seat, struct sway_node *n | |||
1295 | } | 1295 | } |
1296 | 1296 | ||
1297 | void seat_set_focus(struct sway_seat *seat, struct sway_node *node) { | 1297 | void seat_set_focus(struct sway_seat *seat, struct sway_node *node) { |
1298 | if (seat->focused_layer) { | 1298 | // Prevents the layer from losing focus if it has keyboard exclusivity |
1299 | if (seat->has_exclusive_layer) { | ||
1299 | struct wlr_layer_surface_v1 *layer = seat->focused_layer; | 1300 | struct wlr_layer_surface_v1 *layer = seat->focused_layer; |
1300 | seat_set_focus_layer(seat, NULL); | 1301 | seat_set_focus_layer(seat, NULL); |
1301 | seat_set_workspace_focus(seat, node); | 1302 | seat_set_workspace_focus(seat, node); |
1302 | seat_set_focus_layer(seat, layer); | 1303 | seat_set_focus_layer(seat, layer); |
1304 | } else if (seat->focused_layer) { | ||
1305 | seat_set_focus_layer(seat, NULL); | ||
1306 | seat_set_workspace_focus(seat, node); | ||
1303 | } else { | 1307 | } else { |
1304 | seat_set_workspace_focus(seat, node); | 1308 | seat_set_workspace_focus(seat, node); |
1305 | } | 1309 | } |
@@ -1347,14 +1351,20 @@ void seat_set_focus_layer(struct sway_seat *seat, | |||
1347 | seat_set_focus(seat, previous); | 1351 | seat_set_focus(seat, previous); |
1348 | } | 1352 | } |
1349 | return; | 1353 | return; |
1350 | } else if (!layer || seat->focused_layer == layer) { | 1354 | } else if (!layer) { |
1351 | return; | 1355 | return; |
1352 | } | 1356 | } |
1353 | assert(layer->surface->mapped); | 1357 | assert(layer->surface->mapped); |
1354 | seat_set_focus_surface(seat, layer->surface, true); | 1358 | if (layer->current.layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP && |
1355 | if (layer->current.layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP) { | 1359 | layer->current.keyboard_interactive |
1356 | seat->focused_layer = layer; | 1360 | == ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) { |
1361 | seat->has_exclusive_layer = true; | ||
1362 | } | ||
1363 | if (seat->focused_layer == layer) { | ||
1364 | return; | ||
1357 | } | 1365 | } |
1366 | seat_set_focus_surface(seat, layer->surface, true); | ||
1367 | seat->focused_layer = layer; | ||
1358 | } | 1368 | } |
1359 | 1369 | ||
1360 | void seat_set_exclusive_client(struct sway_seat *seat, | 1370 | void seat_set_exclusive_client(struct sway_seat *seat, |