aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/seat.c
diff options
context:
space:
mode:
authorLibravatar Erik Reider <35975961+ErikReider@users.noreply.github.com>2023-06-05 15:31:16 +0200
committerLibravatar Kenny Levinsen <kl@kl.wtf>2023-06-06 09:07:05 +0200
commit913a7679cbde98df0722b326d8c3cfc0f0576f6d (patch)
tree752fea000515bcd93a40fc175dbbace5221ee9c4 /sway/input/seat.c
parentchase wlroots wlr_renderer_begin_buffer_pass change (diff)
downloadsway-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.c20
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
1297void seat_set_focus(struct sway_seat *seat, struct sway_node *node) { 1297void 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
1360void seat_set_exclusive_client(struct sway_seat *seat, 1370void seat_set_exclusive_client(struct sway_seat *seat,