From: Etaash Mathamsetty <etaash.mathamsetty@gmail.com> --- dlls/winewayland.drv/wayland_pointer.c | 11 +++++++++++ dlls/winewayland.drv/waylanddrv.h | 1 + 2 files changed, 12 insertions(+) diff --git a/dlls/winewayland.drv/wayland_pointer.c b/dlls/winewayland.drv/wayland_pointer.c index 6a8e4ea34f1..b2edc45405e 100644 --- a/dlls/winewayland.drv/wayland_pointer.c +++ b/dlls/winewayland.drv/wayland_pointer.c @@ -1070,6 +1070,8 @@ BOOL WAYLAND_SetCursorPos(INT x, INT y) return FALSE; } pointer->pending_warp = TRUE; + pointer->warp_x = x; + pointer->warp_y = y; pthread_mutex_unlock(&pointer->mutex); TRACE("warping to %d,%d\n", x, y); @@ -1097,6 +1099,15 @@ BOOL WAYLAND_ClipCursor(const RECT *clip, BOOL reset) NtUserGetCursorPos(&cursor_pos); hwnd = NtUserGetForegroundWindow(); + /* the cursor pos may have changed between SetCursorPos and ClipCursor calls */ + pthread_mutex_lock(&pointer->mutex); + if (pointer->pending_warp) + { + cursor_pos.x = pointer->warp_x; + cursor_pos.y = pointer->warp_y; + } + pthread_mutex_unlock(&pointer->mutex); + if (!(data = wayland_win_data_get(hwnd))) return FALSE; if ((surface = data->wayland_surface)) { diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index 86a0d2fa618..954cbf3ba28 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -131,6 +131,7 @@ struct wayland_pointer HWND focused_hwnd; HWND constraint_hwnd; BOOL pending_warp; + INT warp_x, warp_y; BOOL relative_mode; uint32_t enter_serial; uint32_t button_serial; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11117