From 625b6e1ec4eaf8041d183cd158956078062f5382 Mon Sep 17 00:00:00 2001 From: Robin Ebert Date: Wed, 15 Jun 2022 09:25:38 +0200 Subject: [PATCH] sway: prevent layer-shell-surfaces from receiving input when it is inhibited seat_set_focus_layer is missing an inhibition check allowing layer-shell surfaces to be focused even when it is inhibited. layer-shell surfaces also don't lose keyboard focus in seat_set_exclusive_client. This breaks assumptions made by input_inhibitor clients. --- sway/input/seat.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sway/input/seat.c b/sway/input/seat.c index fe61e0fee..7cb9354f6 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -1326,7 +1326,7 @@ void seat_set_focus_layer(struct sway_seat *seat, seat_set_focus(seat, previous); } return; - } else if (!layer || seat->focused_layer == layer) { + } else if (!layer || seat->focused_layer == layer || !seat_is_input_allowed(seat, layer->surface)) { return; } assert(layer->mapped); @@ -1362,7 +1362,12 @@ void seat_set_exclusive_client(struct sway_seat *seat, } if (seat->wlr_seat->pointer_state.focused_client) { if (seat->wlr_seat->pointer_state.focused_client->client != client) { - wlr_seat_pointer_notify_clear_focus(seat->wlr_seat); + wlr_seat_pointer_clear_focus(seat->wlr_seat); + } + } + if (seat->wlr_seat->keyboard_state.focused_client) { + if (seat->wlr_seat->keyboard_state.focused_client->client != client) { + wlr_seat_keyboard_clear_focus(seat->wlr_seat); } } struct timespec now;