Jelajahi Sumber

Fixed trying to grab the mouse when losing keyboard focus

Fixes https://github.com/libsdl-org/SDL/issues/14350

(cherry picked from commit 2d14a237dc6659006a15747d8c87e72430574bba)
Sam Lantinga 4 bulan lalu
induk
melakukan
4fc5405f16
2 mengubah file dengan 16 tambahan dan 15 penghapusan
  1. 12 12
      src/events/SDL_keyboard.c
  2. 4 3
      src/events/SDL_windowevents.c

+ 12 - 12
src/events/SDL_keyboard.c

@@ -333,6 +333,18 @@ 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);
+
+        // Ensures IME compositions are committed
+        if (SDL_TextInputActive(keyboard->focus)) {
+            if (video && video->StopTextInput) {
+                video->StopTextInput(video, keyboard->focus);
+            }
+        }
+    }
+
     if (keyboard->focus && !window) {
         // We won't get anymore keyboard messages, so reset keyboard state
         SDL_ResetKeyboard();
@@ -351,18 +363,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);
-
-        // Ensures IME compositions are committed
-        if (SDL_TextInputActive(keyboard->focus)) {
-            if (video && video->StopTextInput) {
-                video->StopTextInput(video, keyboard->focus);
-            }
-        }
-    }
-
     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)) {
@@ -212,6 +209,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;