@@ -2206,23 +2206,28 @@ void DisplayServerWindows::window_set_mode(WindowMode p_mode, WindowID p_window)
2206
2206
ERR_FAIL_COND (!windows.has (p_window));
2207
2207
WindowData &wd = windows[p_window];
2208
2208
2209
+ bool was_fullscreen = wd.fullscreen ;
2210
+ wd.was_fullscreen_pre_min = false ;
2211
+
2209
2212
if (wd.fullscreen && p_mode != WINDOW_MODE_FULLSCREEN && p_mode != WINDOW_MODE_EXCLUSIVE_FULLSCREEN) {
2210
2213
RECT rect;
2211
2214
2212
2215
wd.fullscreen = false ;
2213
2216
wd.multiwindow_fs = false ;
2214
- wd.maximized = wd.was_maximized ;
2217
+
2218
+ // Restore previous maximized state.
2219
+ wd.maximized = wd.was_maximized_pre_fs ;
2215
2220
2216
2221
_update_window_style (p_window, false );
2217
2222
2223
+ // Restore window rect after exiting fullscreen.
2218
2224
if (wd.pre_fs_valid ) {
2219
2225
rect = wd.pre_fs_rect ;
2220
2226
} else {
2221
2227
rect.left = 0 ;
2222
2228
rect.right = wd.width ;
2223
2229
rect.top = 0 ;
2224
2230
rect.bottom = wd.height ;
2225
- wd.pre_fs_valid = true ;
2226
2231
}
2227
2232
2228
2233
ShowWindow (wd.hWnd , SW_RESTORE);
@@ -2250,6 +2255,7 @@ void DisplayServerWindows::window_set_mode(WindowMode p_mode, WindowID p_window)
2250
2255
ShowWindow (wd.hWnd , SW_MINIMIZE);
2251
2256
wd.maximized = false ;
2252
2257
wd.minimized = true ;
2258
+ wd.was_fullscreen_pre_min = was_fullscreen;
2253
2259
}
2254
2260
2255
2261
if (p_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN) {
@@ -2264,10 +2270,14 @@ void DisplayServerWindows::window_set_mode(WindowMode p_mode, WindowID p_window)
2264
2270
if (wd.minimized || wd.maximized ) {
2265
2271
ShowWindow (wd.hWnd , SW_RESTORE);
2266
2272
}
2267
- wd.was_maximized = wd.maximized ;
2268
2273
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.
2270
2279
GetWindowRect (wd.hWnd , &wd.pre_fs_rect );
2280
+ wd.pre_fs_valid = true ;
2271
2281
}
2272
2282
2273
2283
int cs = window_get_current_screen (p_window);
@@ -5168,6 +5178,22 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
5168
5178
ClientToScreen (window.hWnd , (POINT *)&crect.right );
5169
5179
ClipCursor (&crect);
5170
5180
}
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
+ }
5171
5197
}
5172
5198
5173
5199
// Return here to prevent WM_MOVE and WM_SIZE from being sent
@@ -5675,7 +5701,19 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
5675
5701
wd.multiwindow_fs = true ;
5676
5702
}
5677
5703
}
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 ;
5679
5717
wd.pre_fs_valid = true ;
5680
5718
}
5681
5719
0 commit comments