From 05887f2087a190bced3daf96284d74f56d64c90d Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Mon, 3 Nov 2025 10:42:40 -0800
Subject: [PATCH] Return false from SDL_SetWindowRelativeMouseMode() if
relative mode isn't available
Fixes https://github.com/libsdl-org/SDL/issues/14388
---
src/events/SDL_mouse.c | 7 ++++---
src/events/SDL_mouse_c.h | 2 +-
src/video/SDL_video.c | 9 ++++++++-
src/video/dummy/SDL_nullvideo.c | 9 +++++++++
4 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c
index e3fa3fcec06e7..85f2939cda4f3 100644
--- a/src/events/SDL_mouse.c
+++ b/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)
diff --git a/src/events/SDL_mouse_c.h b/src/events/SDL_mouse_c.h
index 30ec51d7b607c..42c820b0233e4 100644
--- a/src/events/SDL_mouse_c.h
+++ b/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"
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index a622fa21ec919..21def3c80bb29 100644
--- a/src/video/SDL_video.c
+++ b/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;
}
diff --git a/src/video/dummy/SDL_nullvideo.c b/src/video/dummy/SDL_nullvideo.c
index 7be4ae1c6a824..611a2023160a1 100644
--- a/src/video/dummy/SDL_nullvideo.c
+++ b/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!