diff --git a/kitty/fast_data_types.pyi b/kitty/fast_data_types.pyi index 72b367cc0..298d55b84 100644 --- a/kitty/fast_data_types.pyi +++ b/kitty/fast_data_types.pyi @@ -6,6 +6,7 @@ from typing import ( import termios from kitty.boss import Boss +from kitty.fonts import FontFeature from kitty.fonts.render import FontObject from kitty.options_stub import Options @@ -886,7 +887,7 @@ def set_font_data( descriptor_for_idx: Callable[[int], Tuple[FontObject, bool, bool]], bold: int, italic: int, bold_italic: int, num_symbol_fonts: int, symbol_maps: Tuple[Tuple[int, int, int], ...], font_sz_in_pts: float, - font_feature_settings: Dict[str, Tuple[str, ...]] + font_feature_settings: Dict[str, Tuple[FontFeature, ...]] ) -> None: pass diff --git a/kitty/fonts/__init__.py b/kitty/fonts/__init__.py index 414860ef6..a1fd16270 100644 --- a/kitty/fonts/__init__.py +++ b/kitty/fonts/__init__.py @@ -11,9 +11,13 @@ class ListedFont(TypedDict): is_monospace: bool -class FontFeature(str): +class FontFeature: - def __new__(cls, name: str, parsed: bytes) -> 'FontFeature': - ans: FontFeature = str.__new__(cls, name) - ans.parsed = parsed # type: ignore - return ans + __slots__ = 'name', 'parsed' + + def __init__(self, name: str, parsed: bytes): + self.name = name + self.parsed = parsed + + def __repr__(self) -> str: + return repr(self.name) diff --git a/kitty/fonts/core_text.py b/kitty/fonts/core_text.py index 705caa1d5..f33f2ce17 100644 --- a/kitty/fonts/core_text.py +++ b/kitty/fonts/core_text.py @@ -6,6 +6,7 @@ import re from typing import Dict, Generator, Iterable, List, Optional, Tuple from kitty.fast_data_types import coretext_all_fonts +from kitty.fonts import FontFeature from kitty.options_stub import Options from kitty.typing import CoreTextFont from kitty.utils import log_error @@ -50,7 +51,7 @@ def list_fonts() -> Generator[ListedFont, None, None]: yield {'family': f, 'full_name': fn, 'postscript_name': fd['postscript_name'] or '', 'is_monospace': is_mono} -def find_font_features(postscript_name: str) -> Tuple[str, ...]: +def find_font_features(postscript_name: str) -> Tuple[FontFeature, ...]: """Not Implemented""" return () diff --git a/kitty/fonts/fontconfig.py b/kitty/fonts/fontconfig.py index 619340232..cd85f514c 100644 --- a/kitty/fonts/fontconfig.py +++ b/kitty/fonts/fontconfig.py @@ -71,7 +71,7 @@ def fc_match(family: str, bold: bool, italic: bool, spacing: int = FC_MONO) -> F return fc_match_impl(family, bold, italic, spacing) -def find_font_features(postscript_name: str) -> Tuple[str, ...]: +def find_font_features(postscript_name: str) -> Tuple[FontFeature, ...]: pat = fc_match_postscript_name(postscript_name) if pat.get('postscript_name') != postscript_name or 'fontfeatures' not in pat: diff --git a/kitty/options_stub.py b/kitty/options_stub.py index 6ed5e9d81..5e9f40c46 100644 --- a/kitty/options_stub.py +++ b/kitty/options_stub.py @@ -17,11 +17,12 @@ def generate_stub(): all_options, special_types={ 'symbol_map': 'typing.Dict[typing.Tuple[int, int], str]', - 'font_features': 'typing.Dict[str, typing.Tuple[str, ...]]' + 'font_features': 'typing.Dict[str, typing.Tuple[FontFeature, ...]]' }, preamble_lines=( 'from kitty.types import SingleKey', 'from kitty.config import KeyAction, KeyMap, SequenceMap, MouseMap', + 'from kitty.fonts import FontFeature', ), extra_fields=( ('keymap', 'KeyMap'),