x11: Check for button presses before clearing an XInput2 pointer grab

XInput2 will grab the pointer on button presses, which causes the grab attempt to fail and ultimately timeout since the pointer is already grabbed, however, ungrabbing the pointer when no buttons are pressed and the pointer is outside the window can generate enter/leave notify events, which result in further calls of the grab function. The end result is an infinite loop of grab/ungrab attempts generating enter/leave events. This causes a hang in testautomation when creating a window with the grabbed flag if the pointer is not positioned within window bounds.

Check the button state and only ungrab if a mouse button is in the pressed state.
This commit is contained in:
Frank Praznik 2024-06-30 12:16:50 -04:00
parent ede4483420
commit 1f0bc4b808
No known key found for this signature in database
1 changed files with 4 additions and 3 deletions

View File

@ -1856,10 +1856,11 @@ int X11_SetWindowMouseGrab(SDL_VideoDevice *_this, SDL_Window *window, SDL_bool
}
/* If XInput2 is enabled, it will grab the pointer on button presses,
* which results in XGrabPointer returning AlreadyGrabbed. Clear any
* existing grabs before attempting the confinement grab.
* which results in XGrabPointer returning AlreadyGrabbed. If buttons
* are currently pressed, clear any existing grabs before attempting
* the confinement grab.
*/
if (data->xinput2_mouse_enabled) {
if (data->xinput2_mouse_enabled && SDL_GetMouseState(NULL, NULL)) {
X11_XUngrabPointer(display, CurrentTime);
}