win32: Restore the base size of a window when leaving fullscreen

Always restore the base floating size of a window before possibly entering the maximized state, as base size can be lost during the fullscreen transition, resulting in the window de-maximizing to the wrong size.
This commit is contained in:
Frank Praznik
2025-01-20 14:04:33 -05:00
parent 075c0337cd
commit 6449339ae3
3 changed files with 26 additions and 20 deletions

View File

@@ -1633,6 +1633,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
break; break;
} }
if (!data->disable_move_size_events) {
if (GetClientRect(hwnd, &rect) && !WIN_IsRectEmpty(&rect)) { if (GetClientRect(hwnd, &rect) && !WIN_IsRectEmpty(&rect)) {
ClientToScreen(hwnd, (LPPOINT) &rect); ClientToScreen(hwnd, (LPPOINT) &rect);
ClientToScreen(hwnd, (LPPOINT) &rect + 1); ClientToScreen(hwnd, (LPPOINT) &rect + 1);
@@ -1651,6 +1652,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_RESIZED, w, h); SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_RESIZED, w, h);
} }
}
WIN_UpdateClipCursor(data->window); WIN_UpdateClipCursor(data->window);

View File

@@ -1377,28 +1377,31 @@ SDL_FullscreenResult WIN_SetWindowFullscreen(SDL_VideoDevice *_this, SDL_Window
https://bugzilla.libsdl.org/show_bug.cgi?id=3215 can reproduce! https://bugzilla.libsdl.org/show_bug.cgi?id=3215 can reproduce!
*/ */
if (data->windowed_mode_was_maximized && !data->in_window_deactivation) { if (data->windowed_mode_was_maximized && !data->in_window_deactivation) {
style |= WS_MAXIMIZE;
enterMaximized = true; enterMaximized = true;
data->disable_move_size_events = true;
} }
menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL); menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL);
WIN_AdjustWindowRectWithStyle(window, style, styleEx, menu, WIN_AdjustWindowRectWithStyle(window, style, styleEx, menu,
&x, &y, &x, &y,
&w, &h, &w, &h,
data->windowed_mode_was_maximized ? SDL_WINDOWRECT_WINDOWED : SDL_WINDOWRECT_FLOATING); SDL_WINDOWRECT_FLOATING);
data->windowed_mode_was_maximized = false; data->windowed_mode_was_maximized = false;
} }
/* Always reset the window to the base floating size before possibly re-applying the maximized state,
* otherwise, the base floating size can seemingly be lost in some cases.
*/
SetWindowLong(hwnd, GWL_STYLE, style); SetWindowLong(hwnd, GWL_STYLE, style);
data->expected_resize = true; data->expected_resize = true;
if (!enterMaximized) {
SetWindowPos(hwnd, top, x, y, w, h, data->copybits_flag | SWP_NOACTIVATE); SetWindowPos(hwnd, top, x, y, w, h, data->copybits_flag | SWP_NOACTIVATE);
} else { data->expected_resize = false;
data->disable_move_size_events = false;
if (enterMaximized) {
WIN_MaximizeWindow(_this, window); WIN_MaximizeWindow(_this, window);
} }
data->expected_resize = false;
#ifdef HIGHDPI_DEBUG #ifdef HIGHDPI_DEBUG
SDL_Log("WIN_SetWindowFullscreen: %d finished. Set window to %d,%d, %dx%d", (int)fullscreen, x, y, w, h); SDL_Log("WIN_SetWindowFullscreen: %d finished. Set window to %d,%d, %dx%d", (int)fullscreen, x, y, w, h);
#endif #endif

View File

@@ -82,6 +82,7 @@ struct SDL_WindowData
bool windowed_mode_was_maximized; bool windowed_mode_was_maximized;
bool in_window_deactivation; bool in_window_deactivation;
bool force_resizable; bool force_resizable;
bool disable_move_size_events;
RECT initial_size_rect; RECT initial_size_rect;
RECT cursor_clipped_rect; // last successfully committed clipping rect for this window RECT cursor_clipped_rect; // last successfully committed clipping rect for this window
RECT cursor_ctrlock_rect; // this is Windows-specific, but probably does not need to be per-window RECT cursor_ctrlock_rect; // this is Windows-specific, but probably does not need to be per-window