1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Merge pull request #106942 from bruvzg/macos_borderless_maximize

[macOS] Fix borderless window maximization.
This commit is contained in:
Rémi Verschelde
2025-06-01 00:31:53 +02:00
3 changed files with 29 additions and 3 deletions

View File

@@ -111,7 +111,8 @@ public:
Size2i size;
Vector2i wb_offset = Vector2i(14, 14);
NSRect last_frame_rect;
NSRect last_frame_rect = NSMakeRect(0, 0, 0, 0);
NSRect pre_zoom_rect = NSMakeRect(0, 0, 0, 0);
bool im_active = false;
Size2i im_position;

View File

@@ -2537,7 +2537,13 @@ void DisplayServerMacOS::window_set_mode(WindowMode p_mode, WindowID p_window) {
} break;
case WINDOW_MODE_MAXIMIZED: {
if (NSEqualRects([wd.window_object frame], [[wd.window_object screen] visibleFrame])) {
[wd.window_object zoom:nil];
if (wd.borderless) {
if (wd.pre_zoom_rect.size.width > 0 && wd.pre_zoom_rect.size.height > 0) {
[wd.window_object setFrame:wd.pre_zoom_rect display:NO animate:YES];
}
} else {
[wd.window_object zoom:nil];
}
}
} break;
}
@@ -2570,7 +2576,12 @@ void DisplayServerMacOS::window_set_mode(WindowMode p_mode, WindowID p_window) {
} break;
case WINDOW_MODE_MAXIMIZED: {
if (!NSEqualRects([wd.window_object frame], [[wd.window_object screen] visibleFrame])) {
[wd.window_object zoom:nil];
wd.pre_zoom_rect = [wd.window_object frame];
if (wd.borderless) {
[wd.window_object setFrame:[[wd.window_object screen] visibleFrame] display:NO animate:YES];
} else {
[wd.window_object zoom:nil];
}
}
} break;
}
@@ -2770,6 +2781,7 @@ void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, Win
[wd.window_object orderOut:nil];
}
wd.borderless = p_enabled;
bool was_maximized = (NSEqualRects([wd.window_object frame], [[wd.window_object screen] visibleFrame]));
if (p_enabled) {
[wd.window_object setStyleMask:NSWindowStyleMaskBorderless];
[wd.window_object setHasShadow:NO];
@@ -2800,6 +2812,9 @@ void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, Win
[wd.window_object makeKeyAndOrderFront:nil];
}
}
if (was_maximized) {
[wd.window_object setFrame:[[wd.window_object screen] visibleFrame] display:NO];
}
} break;
case WINDOW_FLAG_ALWAYS_ON_TOP: {
wd.on_top = p_enabled;

View File

@@ -208,6 +208,16 @@
[self windowDidResize:notification];
}
- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame {
if (ds->has_window(window_id)) {
DisplayServerMacOS::WindowData &wd = ds->get_window(window_id);
if (!wd.borderless && !(NSEqualRects([wd.window_object frame], [[wd.window_object screen] visibleFrame]))) {
wd.pre_zoom_rect = [wd.window_object frame];
}
}
return YES;
}
- (void)windowDidChangeBackingProperties:(NSNotification *)notification {
if (!ds->has_window(window_id)) {
return;