Merge pull request #103857 from bruvzg/macos_trans_b

[macOS] Enable transparency for windows with decorations.
This commit is contained in:
Thaddeus Crews 2025-03-18 14:42:54 -05:00
commit 89a2f3634c
No known key found for this signature in database
GPG Key ID: 62181B86FE9E5D84
2 changed files with 22 additions and 12 deletions

View File

@ -265,9 +265,15 @@ void DisplayServerMacOS::set_window_per_pixel_transparency_enabled(bool p_enable
return;
}
if (p_enabled) {
[wd.window_object setBackgroundColor:[NSColor clearColor]];
[wd.window_object setOpaque:NO];
[wd.window_object setHasShadow:NO];
if (wd.borderless) {
[wd.window_object setBackgroundColor:[NSColor clearColor]];
[wd.window_object setHasShadow:NO];
} else {
// Note: transparent and not borderless - set alpha to non-zero value to ensure window shadow is rendered correctly.
[wd.window_object setBackgroundColor:[NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:0.004f]];
[wd.window_object setHasShadow:YES];
}
CALayer *layer = [(NSView *)wd.window_view layer];
if (layer) {
[layer setBackgroundColor:[NSColor clearColor].CGColor];
@ -286,7 +292,9 @@ void DisplayServerMacOS::set_window_per_pixel_transparency_enabled(bool p_enable
}
[wd.window_object setBackgroundColor:bg_color];
[wd.window_object setOpaque:YES];
[wd.window_object setHasShadow:YES];
if (!wd.borderless) {
[wd.window_object setHasShadow:YES];
}
CALayer *layer = [(NSView *)wd.window_view layer];
if (layer) {
[layer setBackgroundColor:bg_color.CGColor];
@ -2622,12 +2630,17 @@ void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, Win
wd.borderless = p_enabled;
if (p_enabled) {
[wd.window_object setStyleMask:NSWindowStyleMaskBorderless];
} else {
[wd.window_object setHasShadow:NO];
if (wd.layered_window) {
wd.layered_window = false;
set_window_per_pixel_transparency_enabled(false, p_window);
[wd.window_object setBackgroundColor:[NSColor clearColor]];
}
} else {
[wd.window_object setStyleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | (wd.extend_to_title ? NSWindowStyleMaskFullSizeContentView : 0) | (wd.resize_disabled ? 0 : NSWindowStyleMaskResizable)];
[wd.window_object setHasShadow:YES];
if (wd.layered_window) {
// Note: transparent and not borderless - set alpha to non-zero value to ensure window shadow is rendered correctly.
[wd.window_object setBackgroundColor:[NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:0.004f]];
}
// Force update of the window styles.
NSRect frameRect = [wd.window_object frame];
[wd.window_object setFrame:NSMakeRect(frameRect.origin.x, frameRect.origin.y, frameRect.size.width + 1, frameRect.size.height) display:NO];
@ -2659,11 +2672,6 @@ void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, Win
if (wd.fullscreen) {
return;
}
if (p_enabled) {
[wd.window_object setStyleMask:NSWindowStyleMaskBorderless]; // Force borderless.
} else if (!wd.borderless) {
[wd.window_object setStyleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | (wd.extend_to_title ? NSWindowStyleMaskFullSizeContentView : 0) | (wd.resize_disabled ? 0 : NSWindowStyleMaskResizable)];
}
wd.layered_window = p_enabled;
set_window_per_pixel_transparency_enabled(p_enabled, p_window);
// Force update of the window styles.

View File

@ -184,10 +184,12 @@
}
// Restore borderless, transparent and resizability state.
if (wd.borderless || wd.layered_window) {
if (wd.borderless) {
[wd.window_object setStyleMask:NSWindowStyleMaskBorderless];
[wd.window_object setHasShadow:NO];
} else {
[wd.window_object setStyleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | (wd.extend_to_title ? NSWindowStyleMaskFullSizeContentView : 0) | (wd.resize_disabled ? 0 : NSWindowStyleMaskResizable)];
[wd.window_object setHasShadow:YES];
}
if (wd.layered_window) {
ds->set_window_per_pixel_transparency_enabled(true, window_id);