Moved focus click check into WIN_UpdateFocus() so we have the correct state when setting keyboard focus

Fixes https://github.com/libsdl-org/SDL/issues/4817
This commit is contained in:
Sam Lantinga 2021-10-06 09:09:39 -07:00
parent 1ec409c214
commit dd95c9c8a2
1 changed files with 25 additions and 33 deletions

View File

@ -374,13 +374,34 @@ WIN_UpdateFocus(SDL_Window *window)
{ {
SDL_WindowData *data = (SDL_WindowData *) window->driverdata; SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
HWND hwnd = data->hwnd; HWND hwnd = data->hwnd;
SDL_bool had_focus = (SDL_GetKeyboardFocus() == window) ? SDL_TRUE : SDL_FALSE;
SDL_bool has_focus = (GetForegroundWindow() == hwnd) ? SDL_TRUE : SDL_FALSE;
if (had_focus == has_focus) {
return;
}
if (GetForegroundWindow() == hwnd) { if (GetForegroundWindow() == hwnd) {
POINT cursorPos; POINT cursorPos;
if (SDL_GetKeyboardFocus() != window) { SDL_bool swapButtons = GetSystemMetrics(SM_SWAPBUTTON) != 0;
SDL_SetKeyboardFocus(window); if (GetAsyncKeyState(VK_LBUTTON)) {
data->focus_click_pending |= !swapButtons ? SDL_BUTTON_LMASK : SDL_BUTTON_RMASK;
} }
if (GetAsyncKeyState(VK_RBUTTON)) {
data->focus_click_pending |= !swapButtons ? SDL_BUTTON_RMASK : SDL_BUTTON_LMASK;
}
if (GetAsyncKeyState(VK_MBUTTON)) {
data->focus_click_pending |= SDL_BUTTON_MMASK;
}
if (GetAsyncKeyState(VK_XBUTTON1)) {
data->focus_click_pending |= SDL_BUTTON_X1MASK;
}
if (GetAsyncKeyState(VK_XBUTTON2)) {
data->focus_click_pending |= SDL_BUTTON_X2MASK;
}
SDL_SetKeyboardFocus(window);
GetCursorPos(&cursorPos); GetCursorPos(&cursorPos);
ScreenToClient(hwnd, &cursorPos); ScreenToClient(hwnd, &cursorPos);
@ -403,10 +424,8 @@ WIN_UpdateFocus(SDL_Window *window)
data->in_window_deactivation = SDL_TRUE; data->in_window_deactivation = SDL_TRUE;
if (SDL_GetKeyboardFocus() == window) {
SDL_SetKeyboardFocus(NULL); SDL_SetKeyboardFocus(NULL);
WIN_ResetDeadKeys(); WIN_ResetDeadKeys();
}
if (GetClipCursor(&rect) && SDL_memcmp(&rect, &data->cursor_clipped_rect, sizeof(rect)) == 0) { if (GetClipCursor(&rect) && SDL_memcmp(&rect, &data->cursor_clipped_rect, sizeof(rect)) == 0) {
ClipCursor(NULL); ClipCursor(NULL);
@ -716,34 +735,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
case WM_ACTIVATE: case WM_ACTIVATE:
{ {
BOOL minimized;
minimized = HIWORD(wParam);
if (!minimized && (LOWORD(wParam) != WA_INACTIVE)) {
if (LOWORD(wParam) == WA_CLICKACTIVE) {
SDL_bool swapButtons = GetSystemMetrics(SM_SWAPBUTTON) != 0;
if (GetAsyncKeyState(VK_LBUTTON)) {
data->focus_click_pending |= !swapButtons ? SDL_BUTTON_LMASK : SDL_BUTTON_RMASK;
} }
if (GetAsyncKeyState(VK_RBUTTON)) {
data->focus_click_pending |= !swapButtons ? SDL_BUTTON_RMASK : SDL_BUTTON_LMASK;
}
if (GetAsyncKeyState(VK_MBUTTON)) {
data->focus_click_pending |= SDL_BUTTON_MMASK;
}
if (GetAsyncKeyState(VK_XBUTTON1)) {
data->focus_click_pending |= SDL_BUTTON_X1MASK;
}
if (GetAsyncKeyState(VK_XBUTTON2)) {
data->focus_click_pending |= SDL_BUTTON_X2MASK;
}
}
SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_SHOWN, 0, 0);
}
}
returnCode = 0;
break; break;
case WM_POINTERUPDATE: case WM_POINTERUPDATE: