summaryrefslogtreecommitdiffstats
path: root/x11-xwayland/2113.patch
blob: d867629225728d75ffaac59c50464ad6f77356dd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
From 7fb5e00ad86ca862024ad7be83c670aacf805d09 Mon Sep 17 00:00:00 2001
From: Liu Heng <liuhenga@uniontech.com>
Date: Fri, 12 Dec 2025 19:34:16 +0800
Subject: [PATCH] xwayland: Fix incorrect pointer coordinates in enter events

Xwayland was sending incorrect pointer coordinates to X clients on
pointer enter events.

This was caused by calling CheckMotion() with a NULL event, which
prevented the pointer sprite hot coordinates from being updated
properly.

Fix this by constructing a proper DeviceEvent of type ET_Enter in
pointer_handle_enter, initializing it with the current timestamp
and EVENT_SOURCE_FOCUS, and passing it to CheckMotion() instead
of NULL.

This ensures the pointer sprite coordinates are correctly updated
when the pointer enters a window.

Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2113>
---
 hw/xwayland/xwayland-input.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index cd2046e1d4..447627dc63 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -528,6 +528,7 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
     int dx, dy;
     ScreenPtr pScreen = xwl_screen->screen;
     ValuatorMask mask;
+    DeviceEvent enter;
 
     /* There's a race here where if we create and then immediately
      * destroy a surface, we might end up in a state where the Wayland
@@ -558,8 +559,10 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
     (*pScreen->SetCursorPosition) (dev, pScreen, dx + sx, dy + sy, TRUE);
 
     miPointerInvalidateSprite(master);
+    init_device_event(&enter, dev, currentTime.milliseconds, EVENT_SOURCE_FOCUS);
+    enter.type = ET_Enter;
 
-    CheckMotion(NULL, master);
+    CheckMotion(&enter, master);
 
     /* Ideally, X clients shouldn't see these button releases.  When
      * the pointer leaves a window with buttons down, it means that
-- 
GitLab