Browse Source

Fixed trying to grab the mouse when losing keyboard focus

Fixes https://github.com/libsdl-org/SDL/issues/14350
Sam Lantinga 1 month ago
parent
commit
2d14a237dc
2 changed files with 18 additions and 17 deletions
  1. 14 14
      src/events/SDL_keyboard.c
  2. 4 3
      src/events/SDL_windowevents.c

+ 14 - 14
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) {

+ 4 - 3
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;