diff --git a/kitty/fast_data_types.pyi b/kitty/fast_data_types.pyi index 998342fdf..b2ffb6e86 100644 --- a/kitty/fast_data_types.pyi +++ b/kitty/fast_data_types.pyi @@ -410,7 +410,7 @@ class FontConfigPattern(TypedDict): postscript_name: str style: str spacing: str - fontfeatures: str + fontfeatures: List[str] weight: int width: int slant: int diff --git a/kitty/fontconfig.c b/kitty/fontconfig.c index 7b210d8fc..9c95b4827 100644 --- a/kitty/fontconfig.c +++ b/kitty/fontconfig.c @@ -37,7 +37,21 @@ pattern_as_dict(FcPattern *pat) { if (PyDict_SetItemString(ans, #name, p) != 0) { Py_CLEAR(p); Py_CLEAR(ans); return NULL; } \ Py_CLEAR(p); \ }} + +#define L(type, get, which, conv, name) { \ + type out; PyObject *p; int n = 0; \ + PyObject *l = PyList_New(0); \ + while (get(pat, which, n, &out) == FcResultMatch) { \ + p = conv(out); if (p == NULL) { Py_CLEAR(l); Py_CLEAR(ans); return NULL; } \ + if (PyList_Append(l, p) != 0) { Py_CLEAR(p); Py_CLEAR(l); Py_CLEAR(ans); return NULL; } \ + Py_CLEAR(p); \ + n++; \ + } \ + if (PyDict_SetItemString(ans, #name, l) != 0) { Py_CLEAR(l); Py_CLEAR(ans); return NULL; } \ + Py_CLEAR(l); \ +} #define S(which, key) G(FcChar8*, FcPatternGetString, which, PS, key) +#define LS(which, key) L(FcChar8*, FcPatternGetString, which, PS, key) #define I(which, key) G(int, FcPatternGetInteger, which, PyLong_FromLong, key) #define B(which, key) G(int, FcPatternGetBool, which, pybool, key) #define E(which, key, conv) G(int, FcPatternGetInteger, which, conv, key) @@ -46,7 +60,7 @@ pattern_as_dict(FcPattern *pat) { S(FC_STYLE, style); S(FC_FULLNAME, full_name); S(FC_POSTSCRIPT_NAME, postscript_name); - S(FC_FONT_FEATURES, fontfeatures); + LS(FC_FONT_FEATURES, fontfeatures); I(FC_WEIGHT, weight); I(FC_WIDTH, width) I(FC_SLANT, slant); diff --git a/kitty/fonts/fontconfig.py b/kitty/fonts/fontconfig.py index 44cf7b369..88c323788 100644 --- a/kitty/fonts/fontconfig.py +++ b/kitty/fonts/fontconfig.py @@ -78,7 +78,7 @@ def find_font_features(postscript_name: str) -> Tuple[str, ...]: return tuple() features = [] - for feat in pat['fontfeatures'].split(): + for feat in pat['fontfeatures']: try: parsed = parse_font_feature(feat) except ValueError: