diff --git a/kitty/options/definition.py b/kitty/options/definition.py index 286592926..a113fce23 100644 --- a/kitty/options/definition.py +++ b/kitty/options/definition.py @@ -208,7 +208,7 @@ lines. ''' ) -opt('undercurl_style', 'thin-sparse', +opt('undercurl_style', 'thin-sparse', ctype='undercurl_style', choices=('thin-sparse', 'thin-dense', 'thick-sparse', 'thick-dense'), long_text=''' The style with which undercurls are rendered. This option takes the form diff --git a/kitty/options/to-c-generated.h b/kitty/options/to-c-generated.h index e6e00d4dc..72a6c3966 100644 --- a/kitty/options/to-c-generated.h +++ b/kitty/options/to-c-generated.h @@ -70,6 +70,19 @@ convert_from_opts_modify_font(PyObject *py_opts, Options *opts) { Py_DECREF(ret); } +static void +convert_from_python_undercurl_style(PyObject *val, Options *opts) { + opts->undercurl_style = undercurl_style(val); +} + +static void +convert_from_opts_undercurl_style(PyObject *py_opts, Options *opts) { + PyObject *ret = PyObject_GetAttrString(py_opts, "undercurl_style"); + if (ret == NULL) return; + convert_from_python_undercurl_style(ret, opts); + Py_DECREF(ret); +} + static void convert_from_python_text_composition_strategy(PyObject *val, Options *opts) { text_composition_strategy(val, opts); @@ -1148,6 +1161,8 @@ convert_opts_from_python_opts(PyObject *py_opts, Options *opts) { if (PyErr_Occurred()) return false; convert_from_opts_modify_font(py_opts, opts); if (PyErr_Occurred()) return false; + convert_from_opts_undercurl_style(py_opts, opts); + if (PyErr_Occurred()) return false; convert_from_opts_text_composition_strategy(py_opts, opts); if (PyErr_Occurred()) return false; convert_from_opts_cursor_shape(py_opts, opts); diff --git a/kitty/options/to-c.h b/kitty/options/to-c.h index 9aa5c91ba..8eeabb7a6 100644 --- a/kitty/options/to-c.h +++ b/kitty/options/to-c.h @@ -58,6 +58,23 @@ window_title_in(PyObject *title_in) { return ALL; } +static inline unsigned +undercurl_style(PyObject *x) { + RAII_PyObject(thick, PyUnicode_FromString("thick")); + RAII_PyObject(dense, PyUnicode_FromString("dense")); + unsigned ans = 0; + int ret; + switch ((ret = PyUnicode_Find(x, dense, 0, PyUnicode_GET_LENGTH(x), 1))) { + case -2: PyErr_Clear(); case -1: break; + default: ans |= 1; + } + switch ((ret = PyUnicode_Find(x, thick, 0, PyUnicode_GET_LENGTH(x), 1))) { + case -2: PyErr_Clear(); case -1: break; + default: ans |= 2; + } + return ans; +} + static inline UnderlineHyperlinks underline_hyperlinks(PyObject *x) { const char *in = PyUnicode_AsUTF8(x); @@ -440,7 +457,7 @@ tab_bar_margin_height(PyObject *val, Options *opts) { opts->tab_bar_margin_height.inner = PyFloat_AsDouble(PyTuple_GET_ITEM(val, 1)); } -static void +static inline void window_logo_scale(PyObject *src, Options *opts) { opts->window_logo_scale.width = PyFloat_AsFloat(PyTuple_GET_ITEM(src, 0)); opts->window_logo_scale.height = PyFloat_AsFloat(PyTuple_GET_ITEM(src, 1)); diff --git a/kitty/state.h b/kitty/state.h index 19696c774..b4896e5d1 100644 --- a/kitty/state.h +++ b/kitty/state.h @@ -123,6 +123,7 @@ typedef struct { } *entries; } font_features; struct { Animation *cursor, *visual_bell; } animation; + unsigned undercurl_style; } Options; typedef struct WindowLogoRenderData {