winex11.drv: Only call XWarpPointer if we can get exclusive pointer grab.

XWarpPointer will always succeed, regardless of grabs, so 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>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Rémi Bernon 2019-08-30 12:18:03 +02:00 committed by Alexandre Julliard
parent ae4651b7ff
commit 74efb3e872
1 changed files with 13 additions and 0 deletions

View File

@ -1467,8 +1467,21 @@ BOOL CDECL X11DRV_SetCursorPos( INT x, INT y )
return FALSE;
}
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;
}
XWarpPointer( data->display, root_window, root_window, 0, 0, 0, 0, pos.x, pos.y );
data->warp_serial = NextRequest( data->display );
if (!clipping_cursor)
XUngrabPointer( data->display, CurrentTime );
XNoOp( data->display );
XFlush( data->display ); /* avoids bad mouse lag in games that do their own mouse warping */
TRACE( "warped to %d,%d serial %lu\n", x, y, data->warp_serial );