Browse Source

Return false from SDL_SetWindowRelativeMouseMode() if relative mode isn't available

Fixes https://github.com/libsdl-org/SDL/issues/14388
Sam Lantinga 1 month ago
parent
commit
05887f2087
4 changed files with 22 additions and 5 deletions
  1. 4 3
      src/events/SDL_mouse.c
  2. 1 1
      src/events/SDL_mouse_c.h
  3. 8 1
      src/video/SDL_video.c
  4. 9 0
      src/video/dummy/SDL_nullvideo.c

+ 4 - 3
src/events/SDL_mouse.c

@@ -1414,15 +1414,16 @@ bool SDL_GetRelativeMouseMode(void)
     return mouse->relative_mode;
 }
 
-void SDL_UpdateRelativeMouseMode(void)
+bool SDL_UpdateRelativeMouseMode(void)
 {
     SDL_Mouse *mouse = SDL_GetMouse();
     SDL_Window *focus = SDL_GetKeyboardFocus();
     bool relative_mode = (focus && (focus->flags & SDL_WINDOW_MOUSE_RELATIVE_MODE));
 
-    if (relative_mode != mouse->relative_mode) {
-        SDL_SetRelativeMouseMode(relative_mode);
+    if (relative_mode == mouse->relative_mode) {
+        return true;
     }
+    return SDL_SetRelativeMouseMode(relative_mode);
 }
 
 bool SDL_UpdateMouseCapture(bool force_release)

+ 1 - 1
src/events/SDL_mouse_c.h

@@ -225,7 +225,7 @@ extern void SDL_PerformWarpMouseInWindow(SDL_Window *window, float x, float y, b
 // Relative mouse mode
 extern bool SDL_SetRelativeMouseMode(bool enabled);
 extern bool SDL_GetRelativeMouseMode(void);
-extern void SDL_UpdateRelativeMouseMode(void);
+extern bool SDL_UpdateRelativeMouseMode(void);
 extern void SDL_DisableMouseWarpEmulation(void);
 
 // TODO RECONNECT: Set mouse state to "zero"

+ 8 - 1
src/video/SDL_video.c

@@ -4094,8 +4094,15 @@ bool SDL_SetWindowRelativeMouseMode(SDL_Window *window, bool enabled)
     } else {
         window->flags &= ~SDL_WINDOW_MOUSE_RELATIVE_MODE;
     }
-    SDL_UpdateRelativeMouseMode();
 
+    if (!SDL_UpdateRelativeMouseMode()) {
+        if (enabled) {
+            window->flags &= ~SDL_WINDOW_MOUSE_RELATIVE_MODE;
+        } else {
+            window->flags |= SDL_WINDOW_MOUSE_RELATIVE_MODE;
+        }
+        return false;
+    }
     return true;
 }
 

+ 9 - 0
src/video/dummy/SDL_nullvideo.c

@@ -149,6 +149,13 @@ VideoBootStrap DUMMY_evdev_bootstrap = {
     false
 };
 
+#else
+
+static bool DUMMY_SetRelativeMouseMode(bool enabled)
+{
+    return true;
+}
+
 #endif // SDL_INPUT_LINUXEV
 
 bool DUMMY_VideoInit(SDL_VideoDevice *_this)
@@ -166,6 +173,8 @@ bool DUMMY_VideoInit(SDL_VideoDevice *_this)
 
 #ifdef SDL_INPUT_LINUXEV
     SDL_EVDEV_Init();
+#else
+    SDL_GetMouse()->SetRelativeMouseMode = DUMMY_SetRelativeMouseMode;
 #endif
 
     // We're done!