From c2ed58db7b8a99127d375590e94709235310548d Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 25 Apr 2025 16:21:44 -0700 Subject: [PATCH] windows: Fix stale zoom/iconic state in WM_WINDOWPOSCHANGED handler - IsIconic/IsZoomed must be checked after sending SDL_EVENT_WINDOW_SHOWN as that may trigger window operations if any are pending from when the window was hidden. e.g. the window may be shown, which triggers SDL_MaximizeWindow and a new WM_WINDOWPOSCHANGED where SDL_EVENT_WINDOW_MAXIMIZED is sent, then control returns to the original WM_WINDOWPOSCHANGED which would not think the window is zoomed and send SDL_EVENT_WINDOW_RESTORED. --- src/video/windows/SDL_windowsevents.c | 9 +++++++-- test/msdf_font.csv | 0 2 files changed, 7 insertions(+), 2 deletions(-) mode change 100755 => 100644 test/msdf_font.csv diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index a84f492d90..e8dae32b63 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -1718,8 +1718,8 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara SDL_Window *win; const SDL_DisplayID original_displayID = data->last_displayID; const WINDOWPOS *windowpos = (WINDOWPOS *)lParam; - const bool iconic = IsIconic(hwnd); - const bool zoomed = IsZoomed(hwnd); + bool iconic; + bool zoomed; RECT rect; int x, y; int w, h; @@ -1728,6 +1728,11 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_SHOWN, 0, 0); } + // These must be set after sending SDL_EVENT_WINDOW_SHOWN as that may apply pending + // window operations that change the window state. + iconic = IsIconic(hwnd); + zoomed = IsZoomed(hwnd); + if (iconic) { SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_MINIMIZED, 0, 0); } else if (zoomed) { diff --git a/test/msdf_font.csv b/test/msdf_font.csv old mode 100755 new mode 100644