[macOS] Improve "extended to title" transition to / from fullscreen.

This commit is contained in:
bruvzg 2022-09-21 11:15:19 +03:00
parent c8a0912f36
commit cdfa50dbe9
No known key found for this signature in database
GPG Key ID: 7960FCF39844EC38
3 changed files with 43 additions and 18 deletions

View File

@ -85,7 +85,7 @@ public:
Size2i min_size; Size2i min_size;
Size2i max_size; Size2i max_size;
Size2i size; Size2i size;
Vector2i wb_offset = Vector2i(16, 16); Vector2i wb_offset = Vector2i(14, 14);
NSRect last_frame_rect; NSRect last_frame_rect;
@ -230,6 +230,7 @@ public:
void window_update(WindowID p_window); void window_update(WindowID p_window);
void window_destroy(WindowID p_window); void window_destroy(WindowID p_window);
void window_resize(WindowID p_window, int p_width, int p_height); void window_resize(WindowID p_window, int p_width, int p_height);
void window_set_custom_window_buttons(WindowData &p_wd, bool p_enabled);
virtual bool has_feature(Feature p_feature) const override; virtual bool has_feature(Feature p_feature) const override;
virtual String get_name() const override; virtual String get_name() const override;

View File

@ -2671,6 +2671,30 @@ Vector2i DisplayServerMacOS::window_get_safe_title_margins(WindowID p_window) co
return Vector2i(max_x * screen_get_max_scale(), 0); return Vector2i(max_x * screen_get_max_scale(), 0);
} }
void DisplayServerMacOS::window_set_custom_window_buttons(WindowData &p_wd, bool p_enabled) {
if (p_wd.window_button_view) {
[p_wd.window_button_view removeFromSuperview];
p_wd.window_button_view = nil;
}
if (p_enabled) {
float window_buttons_spacing = NSMinX([[p_wd.window_object standardWindowButton:NSWindowMiniaturizeButton] frame]) - NSMinX([[p_wd.window_object standardWindowButton:NSWindowCloseButton] frame]);
[p_wd.window_object setTitleVisibility:NSWindowTitleHidden];
[[p_wd.window_object standardWindowButton:NSWindowZoomButton] setHidden:YES];
[[p_wd.window_object standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES];
[[p_wd.window_object standardWindowButton:NSWindowCloseButton] setHidden:YES];
p_wd.window_button_view = [[GodotButtonView alloc] initWithFrame:NSZeroRect];
[p_wd.window_button_view initButtons:window_buttons_spacing offset:NSMakePoint(p_wd.wb_offset.x, p_wd.wb_offset.y)];
[p_wd.window_view addSubview:p_wd.window_button_view];
} else {
[p_wd.window_object setTitleVisibility:NSWindowTitleVisible];
[[p_wd.window_object standardWindowButton:NSWindowZoomButton] setHidden:NO];
[[p_wd.window_object standardWindowButton:NSWindowMiniaturizeButton] setHidden:NO];
[[p_wd.window_object standardWindowButton:NSWindowCloseButton] setHidden:NO];
}
}
void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window) { void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window) {
_THREAD_SAFE_METHOD_ _THREAD_SAFE_METHOD_
@ -2691,31 +2715,20 @@ void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, Win
} break; } break;
case WINDOW_FLAG_EXTEND_TO_TITLE: { case WINDOW_FLAG_EXTEND_TO_TITLE: {
NSRect rect = [wd.window_object frame]; NSRect rect = [wd.window_object frame];
if (wd.window_button_view) {
[wd.window_button_view removeFromSuperview];
wd.window_button_view = nil;
}
if (p_enabled) { if (p_enabled) {
[wd.window_object setTitlebarAppearsTransparent:YES]; [wd.window_object setTitlebarAppearsTransparent:YES];
[wd.window_object setTitleVisibility:NSWindowTitleHidden];
[wd.window_object setStyleMask:[wd.window_object styleMask] | NSWindowStyleMaskFullSizeContentView]; [wd.window_object setStyleMask:[wd.window_object styleMask] | NSWindowStyleMaskFullSizeContentView];
[[wd.window_object standardWindowButton:NSWindowZoomButton] setHidden:YES]; if (!wd.fullscreen) {
[[wd.window_object standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES]; window_set_custom_window_buttons(wd, true);
[[wd.window_object standardWindowButton:NSWindowCloseButton] setHidden:YES]; }
float window_buttons_spacing = NSMinX([[wd.window_object standardWindowButton:NSWindowMiniaturizeButton] frame]) - NSMinX([[wd.window_object standardWindowButton:NSWindowCloseButton] frame]);
wd.window_button_view = [[GodotButtonView alloc] initWithFrame:NSZeroRect];
[wd.window_button_view initButtons:window_buttons_spacing offset:NSMakePoint(wd.wb_offset.x, wd.wb_offset.y)];
[wd.window_view addSubview:wd.window_button_view];
} else { } else {
[wd.window_object setTitlebarAppearsTransparent:NO]; [wd.window_object setTitlebarAppearsTransparent:NO];
[wd.window_object setTitleVisibility:NSWindowTitleVisible];
[wd.window_object setStyleMask:[wd.window_object styleMask] & ~NSWindowStyleMaskFullSizeContentView]; [wd.window_object setStyleMask:[wd.window_object styleMask] & ~NSWindowStyleMaskFullSizeContentView];
[[wd.window_object standardWindowButton:NSWindowZoomButton] setHidden:NO]; if (!wd.fullscreen) {
[[wd.window_object standardWindowButton:NSWindowMiniaturizeButton] setHidden:NO]; window_set_custom_window_buttons(wd, false);
[[wd.window_object standardWindowButton:NSWindowCloseButton] setHidden:NO]; }
} }
[wd.window_object setFrame:rect display:YES]; [wd.window_object setFrame:rect display:YES];
} break; } break;

View File

@ -77,10 +77,16 @@
DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); DisplayServerMacOS::WindowData &wd = ds->get_window(window_id);
wd.fullscreen = true; wd.fullscreen = true;
// Reset window size limits. // Reset window size limits.
[wd.window_object setContentMinSize:NSMakeSize(0, 0)]; [wd.window_object setContentMinSize:NSMakeSize(0, 0)];
[wd.window_object setContentMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)]; [wd.window_object setContentMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
// Reset custom window buttons.
if ([wd.window_object styleMask] & NSWindowStyleMaskFullSizeContentView) {
ds->window_set_custom_window_buttons(wd, false);
}
// Force window resize event. // Force window resize event.
[self windowDidResize:notification]; [self windowDidResize:notification];
} }
@ -105,6 +111,11 @@
[wd.window_object setContentMaxSize:NSMakeSize(size.x, size.y)]; [wd.window_object setContentMaxSize:NSMakeSize(size.x, size.y)];
} }
// Restore custom window buttons.
if ([wd.window_object styleMask] & NSWindowStyleMaskFullSizeContentView) {
ds->window_set_custom_window_buttons(wd, true);
}
// Restore resizability state. // Restore resizability state.
if (wd.resize_disabled) { if (wd.resize_disabled) {
[wd.window_object setStyleMask:[wd.window_object styleMask] & ~NSWindowStyleMaskResizable]; [wd.window_object setStyleMask:[wd.window_object styleMask] & ~NSWindowStyleMaskResizable];