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

Fixes https://github.com/libsdl-org/SDL/issues/14388
This commit is contained in:
Sam Lantinga
2025-11-03 10:42:40 -08:00
parent eedc0b19fd
commit 05887f2087
4 changed files with 22 additions and 5 deletions

View File

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

View File

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

View File

@@ -4094,8 +4094,15 @@ bool SDL_SetWindowRelativeMouseMode(SDL_Window *window, bool enabled)
} else { } else {
window->flags &= ~SDL_WINDOW_MOUSE_RELATIVE_MODE; 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; return true;
} }

View File

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