This commit is contained in:
Kovid Goyal
2025-09-29 17:44:24 +05:30
parent d2cc22e7c6
commit 14f75c9a9b

View File

@@ -3318,6 +3318,7 @@ set_title_bar_background(NSWindow *window, NSColor *backgroundColor) {
GLFWAPI void glfwCocoaSetWindowChrome(GLFWwindow *w, unsigned int color, bool use_system_color, unsigned int system_color, int background_blur, unsigned int hide_window_decorations, bool show_text_in_titlebar, int color_space, float background_opacity, bool resizable) { @autoreleasepool { GLFWAPI void glfwCocoaSetWindowChrome(GLFWwindow *w, unsigned int color, bool use_system_color, unsigned int system_color, int background_blur, unsigned int hide_window_decorations, bool show_text_in_titlebar, int color_space, float background_opacity, bool resizable) { @autoreleasepool {
_GLFWwindow* window = (_GLFWwindow*)w; _GLFWwindow* window = (_GLFWwindow*)w;
if (window->ns.layer_shell.is_active) return; if (window->ns.layer_shell.is_active) return;
GLFWWindow *nsw = window->ns.object;
const bool is_transparent = _glfwPlatformFramebufferTransparent(window); const bool is_transparent = _glfwPlatformFramebufferTransparent(window);
if (!is_transparent) { background_opacity = 1.0; background_blur = 0; } if (!is_transparent) { background_opacity = 1.0; background_blur = 0; }
NSColor *window_background = [NSColor windowBackgroundColor]; NSColor *window_background = [NSColor windowBackgroundColor];
@@ -3329,7 +3330,7 @@ GLFWAPI void glfwCocoaSetWindowChrome(GLFWwindow *w, unsigned int color, bool us
NSAppearance *appearance = nil; NSAppearance *appearance = nil;
bool titlebar_transparent = false; bool titlebar_transparent = false;
NSColor *titlebar_color = nil; NSColor *titlebar_color = nil;
const NSWindowStyleMask current_style_mask = [window->ns.object styleMask]; const NSWindowStyleMask current_style_mask = [nsw styleMask];
const bool in_fullscreen = ((current_style_mask & NSWindowStyleMaskFullScreen) != 0) || window->ns.in_traditional_fullscreen; const bool in_fullscreen = ((current_style_mask & NSWindowStyleMaskFullScreen) != 0) || window->ns.in_traditional_fullscreen;
NSAppearance *light_appearance = is_transparent ? [NSAppearance appearanceNamed:NSAppearanceNameVibrantLight] : [NSAppearance appearanceNamed:NSAppearanceNameAqua]; NSAppearance *light_appearance = is_transparent ? [NSAppearance appearanceNamed:NSAppearanceNameVibrantLight] : [NSAppearance appearanceNamed:NSAppearanceNameAqua];
NSAppearance *dark_appearance = is_transparent ? [NSAppearance appearanceNamed:NSAppearanceNameVibrantDark] : [NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]; NSAppearance *dark_appearance = is_transparent ? [NSAppearance appearanceNamed:NSAppearanceNameVibrantDark] : [NSAppearance appearanceNamed:NSAppearanceNameDarkAqua];
@@ -3349,8 +3350,8 @@ GLFWAPI void glfwCocoaSetWindowChrome(GLFWwindow *w, unsigned int color, bool us
titlebar_color = [NSColor colorWithSRGBRed:red green:green blue:blue alpha:background_opacity]; titlebar_color = [NSColor colorWithSRGBRed:red green:green blue:blue alpha:background_opacity];
titlebar_transparent = true; titlebar_transparent = true;
} }
[window->ns.object setBackgroundColor:window_background]; [nsw setBackgroundColor:window_background];
[window->ns.object setAppearance:appearance]; [nsw setAppearance:appearance];
_glfwPlatformSetWindowBlur(window, background_blur); _glfwPlatformSetWindowBlur(window, background_blur);
bool has_shadow = false; bool has_shadow = false;
const char *decorations_desc = "full"; const char *decorations_desc = "full";
@@ -3382,9 +3383,9 @@ GLFWAPI void glfwCocoaSetWindowChrome(GLFWwindow *w, unsigned int color, bool us
// https://github.com/kovidgoyal/kitty/issues/6439 // https://github.com/kovidgoyal/kitty/issues/6439
if (is_transparent) has_shadow = false; if (is_transparent) has_shadow = false;
bool hide_titlebar_buttons = !in_fullscreen && window->ns.titlebar_hidden; bool hide_titlebar_buttons = !in_fullscreen && window->ns.titlebar_hidden;
[window->ns.object setTitlebarAppearsTransparent:titlebar_transparent]; [nsw setTitlebarAppearsTransparent:titlebar_transparent];
[window->ns.object setHasShadow:has_shadow]; [nsw setHasShadow:has_shadow];
[window->ns.object setTitleVisibility:(show_text_in_titlebar) ? NSWindowTitleVisible : NSWindowTitleHidden]; [nsw setTitleVisibility:(show_text_in_titlebar) ? NSWindowTitleVisible : NSWindowTitleHidden];
NSColorSpace *cs = nil; NSColorSpace *cs = nil;
switch (color_space) { switch (color_space) {
case SRGB_COLORSPACE: cs = [NSColorSpace sRGBColorSpace]; break; case SRGB_COLORSPACE: cs = [NSColorSpace sRGBColorSpace]; break;
@@ -3404,24 +3405,24 @@ GLFWAPI void glfwCocoaSetWindowChrome(GLFWwindow *w, unsigned int color, bool us
titlebar_color ? [titlebar_color.description UTF8String] : "<nil>", titlebar_color ? [titlebar_color.description UTF8String] : "<nil>",
show_text_in_titlebar, window->ns.titlebar_hidden, hide_titlebar_buttons show_text_in_titlebar, window->ns.titlebar_hidden, hide_titlebar_buttons
); );
[window->ns.object setColorSpace:cs]; [nsw setColorSpace:cs];
[[window->ns.object standardWindowButton: NSWindowCloseButton] setHidden:hide_titlebar_buttons]; [[nsw standardWindowButton: NSWindowCloseButton] setHidden:hide_titlebar_buttons];
[[window->ns.object standardWindowButton: NSWindowMiniaturizeButton] setHidden:hide_titlebar_buttons]; [[nsw standardWindowButton: NSWindowMiniaturizeButton] setHidden:hide_titlebar_buttons];
[[window->ns.object standardWindowButton: NSWindowZoomButton] setHidden:hide_titlebar_buttons]; [[nsw standardWindowButton: NSWindowZoomButton] setHidden:hide_titlebar_buttons];
// Apple throws a hissy fit if one attempts to clear the value of NSWindowStyleMaskFullScreen outside of a full screen transition // Apple throws a hissy fit if one attempts to clear the value of NSWindowStyleMaskFullScreen outside of a full screen transition
// event. See https://github.com/kovidgoyal/kitty/issues/7106 // event. See https://github.com/kovidgoyal/kitty/issues/7106
NSWindowStyleMask fsmask = current_style_mask & NSWindowStyleMaskFullScreen; NSWindowStyleMask fsmask = current_style_mask & NSWindowStyleMaskFullScreen;
window->ns.pre_full_screen_style_mask = getStyleMask(window); window->ns.pre_full_screen_style_mask = getStyleMask(window);
if (in_fullscreen && window->ns.in_traditional_fullscreen) { if (in_fullscreen && window->ns.in_traditional_fullscreen) {
[window->ns.object setStyleMask:NSWindowStyleMaskBorderless]; [nsw setStyleMask:NSWindowStyleMaskBorderless];
} else { } else {
[window->ns.object setStyleMask:window->ns.pre_full_screen_style_mask | fsmask]; [nsw setStyleMask:window->ns.pre_full_screen_style_mask | fsmask];
} }
if (background_opacity < 1.0 && !window->ns.titlebar_hidden && window->decorated && titlebar_color != nil) { if (background_opacity < 1.0 && !window->ns.titlebar_hidden && window->decorated && titlebar_color != nil) {
set_title_bar_background(window->ns.object, titlebar_color); set_title_bar_background(nsw, titlebar_color);
} else clear_title_bar_background_views(window->ns.object); } else clear_title_bar_background_views(nsw);
// HACK: Changing the style mask can cause the first responder to be cleared // HACK: Changing the style mask can cause the first responder to be cleared
[window->ns.object makeFirstResponder:window->ns.view]; [nsw makeFirstResponder:window->ns.view];
}} }}
GLFWAPI uint32_t GLFWAPI uint32_t