diff options
Diffstat (limited to 'source/x/xorg-server-xwayland/987.patch')
-rw-r--r-- | source/x/xorg-server-xwayland/987.patch | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/source/x/xorg-server-xwayland/987.patch b/source/x/xorg-server-xwayland/987.patch new file mode 100644 index 000000000..2133ee171 --- /dev/null +++ b/source/x/xorg-server-xwayland/987.patch @@ -0,0 +1,50 @@ +From 914e2276df86b7e93ca37e4e87346d38cb80db05 Mon Sep 17 00:00:00 2001 +From: Olivier Fourdan <ofourdan@redhat.com> +Date: Mon, 24 Oct 2022 09:24:01 +0200 +Subject: [PATCH] xwayland/input: Do not ignore leave events + +Commit 8a5f3ddb2 ("set tag on our surface") introduced the use of tags +to differentiate our own surfaces, and commit a1d14aa8c ("Clear the +"xwl-window" tag on unrealize") removed the tags before the surfaces are +actually destroyed. + +Xwayland would then rely on these tags on the surface to decide whether +to ignore or to process the Wayland event in various places. + +However, in doing so, it also checked for the tag on keyboard leave +events. + +As a result, if the keyboard leave events is received after the X11 +window is unrealized, keyboard_handle_leave() would not queue the +LeaveNotify events for the DIX to proceed, and the key repeat would +kick in and repeat the key event indefinitely. + +To avoid the issue, process events regardless of the tag as before +in keyboard_handle_leave(). + +Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> +Fixes: 8a5f3ddb2 - "xwayland: set tag on our surface" +Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1395 +Tested-by: Renan Guilherme Lebre Ramos <japareaggae@gmail.com> +Tested-by: Stefan Dirsch <sndirsch@suse.de> +--- + hw/xwayland/xwayland-input.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c +index 240eb0139..9eda1ef71 100644 +--- a/hw/xwayland/xwayland-input.c ++++ b/hw/xwayland/xwayland-input.c +@@ -1147,9 +1147,6 @@ keyboard_handle_leave(void *data, struct wl_keyboard *keyboard, + struct xwl_seat *xwl_seat = data; + uint32_t *k; + +- if (surface != NULL && !is_surface_from_xwl_window(surface)) +- return; +- + xwl_seat->xwl_screen->serial = serial; + + wl_array_for_each(k, &xwl_seat->keys) +-- +GitLab + |