From 2d14a237dc6659006a15747d8c87e72430574bba Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 28 Oct 2025 07:15:43 -0700 Subject: [PATCH] Fixed trying to grab the mouse when losing keyboard focus Fixes https://github.com/libsdl-org/SDL/issues/14350 --- src/events/SDL_keyboard.c | 28 ++++++++++++++-------------- src/events/SDL_windowevents.c | 7 ++++--- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c index 1443ad38ed..8f94256894 100644 --- a/src/events/SDL_keyboard.c +++ b/src/events/SDL_keyboard.c @@ -337,6 +337,20 @@ bool SDL_SetKeyboardFocus(SDL_Window *window) } } + // See if the current window has lost focus + if (keyboard->focus && keyboard->focus != window) { + SDL_SendWindowEvent(keyboard->focus, SDL_EVENT_WINDOW_FOCUS_LOST, 0, 0); + +#if !defined(SDL_PLATFORM_IOS) && !defined(SDL_PLATFORM_ANDROID) + // Ensures IME compositions are committed + if (SDL_TextInputActive(keyboard->focus)) { + if (video && video->StopTextInput) { + video->StopTextInput(video, keyboard->focus); + } + } +#endif // !SDL_PLATFORM_IOS && !SDL_PLATFORM_ANDROID + } + if (keyboard->focus && !window) { // We won't get anymore keyboard messages, so reset keyboard state SDL_ResetKeyboard(); @@ -355,20 +369,6 @@ bool SDL_SetKeyboardFocus(SDL_Window *window) } } - // See if the current window has lost focus - if (keyboard->focus && keyboard->focus != window) { - SDL_SendWindowEvent(keyboard->focus, SDL_EVENT_WINDOW_FOCUS_LOST, 0, 0); - -#if !defined(SDL_PLATFORM_IOS) && !defined(SDL_PLATFORM_ANDROID) - // Ensures IME compositions are committed - if (SDL_TextInputActive(keyboard->focus)) { - if (video && video->StopTextInput) { - video->StopTextInput(video, keyboard->focus); - } - } -#endif // !SDL_PLATFORM_IOS && !SDL_PLATFORM_ANDROID - } - keyboard->focus = window; if (keyboard->focus) { diff --git a/src/events/SDL_windowevents.c b/src/events/SDL_windowevents.c index 3fb1de1257..7d4bd15090 100644 --- a/src/events/SDL_windowevents.c +++ b/src/events/SDL_windowevents.c @@ -77,9 +77,6 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data } SDL_assert(SDL_ObjectValid(window, SDL_OBJECT_TYPE_WINDOW)); - if (window->is_destroying && windowevent != SDL_EVENT_WINDOW_DESTROYED) { - return false; - } switch (windowevent) { case SDL_EVENT_WINDOW_SHOWN: if (!(window->flags & SDL_WINDOW_HIDDEN)) { @@ -219,6 +216,10 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data break; } + if (window->is_destroying && windowevent != SDL_EVENT_WINDOW_DESTROYED) { + return false; + } + // Post the event, if desired SDL_Event event; event.type = windowevent;