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

From dd95c9c8a23b3c1bb3081e802fe63d00978950e9 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Wed, 6 Oct 2021 09:09:39 -0700
Subject: [PATCH] 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
---
 src/video/windows/SDL_windowsevents.c | 58 ++++++++++++---------------
 1 file changed, 25 insertions(+), 33 deletions(-)

diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c
index 1a7fefebb4..bb8504c460 100644
--- a/src/video/windows/SDL_windowsevents.c
+++ b/src/video/windows/SDL_windowsevents.c
@@ -374,13 +374,34 @@ WIN_UpdateFocus(SDL_Window *window)
 {
     SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
     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) {
         POINT cursorPos;
 
-        if (SDL_GetKeyboardFocus() != window) {
-            SDL_SetKeyboardFocus(window);
+        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_SetKeyboardFocus(window);
 
         GetCursorPos(&cursorPos);
         ScreenToClient(hwnd, &cursorPos);
@@ -403,10 +424,8 @@ WIN_UpdateFocus(SDL_Window *window)
 
         data->in_window_deactivation = SDL_TRUE;
 
-        if (SDL_GetKeyboardFocus() == window) {
-            SDL_SetKeyboardFocus(NULL);
-            WIN_ResetDeadKeys();
-        }
+        SDL_SetKeyboardFocus(NULL);
+        WIN_ResetDeadKeys();
 
         if (GetClipCursor(&rect) && SDL_memcmp(&rect, &data->cursor_clipped_rect, sizeof(rect)) == 0) {
             ClipCursor(NULL);
@@ -716,34 +735,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
     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;
 
     case WM_POINTERUPDATE: