x11: Properly check for XInput2 support before using it. This specifically fixes a crash in X11_WarpMouseInternal if XInput2 was missing at runtime, but also cleans up a few other existing checks. Fixes #8378. (cherry picked from commit 82f54af6177f3d50be1db42a528027ada6ea0a20) (cherry picked from commit 2849ca404e040245e90fdf7b81e3878aa31204b5)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
diff --git a/src/video/x11/SDL_x11mouse.c b/src/video/x11/SDL_x11mouse.c
index 978a305..7c3d202 100644
--- a/src/video/x11/SDL_x11mouse.c
+++ b/src/video/x11/SDL_x11mouse.c
@@ -330,13 +330,16 @@ static void WarpMouseInternal(Window xwindow, const int x, const int y)
Display *display = videodata->display;
#if SDL_VIDEO_DRIVER_X11_XINPUT2
int deviceid = 0;
- /* It seems XIWarpPointer() doesn't work correctly on multi-head setups:
- * https://developer.blender.org/rB165caafb99c6846e53d11c4e966990aaffc06cea
- */
- if (ScreenCount(display) == 1) {
- X11_XIGetClientPointer(display, None, &deviceid);
+ if (X11_Xinput2IsInitialized()) {
+ /* It seems XIWarpPointer() doesn't work correctly on multi-head setups:
+ * https://developer.blender.org/rB165caafb99c6846e53d11c4e966990aaffc06cea
+ */
+ if (ScreenCount(display) == 1) {
+ X11_XIGetClientPointer(display, None, &deviceid);
+ }
}
if (deviceid != 0) {
+ SDL_assert(SDL_X11_HAVE_XINPUT2);
X11_XIWarpPointer(display, deviceid, None, xwindow, 0.0, 0.0, 0, 0, (double)x, (double)y);
} else
#endif
@@ -369,14 +372,7 @@ static int X11_WarpMouseGlobal(int x, int y)
static int X11_SetRelativeMouseMode(SDL_bool enabled)
{
-#if SDL_VIDEO_DRIVER_X11_XINPUT2
- if (X11_Xinput2IsInitialized()) {
- return 0;
- }
-#else
- SDL_Unsupported();
-#endif
- return -1;
+ return X11_Xinput2IsInitialized() ? 0 : SDL_Unsupported();
}
static int X11_CaptureMouse(SDL_Window *window)
@@ -414,12 +410,9 @@ static Uint32 X11_GetGlobalMouseState(int *x, int *y)
/* !!! FIXME: should we XSync() here first? */
-#if !SDL_VIDEO_DRIVER_X11_XINPUT2
- videodata->global_mouse_changed = SDL_TRUE;
-#else
- if (!SDL_X11_HAVE_XINPUT2)
+ if (!X11_Xinput2IsInitialized()) {
videodata->global_mouse_changed = SDL_TRUE;
-#endif
+ }
/* check if we have this cached since XInput last saw the mouse move. */
/* !!! FIXME: can we just calculate this from XInput's events? */