diff --git a/kitty/cocoa_window.m b/kitty/cocoa_window.m index 621c204b3..9241e5f16 100644 --- a/kitty/cocoa_window.m +++ b/kitty/cocoa_window.m @@ -6,7 +6,7 @@ */ -#include "data-types.h" +#include "state.h" #include #include @@ -23,6 +23,9 @@ typedef void* rusage_info_t; // needed for libproc.h #endif static NSMenuItem* title_menu = NULL; +static bool change_titlebar_color = false; +static color_type titlebar_color = 0; + static NSString* find_app_name(void) { @@ -154,7 +157,7 @@ cocoa_make_window_resizable(void *w) { return true; } -PyObject* +static PyObject* cocoa_get_lang(PyObject UNUSED *self) { NSString* locale = nil; NSString* lang_code = [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]; @@ -168,7 +171,7 @@ cocoa_get_lang(PyObject UNUSED *self) { return Py_BuildValue("s", [locale UTF8String]); } -PyObject* +static PyObject* cwd_of_process(PyObject *self UNUSED, PyObject *pid_) { long pid = PyLong_AsLong(pid_); struct proc_vnodepathinfo vpi; @@ -177,10 +180,30 @@ cwd_of_process(PyObject *self UNUSED, PyObject *pid_) { return PyUnicode_FromString(vpi.pvi_cdir.vip_path); } +static inline color_type +color_as_int(PyObject *color) { +#define I(n, s) ((PyLong_AsUnsignedLong(PyTuple_GET_ITEM(color, n)) & 0xff) << s) + return (I(0, 16) | I(1, 8) | I(2, 0)) & 0xffffff; +#undef I +} + +static PyObject* +macos_change_titlebar_color(PyObject *self UNUSED, PyObject *val) { + if (val == Py_None) change_titlebar_color = false; + else if (val == Py_True) { + change_titlebar_color = true; + titlebar_color = OPT(background); + } else { + if (!PyTuple_Check(val)) { PyErr_SetString(PyExc_TypeError, "Not a color tuple"); return NULL; } + titlebar_color = color_as_int(val); + } + Py_RETURN_NONE; +} static PyMethodDef module_methods[] = { {"cocoa_get_lang", (PyCFunction)cocoa_get_lang, METH_NOARGS, ""}, {"cwd_of_process", (PyCFunction)cwd_of_process, METH_O, ""}, + {"macos_change_titlebar_color", (PyCFunction)macos_change_titlebar_color, METH_O, ""}, {NULL, NULL, 0, NULL} /* Sentinel */ }; diff --git a/kitty/config.py b/kitty/config.py index 3a864aff3..0f2bf4ac8 100644 --- a/kitty/config.py +++ b/kitty/config.py @@ -220,6 +220,15 @@ def adjust_line_height(x): return int(x) +def macos_titlebar_color(x): + x = x.strip('"') + if x == 'system': + return + if x == 'background': + return True + return to_color(x) + + def box_drawing_scale(x): ans = tuple(float(x.strip()) for x in x.split(',')) if len(ans) != 4: @@ -288,6 +297,7 @@ type_map = { 'initial_window_height': positive_int, 'macos_hide_titlebar': to_bool, 'macos_option_as_alt': to_bool, + 'macos_titlebar_color': macos_titlebar_color, 'box_drawing_scale': box_drawing_scale, 'x11_bell_volume': int, 'background_opacity': unit_float, diff --git a/kitty/kitty.conf b/kitty/kitty.conf index bd070f651..bb748819f 100644 --- a/kitty/kitty.conf +++ b/kitty/kitty.conf @@ -386,6 +386,12 @@ map ctrl+shift+e run_simple_kitten text url_hints # browser can read the contents of the clipboard. copy_on_select no +# Change the color of the kitty window's titlebar on macOS. A value of "system" +# means to use the default system color, a value of "background" means to use +# the default background color and finally you can use an arbitrary color, such +# as #12af59 or "red". +macos_titlebar_color system + # Hide the kitty window's title bar on macOS. macos_hide_titlebar no diff --git a/kitty/main.py b/kitty/main.py index 342478ecf..882d8b86c 100644 --- a/kitty/main.py +++ b/kitty/main.py @@ -40,6 +40,9 @@ def init_graphics(): def run_app(opts, args): set_scale(opts.box_drawing_scale) set_options(opts, is_wayland, args.debug_gl) + if is_macos: + from .fast_data_types import macos_change_titlebar_color + macos_change_titlebar_color(opts.macos_titlebar_color) with cached_values_for('main') as cached_values: w, h = initial_window_size(opts, cached_values) window_id = create_os_window(w, h, appname, args.name or args.cls or appname, args.cls or appname, load_all_shaders)