Skip to content

Commit

Permalink
x11: Check for button presses before clearing an XInput2 pointer grab
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Kontrabant committed Jun 30, 2024
1 parent ede4483 commit 1f0bc4b
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions src/video/x11/SDL_x11window.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down

0 comments on commit 1f0bc4b

Please sign in to comment.