From 7fb5e00ad86ca862024ad7be83c670aacf805d09 Mon Sep 17 00:00:00 2001 From: Liu Heng 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: --- 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 cd2046e1d..447627dc6 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