Fixed trying to grab the mouse when losing keyboard focus
Fixes https://github.com/libsdl-org/SDL/issues/14350
(cherry picked from commit 2d14a237dc)
This commit is contained in:
1 parent
16d9f7316f
commit
4fc5405f16
2 files changed
+16
-15
No files matched your search
+12
-12
@@ -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) {
|
if (keyboard->focus && !window) {
|
||||||
// We won't get anymore keyboard messages, so reset keyboard state
|
// We won't get anymore keyboard messages, so reset keyboard state
|
||||||
SDL_ResetKeyboard();
|
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;
|
keyboard->focus = window;
|
||||||
|
|
||||||
if (keyboard->focus) {
|
if (keyboard->focus) {
|
||||||
|
|||||||
@@ -77,9 +77,6 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data
|
|||||||
}
|
}
|
||||||
SDL_assert(SDL_ObjectValid(window, SDL_OBJECT_TYPE_WINDOW));
|
SDL_assert(SDL_ObjectValid(window, SDL_OBJECT_TYPE_WINDOW));
|
||||||
|
|
||||||
if (window->is_destroying && windowevent != SDL_EVENT_WINDOW_DESTROYED) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
switch (windowevent) {
|
switch (windowevent) {
|
||||||
case SDL_EVENT_WINDOW_SHOWN:
|
case SDL_EVENT_WINDOW_SHOWN:
|
||||||
if (!(window->flags & SDL_WINDOW_HIDDEN)) {
|
if (!(window->flags & SDL_WINDOW_HIDDEN)) {
|
||||||
@@ -212,6 +209,10 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (window->is_destroying && windowevent != SDL_EVENT_WINDOW_DESTROYED) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Post the event, if desired
|
// Post the event, if desired
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
event.type = windowevent;
|
event.type = windowevent;
|
||||||
|
|||||||
Reference in new issue
Block a user