From 7729a8b5c34a0d12af1bee091d38c85bc2b1f323 Mon Sep 17 00:00:00 2001 From: Frank Praznik Date: Tue, 23 Apr 2024 10:54:42 -0400 Subject: [PATCH] x11: Don't try to capture mouse input via X when XInput2 is in use Trying to capture the pointer via XGrabPointer() when XInput2 is in use will always fail with 'AlreadyGrabbed', since the pointer is already grabbed by XInput2. --- src/video/x11/SDL_x11mouse.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/video/x11/SDL_x11mouse.c b/src/video/x11/SDL_x11mouse.c index dc47353757..46be54917c 100644 --- a/src/video/x11/SDL_x11mouse.c +++ b/src/video/x11/SDL_x11mouse.c @@ -391,13 +391,19 @@ static int X11_CaptureMouse(SDL_Window *window) if (window) { SDL_WindowData *data = window->driverdata; - const unsigned int mask = ButtonPressMask | ButtonReleaseMask | PointerMotionMask | FocusChangeMask; - Window confined = (data->mouse_grabbed ? data->xwindow : None); - const int rc = X11_XGrabPointer(display, data->xwindow, False, - mask, GrabModeAsync, GrabModeAsync, - confined, None, CurrentTime); - if (rc != GrabSuccess) { - return SDL_SetError("X server refused mouse capture"); + + /* If XInput2 is handling the pointer input, non-confinement grabs will always fail with 'AlreadyGrabbed', + * since the pointer is being grabbed by XInput2. + */ + if (!data->xinput2_mouse_enabled || data->mouse_grabbed) { + const unsigned int mask = ButtonPressMask | ButtonReleaseMask | PointerMotionMask | FocusChangeMask; + Window confined = (data->mouse_grabbed ? data->xwindow : None); + const int rc = X11_XGrabPointer(display, data->xwindow, False, + mask, GrabModeAsync, GrabModeAsync, + confined, None, CurrentTime); + if (rc != GrabSuccess) { + return SDL_SetError("X server refused mouse capture"); + } } } else if (mouse_focus) { SDL_UpdateWindowGrab(mouse_focus);