You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Merge pull request #106942 from bruvzg/macos_borderless_maximize
[macOS] Fix borderless window maximization.
This commit is contained in:
@@ -111,7 +111,8 @@ public:
|
|||||||
Size2i size;
|
Size2i size;
|
||||||
Vector2i wb_offset = Vector2i(14, 14);
|
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;
|
bool im_active = false;
|
||||||
Size2i im_position;
|
Size2i im_position;
|
||||||
|
|||||||
@@ -2537,8 +2537,14 @@ void DisplayServerMacOS::window_set_mode(WindowMode p_mode, WindowID p_window) {
|
|||||||
} break;
|
} break;
|
||||||
case WINDOW_MODE_MAXIMIZED: {
|
case WINDOW_MODE_MAXIMIZED: {
|
||||||
if (NSEqualRects([wd.window_object frame], [[wd.window_object screen] visibleFrame])) {
|
if (NSEqualRects([wd.window_object frame], [[wd.window_object screen] visibleFrame])) {
|
||||||
|
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];
|
[wd.window_object zoom:nil];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2570,8 +2576,13 @@ void DisplayServerMacOS::window_set_mode(WindowMode p_mode, WindowID p_window) {
|
|||||||
} break;
|
} break;
|
||||||
case WINDOW_MODE_MAXIMIZED: {
|
case WINDOW_MODE_MAXIMIZED: {
|
||||||
if (!NSEqualRects([wd.window_object frame], [[wd.window_object screen] visibleFrame])) {
|
if (!NSEqualRects([wd.window_object frame], [[wd.window_object screen] visibleFrame])) {
|
||||||
|
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];
|
[wd.window_object zoom:nil];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2770,6 +2781,7 @@ void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, Win
|
|||||||
[wd.window_object orderOut:nil];
|
[wd.window_object orderOut:nil];
|
||||||
}
|
}
|
||||||
wd.borderless = p_enabled;
|
wd.borderless = p_enabled;
|
||||||
|
bool was_maximized = (NSEqualRects([wd.window_object frame], [[wd.window_object screen] visibleFrame]));
|
||||||
if (p_enabled) {
|
if (p_enabled) {
|
||||||
[wd.window_object setStyleMask:NSWindowStyleMaskBorderless];
|
[wd.window_object setStyleMask:NSWindowStyleMaskBorderless];
|
||||||
[wd.window_object setHasShadow:NO];
|
[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];
|
[wd.window_object makeKeyAndOrderFront:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (was_maximized) {
|
||||||
|
[wd.window_object setFrame:[[wd.window_object screen] visibleFrame] display:NO];
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
case WINDOW_FLAG_ALWAYS_ON_TOP: {
|
case WINDOW_FLAG_ALWAYS_ON_TOP: {
|
||||||
wd.on_top = p_enabled;
|
wd.on_top = p_enabled;
|
||||||
|
|||||||
@@ -208,6 +208,16 @@
|
|||||||
[self windowDidResize:notification];
|
[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 {
|
- (void)windowDidChangeBackingProperties:(NSNotification *)notification {
|
||||||
if (!ds->has_window(window_id)) {
|
if (!ds->has_window(window_id)) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user