From 2d14a237dc6659006a15747d8c87e72430574bba Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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 1443ad38ed601..8f94256894cad 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 3fb1de1257a9d..7d4bd150901b4 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;