Skip to content

Commit 47f71f6

Browse files
committed
Merge pull request #98631 from bruvzg/fix_fs_restore
[Windows] Fix restoring fullscreen window.
2 parents f4c9392 + bf9f78c commit 47f71f6

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

platform/windows/display_server_windows.cpp

+43-5
Original file line numberDiff line numberDiff line change
@@ -2206,23 +2206,28 @@ void DisplayServerWindows::window_set_mode(WindowMode p_mode, WindowID p_window)
22062206
ERR_FAIL_COND(!windows.has(p_window));
22072207
WindowData &wd = windows[p_window];
22082208

2209+
bool was_fullscreen = wd.fullscreen;
2210+
wd.was_fullscreen_pre_min = false;
2211+
22092212
if (wd.fullscreen && p_mode != WINDOW_MODE_FULLSCREEN && p_mode != WINDOW_MODE_EXCLUSIVE_FULLSCREEN) {
22102213
RECT rect;
22112214

22122215
wd.fullscreen = false;
22132216
wd.multiwindow_fs = false;
2214-
wd.maximized = wd.was_maximized;
2217+
2218+
// Restore previous maximized state.
2219+
wd.maximized = wd.was_maximized_pre_fs;
22152220

22162221
_update_window_style(p_window, false);
22172222

2223+
// Restore window rect after exiting fullscreen.
22182224
if (wd.pre_fs_valid) {
22192225
rect = wd.pre_fs_rect;
22202226
} else {
22212227
rect.left = 0;
22222228
rect.right = wd.width;
22232229
rect.top = 0;
22242230
rect.bottom = wd.height;
2225-
wd.pre_fs_valid = true;
22262231
}
22272232

22282233
ShowWindow(wd.hWnd, SW_RESTORE);
@@ -2250,6 +2255,7 @@ void DisplayServerWindows::window_set_mode(WindowMode p_mode, WindowID p_window)
22502255
ShowWindow(wd.hWnd, SW_MINIMIZE);
22512256
wd.maximized = false;
22522257
wd.minimized = true;
2258+
wd.was_fullscreen_pre_min = was_fullscreen;
22532259
}
22542260

22552261
if (p_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN) {
@@ -2264,10 +2270,14 @@ void DisplayServerWindows::window_set_mode(WindowMode p_mode, WindowID p_window)
22642270
if (wd.minimized || wd.maximized) {
22652271
ShowWindow(wd.hWnd, SW_RESTORE);
22662272
}
2267-
wd.was_maximized = wd.maximized;
22682273

2269-
if (wd.pre_fs_valid) {
2274+
// Save previous maximized stare.
2275+
wd.was_maximized_pre_fs = wd.maximized;
2276+
2277+
if (!was_fullscreen) {
2278+
// Save non-fullscreen rect before entering fullscreen.
22702279
GetWindowRect(wd.hWnd, &wd.pre_fs_rect);
2280+
wd.pre_fs_valid = true;
22712281
}
22722282

22732283
int cs = window_get_current_screen(p_window);
@@ -5168,6 +5178,22 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
51685178
ClientToScreen(window.hWnd, (POINT *)&crect.right);
51695179
ClipCursor(&crect);
51705180
}
5181+
5182+
if (!window.minimized && window.was_fullscreen_pre_min) {
5183+
// Restore fullscreen mode if window was in fullscreen before it was minimized.
5184+
int cs = window_get_current_screen(window_id);
5185+
Point2 pos = screen_get_position(cs) + _get_screens_origin();
5186+
Size2 size = screen_get_size(cs);
5187+
5188+
window.was_fullscreen_pre_min = false;
5189+
window.fullscreen = true;
5190+
window.maximized = false;
5191+
window.minimized = false;
5192+
5193+
_update_window_style(window_id, false);
5194+
5195+
MoveWindow(window.hWnd, pos.x, pos.y, size.width, size.height, TRUE);
5196+
}
51715197
}
51725198

51735199
// Return here to prevent WM_MOVE and WM_SIZE from being sent
@@ -5675,7 +5701,19 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
56755701
wd.multiwindow_fs = true;
56765702
}
56775703
}
5678-
if (p_mode != WINDOW_MODE_FULLSCREEN && p_mode != WINDOW_MODE_EXCLUSIVE_FULLSCREEN) {
5704+
5705+
if (p_mode == WINDOW_MODE_FULLSCREEN || p_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN) {
5706+
// Save initial non-fullscreen rect.
5707+
Rect2i srect = screen_get_usable_rect(rq_screen);
5708+
Point2i wpos = p_rect.position;
5709+
if (srect != Rect2i()) {
5710+
wpos = wpos.clamp(srect.position, srect.position + srect.size - p_rect.size / 3);
5711+
}
5712+
5713+
wd.pre_fs_rect.left = wpos.x + offset.x;
5714+
wd.pre_fs_rect.right = wpos.x + p_rect.size.x + offset.x;
5715+
wd.pre_fs_rect.top = wpos.y + offset.y;
5716+
wd.pre_fs_rect.bottom = wpos.y + p_rect.size.y + offset.y;
56795717
wd.pre_fs_valid = true;
56805718
}
56815719

platform/windows/display_server_windows.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,8 @@ class DisplayServerWindows : public DisplayServer {
475475
bool resizable = true;
476476
bool window_focused = false;
477477
int activate_state = 0;
478-
bool was_maximized = false;
478+
bool was_maximized_pre_fs = false;
479+
bool was_fullscreen_pre_min = false;
479480
bool always_on_top = false;
480481
bool no_focus = false;
481482
bool exclusive = false;

0 commit comments

Comments
 (0)