From 05887f2087a190bced3daf96284d74f56d64c90d Mon Sep 17 00:00:00 2001 From: Sam Lantinga 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 e3fa3fcec0..85f2939cda 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 30ec51d7b6..42c820b023 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 a622fa21ec..21def3c80b 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 7be4ae1c6a..611a202316 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!