On Thu, Jun 27, 2019 at 04:30:11PM +0200, Rémi Bernon wrote:
XWarpPointer will always succeed regardless of grabs. If the pointer is already grabbed by some other application, we should not ask to warp it.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com
dlls/winex11.drv/mouse.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index f737a306a56..c3a9a027957 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -1430,6 +1430,18 @@ BOOL CDECL X11DRV_SetCursorPos( INT x, INT y ) struct x11drv_thread_data *data = x11drv_init_thread_data(); POINT pos = virtual_screen_to_root( x, y );
- if (!clipping_cursor &&
XGrabPointer( data->display, root_window, False,
PointerMotionMask | ButtonPressMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, root_window, None, CurrentTime ) != GrabSuccess)
- {
WARN( "refusing to warp pointer to %u, %u without exclusive grab\n", pos.x, pos.y );
return FALSE;
- }
- if (!clipping_cursor)
XUngrabPointer( data->display, CurrentTime );
Shouldn't we hold onto the grab until we call XWarpPointer(), in case something else grabs it in between?
XWarpPointer( data->display, root_window, root_window, 0, 0, 0, 0, pos.x, pos.y ); data->warp_serial = NextRequest( data->display ); XNoOp( data->display );