diff options
author | Ian Douglas Scott <idscott@system76.com> | 2024-05-09 15:02:06 -0700 |
---|---|---|
committer | Olivier Fourdan <ofourdan@redhat.com> | 2024-08-06 10:00:59 +0200 |
commit | 4262fb182b2b51fd0ec8bec30671eb3babe94cb0 (patch) | |
tree | 74849d50f312ab8198f03b258ac1f371a6dd37e3 | |
parent | 54a591b9b8b8e2cd49fd02be945e9e0912b874c1 (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.c | 5 |
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; |