summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Douglas Scott <idscott@system76.com>2024-05-09 15:02:06 -0700
committerOlivier Fourdan <ofourdan@redhat.com>2024-08-06 10:00:59 +0200
commit4262fb182b2b51fd0ec8bec30671eb3babe94cb0 (patch)
tree74849d50f312ab8198f03b258ac1f371a6dd37e3
parent54a591b9b8b8e2cd49fd02be945e9e0912b874c1 (diff)
xwayland: Release keys on keyboard `enter` event if `leave` wasn't received
The code here assumed a `leave` event always occurs between two `enter` events. On Sway (and presumably other compositors) this happens even if the client has destroyed the `wl_surface`, but the client gets a null `surface` here. (Which presumably on on the wire is the id of the destroyed surface.) This seems like a bad thing to rely on, and is easy to avoid. But if this is correct to assume, the Wayland protocol should be explicit about this. (cherry picked from commit 386b54fbe95711e6ecb5c23cfdbf25a1571acf7b) Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1635>
-rw-r--r--hw/xwayland/xwayland-input.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index d23f284b9..5e4b78469 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -1213,6 +1213,10 @@ keyboard_handle_enter(void *data, struct wl_keyboard *keyboard,
xwl_seat->xwl_screen->serial = serial;
xwl_seat->keyboard_focus = surface;
+ /* If `leave` wasn't sent (for a destroyed surface), release keys here. */
+ wl_array_for_each(k, &xwl_seat->keys)
+ QueueKeyboardEvents(xwl_seat->keyboard, LeaveNotify, *k + 8);
+
wl_array_copy(&xwl_seat->keys, keys);
wl_array_for_each(k, &xwl_seat->keys)
QueueKeyboardEvents(xwl_seat->keyboard, EnterNotify, *k + 8);
@@ -1227,6 +1231,7 @@ xwl_seat_leave_kbd(struct xwl_seat *xwl_seat)
wl_array_for_each(k, &xwl_seat->keys)
QueueKeyboardEvents(xwl_seat->keyboard, LeaveNotify, *k + 8);
+ xwl_seat->keys.size = 0;
xwl_seat->keyboard_focus = NULL;