From 632aca29453cf09a44bd45497363607a106634f8 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 1 Oct 2021 16:17:38 -0700 Subject: [PATCH] Window input focus is based on WM_SETFOCUS and WM_KILLFOCUS as WM_ACTIVATE doesn't necessarily imply focus. Hopefully resolves https://github.com/libsdl-org/SDL/issues/4450 and https://github.com/libsdl-org/SDL/pull/4293 --- src/video/windows/SDL_windowsevents.c | 88 +++++++++++++++------------ src/video/windows/SDL_windowswindow.c | 11 +--- 2 files changed, 50 insertions(+), 49 deletions(-) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index 82de3224d..77398c9fc 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -663,15 +663,10 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_ACTIVATE: { - POINT cursorPos; BOOL minimized; minimized = HIWORD(wParam); if (!minimized && (LOWORD(wParam) != WA_INACTIVE)) { - /* Don't mark the window as shown if it's activated before being shown */ - if (!IsWindowVisible(hwnd)) { - break; - } if (LOWORD(wParam) == WA_CLICKACTIVE) { SDL_bool swapButtons = GetSystemMetrics(SM_SWAPBUTTON) != 0; if (GetAsyncKeyState(VK_LBUTTON)) { @@ -692,46 +687,59 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) } SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_SHOWN, 0, 0); - if (SDL_GetKeyboardFocus() != data->window) { - SDL_SetKeyboardFocus(data->window); - } - - GetCursorPos(&cursorPos); - ScreenToClient(hwnd, &cursorPos); - SDL_SendMouseMotion(data->window, 0, 0, cursorPos.x, cursorPos.y); - - WIN_CheckAsyncMouseRelease(data); - WIN_UpdateClipCursor(data->window); - - /* - * FIXME: Update keyboard state - */ - WIN_CheckClipboardUpdate(data->videodata); - - SDL_ToggleModState(KMOD_CAPS, (GetKeyState(VK_CAPITAL) & 0x0001) != 0); - SDL_ToggleModState(KMOD_NUM, (GetKeyState(VK_NUMLOCK) & 0x0001) != 0); - SDL_ToggleModState(KMOD_SCROLL, (GetKeyState(VK_SCROLL) & 0x0001) != 0); - } else { - RECT rect; - - data->in_window_deactivation = SDL_TRUE; - - if (SDL_GetKeyboardFocus() == data->window) { - SDL_SetKeyboardFocus(NULL); - WIN_ResetDeadKeys(); - } - - if (GetClipCursor(&rect) && SDL_memcmp(&rect, &data->cursor_clipped_rect, sizeof(rect)) == 0) { - ClipCursor(NULL); - SDL_zero(data->cursor_clipped_rect); - } - - data->in_window_deactivation = SDL_FALSE; } } returnCode = 0; break; + case WM_SETFOCUS: + { + POINT cursorPos; + + if (SDL_GetKeyboardFocus() != data->window) { + SDL_SetKeyboardFocus(data->window); + } + + GetCursorPos(&cursorPos); + ScreenToClient(hwnd, &cursorPos); + SDL_SendMouseMotion(data->window, 0, 0, cursorPos.x, cursorPos.y); + + WIN_CheckAsyncMouseRelease(data); + WIN_UpdateClipCursor(data->window); + + /* + * FIXME: Update keyboard state + */ + WIN_CheckClipboardUpdate(data->videodata); + + SDL_ToggleModState(KMOD_CAPS, (GetKeyState(VK_CAPITAL) & 0x0001) != 0); + SDL_ToggleModState(KMOD_NUM, (GetKeyState(VK_NUMLOCK) & 0x0001) != 0); + SDL_ToggleModState(KMOD_SCROLL, (GetKeyState(VK_SCROLL) & 0x0001) != 0); + } + returnCode = 0; + break; + + case WM_KILLFOCUS: + { + RECT rect; + + data->in_window_deactivation = SDL_TRUE; + + if (SDL_GetKeyboardFocus() == data->window) { + SDL_SetKeyboardFocus(NULL); + WIN_ResetDeadKeys(); + } + + if (GetClipCursor(&rect) && SDL_memcmp(&rect, &data->cursor_clipped_rect, sizeof(rect)) == 0) { + ClipCursor(NULL); + SDL_zero(data->cursor_clipped_rect); + } + + data->in_window_deactivation = SDL_FALSE; + } + returnCode = 0; + break; + case WM_POINTERUPDATE: { data->last_pointer_update = lParam; diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index 75fe64cac..738d08cc9 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -281,15 +281,8 @@ SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, HWND parent, SDL_bool cre } if (GetFocus() == hwnd) { window->flags |= SDL_WINDOW_INPUT_FOCUS; - SDL_SetKeyboardFocus(data->window); - - if (window->flags & SDL_WINDOW_MOUSE_GRABBED) { - RECT rect; - GetClientRect(hwnd, &rect); - ClientToScreen(hwnd, (LPPOINT) & rect); - ClientToScreen(hwnd, (LPPOINT) & rect + 1); - ClipCursor(&rect); - } + SDL_SetKeyboardFocus(window); + WIN_UpdateClipCursor(window); } /* Enable multi-touch */