diff --git a/kitty/cocoa_window.m b/kitty/cocoa_window.m index 9241e5f16..455713a09 100644 --- a/kitty/cocoa_window.m +++ b/kitty/cocoa_window.m @@ -195,11 +195,40 @@ macos_change_titlebar_color(PyObject *self UNUSED, PyObject *val) { titlebar_color = OPT(background); } else { if (!PyTuple_Check(val)) { PyErr_SetString(PyExc_TypeError, "Not a color tuple"); return NULL; } + change_titlebar_color = true; titlebar_color = color_as_int(val); } Py_RETURN_NONE; } +void +cocoa_set_titlebar_color(void *w) +{ + if (!change_titlebar_color) return; + + NSWindow *window = (NSWindow *)w; + + double red = ((titlebar_color >> 16) & 0xFF) / 255.0; + double green = ((titlebar_color >> 8) & 0xFF) / 255.0; + double blue = (titlebar_color & 0xFF) / 255.0; + + NSColor *background = + [NSColor colorWithSRGBRed:red + green:green + blue:blue + alpha:1.0]; + [window setTitlebarAppearsTransparent:YES]; + [window setBackgroundColor:background]; + + double luma = 0.2126 * red + 0.7152 * green + 0.0722 * blue; + + if (luma < 0.5) { + [window setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameVibrantDark]]; + } else { + [window setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameVibrantLight]]; + } +} + static PyMethodDef module_methods[] = { {"cocoa_get_lang", (PyCFunction)cocoa_get_lang, METH_NOARGS, ""}, {"cwd_of_process", (PyCFunction)cwd_of_process, METH_O, ""}, diff --git a/kitty/glfw.c b/kitty/glfw.c index de3ccd53c..78a9fe232 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -9,6 +9,7 @@ #include "glfw-wrapper.h" extern bool cocoa_make_window_resizable(void *w); extern void cocoa_create_global_menu(void); +extern void cocoa_set_titlebar_color(void *w); #if GLFW_KEY_LAST >= MAX_KEY_COUNT #error "glfw has too many keys, you should increase MAX_KEY_COUNT" @@ -383,6 +384,7 @@ create_os_window(PyObject UNUSED *self, PyObject *args) { if (glfwGetCocoaWindow) { if (!cocoa_make_window_resizable(glfwGetCocoaWindow(glfw_window))) { PyErr_Print(); } } else fprintf(stderr, "Failed to load glfwGetCocoaWindow\n"); } + cocoa_set_titlebar_color(glfwGetCocoaWindow(glfw_window)); #endif double now = monotonic(); w->is_focused = true;