From 7729a8b5c34a0d12af1bee091d38c85bc2b1f323 Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
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 dc47353757925..46be54917c589 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);