From aa864ea348a28ae3dea6df325841588fc33c741b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 29 Jul 2026 07:48:07 +0530 Subject: [PATCH] Add option for custom shaders --- kitty/boss.py | 4 + kitty/options/definition.py | 18 + kitty/options/parse.py | 282 ++-- kitty/options/to-c-generated.h | 15 - kitty/options/types.py | 2196 ++++++++++---------------------- kitty/options/utils.py | 26 +- 6 files changed, 791 insertions(+), 1750 deletions(-) diff --git a/kitty/boss.py b/kitty/boss.py index e5677a49d..e6fa5d7e2 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -3457,6 +3457,10 @@ class Boss: clear_caches() + from .shaders.slang import custom_shader + + custom_shader.cache_clear() + def safe_delete_temp_file(self, path: str) -> None: if is_path_in_temp_dir(path): with suppress(FileNotFoundError): diff --git a/kitty/options/definition.py b/kitty/options/definition.py index 5da8e1b03..a78d40005 100644 --- a/kitty/options/definition.py +++ b/kitty/options/definition.py @@ -2858,6 +2858,24 @@ they will override any variables set by other :opt:`env` directives. """, ) +opt( + '+custom_shader', + '', + option_type='custom_shader', + add_to_default=False, + long_text=""" +Specify custom shaders to modify rendering. The syntax is:: + + SLOT shader_name shader_name ... + +Can be specified multiple times. Here SLOT is a position in the redering pipeline, such as :code:`after-window-background`, +or :code:`window-end`. Shader names are shader filenames or paths without +the trailing :file:`.slang` suffix. They are looked for in the shaders directory inside the +kitty config directory and if not found there, they are loaded from the builtin +kitty custom shaders. + """, +) + opt( '+filter_notification', '', diff --git a/kitty/options/parse.py b/kitty/options/parse.py index 475e08c9f..433c1ce83 100644 --- a/kitty/options/parse.py +++ b/kitty/options/parse.py @@ -4,99 +4,35 @@ import typing import collections.abc # noqa: F401, RUF100 from kitty.conf.utils import ( - merge_dicts, - positive_float, - positive_int, - python_string, - signed_unit_float, - to_bool, - to_cmdline, - to_color, - to_color_or_none, - unit_float, + merge_dicts, positive_float, positive_int, python_string, signed_unit_float, to_bool, to_cmdline, + to_color, to_color_or_none, unit_float ) from kitty.options.utils import ( - action_alias, - active_tab_title_template, - allow_hyperlinks, - background_images, - bell_on_tab, - box_drawing_scale, - clear_all_mouse_actions, - clear_all_shortcuts, - clipboard_control, - clone_source_strategies, - config_or_absolute_path, - confirm_close, - copy_on_select, - cursor_blink_interval, - cursor_text_color, - cursor_trail_decay, - cursor_trail_start_threshold, - deprecated_adjust_line_height, - deprecated_hide_window_decorations_aliases, - deprecated_macos_show_window_title_in_menubar_alias, - deprecated_scrollback_indicator_opacity, - deprecated_send_text, - disable_ligatures, - edge_width, - env, - filter_notification, - font_features, - hide_window_decorations, - macos_option_as_alt, - macos_titlebar_color, - menu_map, - modify_font, - mouse_hide_wait, - narrow_symbols, - notify_on_cmd_finish, - optional_edge_width, - parse_font_spec, - parse_map, - parse_mouse_map, - paste_actions, - pointer_shape_when_dragging, - remote_control_password, - resize_debounce_time, - scrollback_lines, - scrollback_pager_history_size, - scrollbar_color, - shell_integration, - show_hyperlink_targets, - store_multiple, - symbol_map, - tab_activity_symbol, - tab_bar_edge, - tab_bar_margin_height, - tab_bar_min_tabs, - tab_fade, - tab_font_style, - tab_separator, - tab_title_template, - text_fg_override_threshold, - titlebar_color, - to_cursor_shape, - to_cursor_unfocused_shape, - to_font_size, - to_layout_names, - to_modifiers, - transparent_background_colors, - underline_exclusion, - url_prefixes, - url_style, - visual_bell_duration, - visual_window_select_characters, - window_border_width, - window_logo_scale, - window_size, + action_alias, active_tab_title_template, allow_hyperlinks, background_images, bell_on_tab, + box_drawing_scale, clear_all_mouse_actions, clear_all_shortcuts, clipboard_control, + clone_source_strategies, config_or_absolute_path, confirm_close, copy_on_select, + cursor_blink_interval, cursor_text_color, cursor_trail_decay, cursor_trail_start_threshold, + custom_shader, deprecated_adjust_line_height, deprecated_hide_window_decorations_aliases, + deprecated_macos_show_window_title_in_menubar_alias, deprecated_scrollback_indicator_opacity, + deprecated_send_text, disable_ligatures, edge_width, env, filter_notification, font_features, + hide_window_decorations, macos_option_as_alt, macos_titlebar_color, menu_map, modify_font, + mouse_hide_wait, narrow_symbols, notify_on_cmd_finish, optional_edge_width, parse_font_spec, + parse_map, parse_mouse_map, paste_actions, pointer_shape_when_dragging, remote_control_password, + resize_debounce_time, scrollback_lines, scrollback_pager_history_size, scrollbar_color, + shell_integration, show_hyperlink_targets, store_multiple, symbol_map, tab_activity_symbol, + tab_bar_edge, tab_bar_margin_height, tab_bar_min_tabs, tab_fade, tab_font_style, tab_separator, + tab_title_template, text_fg_override_threshold, titlebar_color, to_cursor_shape, + to_cursor_unfocused_shape, to_font_size, to_layout_names, to_modifiers, + transparent_background_colors, underline_exclusion, url_prefixes, url_style, visual_bell_duration, + visual_window_select_characters, window_border_width, window_logo_scale, window_size ) class Parser: + def action_alias(self, val: str, ans: dict[str, typing.Any]) -> None: for k, v in action_alias(val): - ans['action_alias'][k] = v + ans["action_alias"][k] = v def active_border_color(self, val: str, ans: dict[str, typing.Any]) -> None: ans['active_border_color'] = to_color_or_none(val) @@ -119,8 +55,8 @@ class Parser: def allow_cloning(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_allow_cloning: - raise ValueError(f'The value {val} is not a valid choice for allow_cloning') - ans['allow_cloning'] = val + raise ValueError(f"The value {val} is not a valid choice for allow_cloning") + ans["allow_cloning"] = val choices_for_allow_cloning = frozenset(('yes', 'y', 'true', 'no', 'n', 'false', 'ask')) @@ -130,8 +66,8 @@ class Parser: def allow_remote_control(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_allow_remote_control: - raise ValueError(f'The value {val} is not a valid choice for allow_remote_control') - ans['allow_remote_control'] = val + raise ValueError(f"The value {val} is not a valid choice for allow_remote_control") + ans["allow_remote_control"] = val choices_for_allow_remote_control = frozenset(('password', 'socket-only', 'socket', 'no', 'n', 'false', 'yes', 'y', 'true')) @@ -150,8 +86,8 @@ class Parser: def background_image_layout(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_background_image_layout: - raise ValueError(f'The value {val} is not a valid choice for background_image_layout') - ans['background_image_layout'] = val + raise ValueError(f"The value {val} is not a valid choice for background_image_layout") + ans["background_image_layout"] = val choices_for_background_image_layout = frozenset(('mirror-tiled', 'scaled', 'tiled', 'clamped', 'centered', 'cscaled')) @@ -1022,48 +958,17 @@ class Parser: def cursor_underline_thickness(self, val: str, ans: dict[str, typing.Any]) -> None: ans['cursor_underline_thickness'] = positive_float(val) + def custom_shader(self, val: str, ans: dict[str, typing.Any]) -> None: + for k, v in custom_shader(val, ans["custom_shader"]): + ans["custom_shader"][k] = v + def default_pointer_shape(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_default_pointer_shape: - raise ValueError(f'The value {val} is not a valid choice for default_pointer_shape') - ans['default_pointer_shape'] = val + raise ValueError(f"The value {val} is not a valid choice for default_pointer_shape") + ans["default_pointer_shape"] = val - choices_for_default_pointer_shape = frozenset( - ( - 'arrow', - 'beam', - 'text', - 'pointer', - 'hand', - 'help', - 'wait', - 'progress', - 'crosshair', - 'cell', - 'vertical-text', - 'move', - 'e-resize', - 'ne-resize', - 'nw-resize', - 'n-resize', - 'se-resize', - 'sw-resize', - 's-resize', - 'w-resize', - 'ew-resize', - 'ns-resize', - 'nesw-resize', - 'nwse-resize', - 'zoom-in', - 'zoom-out', - 'alias', - 'copy', - 'not-allowed', - 'no-drop', - 'grab', - 'grabbing', - ) - ) + choices_for_default_pointer_shape = frozenset(('arrow', 'beam', 'text', 'pointer', 'hand', 'help', 'wait', 'progress', 'crosshair', 'cell', 'vertical-text', 'move', 'e-resize', 'ne-resize', 'nw-resize', 'n-resize', 'se-resize', 'sw-resize', 's-resize', 'w-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', 'alias', 'copy', 'not-allowed', 'no-drop', 'grab', 'grabbing')) def detect_urls(self, val: str, ans: dict[str, typing.Any]) -> None: ans['detect_urls'] = to_bool(val) @@ -1096,25 +1001,25 @@ class Parser: ans['enabled_layouts'] = to_layout_names(val) def env(self, val: str, ans: dict[str, typing.Any]) -> None: - for k, v in env(val, ans['env']): - ans['env'][k] = v + for k, v in env(val, ans["env"]): + ans["env"][k] = v def exe_search_path(self, val: str, ans: dict[str, typing.Any]) -> None: - for k, v in store_multiple(val, ans['exe_search_path']): - ans['exe_search_path'][k] = v + for k, v in store_multiple(val, ans["exe_search_path"]): + ans["exe_search_path"][k] = v def file_transfer_confirmation_bypass(self, val: str, ans: dict[str, typing.Any]) -> None: ans['file_transfer_confirmation_bypass'] = str(val) def filter_notification(self, val: str, ans: dict[str, typing.Any]) -> None: - for k, v in filter_notification(val, ans['filter_notification']): - ans['filter_notification'][k] = v + for k, v in filter_notification(val, ans["filter_notification"]): + ans["filter_notification"][k] = v def focus_follows_mouse(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_focus_follows_mouse: - raise ValueError(f'The value {val} is not a valid choice for focus_follows_mouse') - ans['focus_follows_mouse'] = val + raise ValueError(f"The value {val} is not a valid choice for focus_follows_mouse") + ans["focus_follows_mouse"] = val choices_for_focus_follows_mouse = frozenset(('no', 'n', 'false', 'y', 'yes', 'true', 'drop')) @@ -1123,7 +1028,7 @@ class Parser: def font_features(self, val: str, ans: dict[str, typing.Any]) -> None: for k, v in font_features(val): - ans['font_features'][k] = v + ans["font_features"][k] = v def font_size(self, val: str, ans: dict[str, typing.Any]) -> None: ans['font_size'] = to_font_size(val) @@ -1169,7 +1074,7 @@ class Parser: def kitten_alias(self, val: str, ans: dict[str, typing.Any]) -> None: for k, v in action_alias(val): - ans['kitten_alias'][k] = v + ans["kitten_alias"][k] = v def kitty_mod(self, val: str, ans: dict[str, typing.Any]) -> None: ans['kitty_mod'] = to_modifiers(val) @@ -1180,8 +1085,8 @@ class Parser: def linux_display_server(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_linux_display_server: - raise ValueError(f'The value {val} is not a valid choice for linux_display_server') - ans['linux_display_server'] = val + raise ValueError(f"The value {val} is not a valid choice for linux_display_server") + ans["linux_display_server"] = val choices_for_linux_display_server = frozenset(('auto', 'wayland', 'x11')) @@ -1191,8 +1096,8 @@ class Parser: def macos_colorspace(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_macos_colorspace: - raise ValueError(f'The value {val} is not a valid choice for macos_colorspace') - ans['macos_colorspace'] = val + raise ValueError(f"The value {val} is not a valid choice for macos_colorspace") + ans["macos_colorspace"] = val choices_for_macos_colorspace = frozenset(('srgb', 'default', 'displayp3')) @@ -1223,8 +1128,8 @@ class Parser: def macos_show_window_title_in(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_macos_show_window_title_in: - raise ValueError(f'The value {val} is not a valid choice for macos_show_window_title_in') - ans['macos_show_window_title_in'] = val + raise ValueError(f"The value {val} is not a valid choice for macos_show_window_title_in") + ans["macos_show_window_title_in"] = val choices_for_macos_show_window_title_in = frozenset(('all', 'menubar', 'none', 'window')) @@ -1265,12 +1170,12 @@ class Parser: ans['mark3_foreground'] = to_color(val) def menu_map(self, val: str, ans: dict[str, typing.Any]) -> None: - for k, v in menu_map(val, ans['menu_map']): - ans['menu_map'][k] = v + for k, v in menu_map(val, ans["menu_map"]): + ans["menu_map"][k] = v def modify_font(self, val: str, ans: dict[str, typing.Any]) -> None: for k, v in modify_font(val): - ans['modify_font'][k] = v + ans["modify_font"][k] = v def momentum_scroll(self, val: str, ans: dict[str, typing.Any]) -> None: ans['momentum_scroll'] = unit_float(val) @@ -1280,7 +1185,7 @@ class Parser: def narrow_symbols(self, val: str, ans: dict[str, typing.Any]) -> None: for k, v in narrow_symbols(val): - ans['narrow_symbols'][k] = v + ans["narrow_symbols"][k] = v def notify_on_cmd_finish(self, val: str, ans: dict[str, typing.Any]) -> None: ans['notify_on_cmd_finish'] = notify_on_cmd_finish(val) @@ -1291,16 +1196,16 @@ class Parser: def padding_fill_strategy(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_padding_fill_strategy: - raise ValueError(f'The value {val} is not a valid choice for padding_fill_strategy') - ans['padding_fill_strategy'] = val + raise ValueError(f"The value {val} is not a valid choice for padding_fill_strategy") + ans["padding_fill_strategy"] = val choices_for_padding_fill_strategy = frozenset(('background', 'neighboring_cell')) def palette_generate(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_palette_generate: - raise ValueError(f'The value {val} is not a valid choice for palette_generate') - ans['palette_generate'] = val + raise ValueError(f"The value {val} is not a valid choice for palette_generate") + ans["palette_generate"] = val choices_for_palette_generate = frozenset(('fixed', 'semantic', 'legacy')) @@ -1313,8 +1218,8 @@ class Parser: def placement_strategy(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_placement_strategy: - raise ValueError(f'The value {val} is not a valid choice for placement_strategy') - ans['placement_strategy'] = val + raise ValueError(f"The value {val} is not a valid choice for placement_strategy") + ans["placement_strategy"] = val choices_for_placement_strategy = frozenset(('top-left', 'top', 'top-right', 'left', 'center', 'right', 'bottom-left', 'bottom', 'bottom-right')) @@ -1324,16 +1229,16 @@ class Parser: def pointer_shape_when_grabbed(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_pointer_shape_when_grabbed: - raise ValueError(f'The value {val} is not a valid choice for pointer_shape_when_grabbed') - ans['pointer_shape_when_grabbed'] = val + raise ValueError(f"The value {val} is not a valid choice for pointer_shape_when_grabbed") + ans["pointer_shape_when_grabbed"] = val choices_for_pointer_shape_when_grabbed = choices_for_default_pointer_shape def progress_bar(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_progress_bar: - raise ValueError(f'The value {val} is not a valid choice for progress_bar') - ans['progress_bar'] = val + raise ValueError(f"The value {val} is not a valid choice for progress_bar") + ans["progress_bar"] = val choices_for_progress_bar = frozenset(('left', 'right', 'top', 'bottom', 'hidden')) @@ -1344,8 +1249,8 @@ class Parser: ans['remember_window_size'] = to_bool(val) def remote_control_password(self, val: str, ans: dict[str, typing.Any]) -> None: - for k, v in remote_control_password(val, ans['remote_control_password']): - ans['remote_control_password'][k] = v + for k, v in remote_control_password(val, ans["remote_control_password"]): + ans["remote_control_password"][k] = v def repaint_delay(self, val: str, ans: dict[str, typing.Any]) -> None: ans['repaint_delay'] = positive_int(val) @@ -1371,8 +1276,8 @@ class Parser: def scrollbar(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_scrollbar: - raise ValueError(f'The value {val} is not a valid choice for scrollbar') - ans['scrollbar'] = val + raise ValueError(f"The value {val} is not a valid choice for scrollbar") + ans["scrollbar"] = val choices_for_scrollbar = frozenset(('scrolled', 'always', 'never', 'hovered', 'scrolled-and-hovered')) @@ -1448,14 +1353,14 @@ class Parser: def strip_trailing_spaces(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_strip_trailing_spaces: - raise ValueError(f'The value {val} is not a valid choice for strip_trailing_spaces') - ans['strip_trailing_spaces'] = val + raise ValueError(f"The value {val} is not a valid choice for strip_trailing_spaces") + ans["strip_trailing_spaces"] = val choices_for_strip_trailing_spaces = frozenset(('always', 'never', 'smart')) def symbol_map(self, val: str, ans: dict[str, typing.Any]) -> None: for k, v in symbol_map(val): - ans['symbol_map'][k] = v + ans["symbol_map"][k] = v def sync_to_monitor(self, val: str, ans: dict[str, typing.Any]) -> None: ans['sync_to_monitor'] = to_bool(val) @@ -1466,8 +1371,8 @@ class Parser: def tab_bar_align(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_tab_bar_align: - raise ValueError(f'The value {val} is not a valid choice for tab_bar_align') - ans['tab_bar_align'] = val + raise ValueError(f"The value {val} is not a valid choice for tab_bar_align") + ans["tab_bar_align"] = val choices_for_tab_bar_align = frozenset(('start', 'center', 'end', 'left', 'right')) @@ -1498,8 +1403,8 @@ class Parser: def tab_bar_style(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_tab_bar_style: - raise ValueError(f'The value {val} is not a valid choice for tab_bar_style') - ans['tab_bar_style'] = val + raise ValueError(f"The value {val} is not a valid choice for tab_bar_style") + ans["tab_bar_style"] = val choices_for_tab_bar_style = frozenset(('fade', 'hidden', 'powerline', 'separator', 'slant', 'custom')) @@ -1509,8 +1414,8 @@ class Parser: def tab_powerline_style(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_tab_powerline_style: - raise ValueError(f'The value {val} is not a valid choice for tab_powerline_style') - ans['tab_powerline_style'] = val + raise ValueError(f"The value {val} is not a valid choice for tab_powerline_style") + ans["tab_powerline_style"] = val choices_for_tab_powerline_style = frozenset(('angled', 'round', 'slanted')) @@ -1520,8 +1425,8 @@ class Parser: def tab_switch_strategy(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_tab_switch_strategy: - raise ValueError(f'The value {val} is not a valid choice for tab_switch_strategy') - ans['tab_switch_strategy'] = val + raise ValueError(f"The value {val} is not a valid choice for tab_switch_strategy") + ans["tab_switch_strategy"] = val choices_for_tab_switch_strategy = frozenset(('last', 'left', 'previous', 'right')) @@ -1537,8 +1442,8 @@ class Parser: def terminfo_type(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_terminfo_type: - raise ValueError(f'The value {val} is not a valid choice for terminfo_type') - ans['terminfo_type'] = val + raise ValueError(f"The value {val} is not a valid choice for terminfo_type") + ans["terminfo_type"] = val choices_for_terminfo_type = frozenset(('path', 'direct', 'none')) @@ -1557,8 +1462,8 @@ class Parser: def undercurl_style(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_undercurl_style: - raise ValueError(f'The value {val} is not a valid choice for undercurl_style') - ans['undercurl_style'] = val + raise ValueError(f"The value {val} is not a valid choice for undercurl_style") + ans["undercurl_style"] = val choices_for_undercurl_style = frozenset(('thin-sparse', 'thin-dense', 'thick-sparse', 'thick-dense')) @@ -1568,8 +1473,8 @@ class Parser: def underline_hyperlinks(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_underline_hyperlinks: - raise ValueError(f'The value {val} is not a valid choice for underline_hyperlinks') - ans['underline_hyperlinks'] = val + raise ValueError(f"The value {val} is not a valid choice for underline_hyperlinks") + ans["underline_hyperlinks"] = val choices_for_underline_hyperlinks = frozenset(('hover', 'always', 'never')) @@ -1598,8 +1503,8 @@ class Parser: ans['visual_window_select_characters'] = visual_window_select_characters(val) def watcher(self, val: str, ans: dict[str, typing.Any]) -> None: - for k, v in store_multiple(val, ans['watcher']): - ans['watcher'][k] = v + for k, v in store_multiple(val, ans["watcher"]): + ans["watcher"][k] = v def wayland_enable_ime(self, val: str, ans: dict[str, typing.Any]) -> None: ans['wayland_enable_ime'] = to_bool(val) @@ -1631,8 +1536,8 @@ class Parser: def window_logo_position(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_window_logo_position: - raise ValueError(f'The value {val} is not a valid choice for window_logo_position') - ans['window_logo_position'] = val + raise ValueError(f"The value {val} is not a valid choice for window_logo_position") + ans["window_logo_position"] = val choices_for_window_logo_position = choices_for_placement_strategy @@ -1654,8 +1559,8 @@ class Parser: def window_title_bar(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_window_title_bar: - raise ValueError(f'The value {val} is not a valid choice for window_title_bar') - ans['window_title_bar'] = val + raise ValueError(f"The value {val} is not a valid choice for window_title_bar") + ans["window_title_bar"] = val choices_for_window_title_bar = frozenset(('top', 'bottom')) @@ -1668,8 +1573,8 @@ class Parser: def window_title_bar_align(self, val: str, ans: dict[str, typing.Any]) -> None: val = val.lower() if val not in self.choices_for_window_title_bar_align: - raise ValueError(f'The value {val} is not a valid choice for window_title_bar_align') - ans['window_title_bar_align'] = val + raise ValueError(f"The value {val} is not a valid choice for window_title_bar_align") + ans["window_title_bar_align"] = val choices_for_window_title_bar_align = frozenset(('left', 'center', 'right')) @@ -1721,6 +1626,7 @@ class Parser: def create_result_dict() -> dict[str, typing.Any]: return { 'action_alias': {}, + 'custom_shader': {}, 'env': {}, 'exe_search_path': {}, 'filter_notification': {}, diff --git a/kitty/options/to-c-generated.h b/kitty/options/to-c-generated.h index 156fb679c..9990ec275 100644 --- a/kitty/options/to-c-generated.h +++ b/kitty/options/to-c-generated.h @@ -122,19 +122,6 @@ convert_from_opts_text_composition_strategy(PyObject *py_opts, Options *opts) { Py_DECREF(ret); } -static void -convert_from_python_text_fg_override_threshold(PyObject *val, Options *opts) { - opts->text_fg_override_threshold = text_fg_override_threshold(val); -} - -static void -convert_from_opts_text_fg_override_threshold(PyObject *py_opts, Options *opts) { - PyObject *ret = PyObject_GetAttrString(py_opts, "text_fg_override_threshold"); - if (ret == NULL) return; - convert_from_python_text_fg_override_threshold(ret, opts); - Py_DECREF(ret); -} - static void convert_from_python_cursor_shape(PyObject *val, Options *opts) { opts->cursor_shape = PyLong_AsLong(val); @@ -1572,8 +1559,6 @@ convert_opts_from_python_opts(PyObject *py_opts, Options *opts) { if (PyErr_Occurred()) return false; convert_from_opts_text_composition_strategy(py_opts, opts); if (PyErr_Occurred()) return false; - convert_from_opts_text_fg_override_threshold(py_opts, opts); - if (PyErr_Occurred()) return false; convert_from_opts_cursor_shape(py_opts, opts); if (PyErr_Occurred()) return false; convert_from_opts_cursor_shape_unfocused(py_opts, opts); diff --git a/kitty/options/types.py b/kitty/options/types.py index 6c3c920c8..b1f5df699 100644 --- a/kitty/options/types.py +++ b/kitty/options/types.py @@ -11,16 +11,8 @@ import kitty.fast_data_types from kitty.fonts import FontSpec import kitty.fonts from kitty.options.utils import ( - AliasMap, - KeyDefinition, - KeyFallbackType, - KeyMapOptions, - KeyboardModeMap, - MouseHideWait, - MouseMap, - MouseMapping, - NotifyOnCmdFinish, - TabBarMarginHeight, + AliasMap, KeyDefinition, KeyFallbackType, KeyMapOptions, KeyboardModeMap, MouseHideWait, MouseMap, + MouseMapping, NotifyOnCmdFinish, TabBarMarginHeight ) import kitty.options.utils from kitty.types import FloatEdges @@ -29,40 +21,7 @@ import kitty.types choices_for_allow_cloning = typing.Literal['yes', 'y', 'true', 'no', 'n', 'false', 'ask'] choices_for_allow_remote_control = typing.Literal['password', 'socket-only', 'socket', 'no', 'n', 'false', 'yes', 'y', 'true'] choices_for_background_image_layout = typing.Literal['mirror-tiled', 'scaled', 'tiled', 'clamped', 'centered', 'cscaled'] -choices_for_default_pointer_shape = typing.Literal[ - 'arrow', - 'beam', - 'text', - 'pointer', - 'hand', - 'help', - 'wait', - 'progress', - 'crosshair', - 'cell', - 'vertical-text', - 'move', - 'e-resize', - 'ne-resize', - 'nw-resize', - 'n-resize', - 'se-resize', - 'sw-resize', - 's-resize', - 'w-resize', - 'ew-resize', - 'ns-resize', - 'nesw-resize', - 'nwse-resize', - 'zoom-in', - 'zoom-out', - 'alias', - 'copy', - 'not-allowed', - 'no-drop', - 'grab', - 'grabbing', -] +choices_for_default_pointer_shape = typing.Literal['arrow', 'beam', 'text', 'pointer', 'hand', 'help', 'wait', 'progress', 'crosshair', 'cell', 'vertical-text', 'move', 'e-resize', 'ne-resize', 'nw-resize', 'n-resize', 'se-resize', 'sw-resize', 's-resize', 'w-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', 'alias', 'copy', 'not-allowed', 'no-drop', 'grab', 'grabbing'] choices_for_focus_follows_mouse = typing.Literal['no', 'n', 'false', 'y', 'yes', 'true', 'drop'] choices_for_linux_display_server = typing.Literal['auto', 'wayland', 'x11'] choices_for_macos_colorspace = typing.Literal['srgb', 'default', 'displayp3'] @@ -390,6 +349,7 @@ option_names = ( 'cursor_trail_decay', 'cursor_trail_start_threshold', 'cursor_underline_thickness', + 'custom_shader', 'default_pointer_shape', 'detect_urls', 'dim_opacity', @@ -586,12 +546,8 @@ class Options: bell_border_color: Color = Color(255, 90, 0) bell_on_tab: str = '🔔 ' bell_path: str | None = None - bold_font: FontSpec = FontSpec( - family=None, style=None, postscript_name=None, full_name=None, system='auto', axes=(), variable_name=None, features=(), created_from_string='auto' - ) - bold_italic_font: FontSpec = FontSpec( - family=None, style=None, postscript_name=None, full_name=None, system='auto', axes=(), variable_name=None, features=(), created_from_string='auto' - ) + bold_font: FontSpec = FontSpec(family=None, style=None, postscript_name=None, full_name=None, system='auto', axes=(), variable_name=None, features=(), created_from_string='auto') + bold_italic_font: FontSpec = FontSpec(family=None, style=None, postscript_name=None, full_name=None, system='auto', axes=(), variable_name=None, features=(), created_from_string='auto') box_drawing_scale: tuple[float, float, float, float] = (0.001, 1.0, 1.5, 2.0) clear_all_mouse_actions: bool = False clear_all_shortcuts: bool = False @@ -606,11 +562,7 @@ class Options: copy_on_select: str = '' cursor: kitty.fast_data_types.Color | None = Color(204, 204, 204) cursor_beam_thickness: float = 1.5 - cursor_blink_interval: tuple[float, kitty.options.utils.EasingFunction, kitty.options.utils.EasingFunction] = ( - -1.0, - kitty.options.utils.EasingFunction(), - kitty.options.utils.EasingFunction(), - ) + cursor_blink_interval: tuple[float, kitty.options.utils.EasingFunction, kitty.options.utils.EasingFunction] = (-1.0, kitty.options.utils.EasingFunction(), kitty.options.utils.EasingFunction()) cursor_shape: int = 1 cursor_shape_unfocused: int = 4 cursor_stop_blinking_after: float = 15.0 @@ -633,17 +585,7 @@ class Options: enabled_layouts: list[str] = ['fat', 'grid', 'horizontal', 'splits', 'stack', 'tall', 'vertical'] file_transfer_confirmation_bypass: str = '' focus_follows_mouse: choices_for_focus_follows_mouse = 'no' - font_family: FontSpec = FontSpec( - family=None, - style=None, - postscript_name=None, - full_name=None, - system='monospace', - axes=(), - variable_name=None, - features=(), - created_from_string='monospace', - ) + font_family: FontSpec = FontSpec(family=None, style=None, postscript_name=None, full_name=None, system='monospace', axes=(), variable_name=None, features=(), created_from_string='monospace') font_size: float = 11.0 force_ltr: bool = False foreground: Color = Color(221, 221, 221) @@ -657,9 +599,7 @@ class Options: initial_window_height: tuple[int, str] = (400, 'px') initial_window_width: tuple[int, str] = (640, 'px') input_delay: int = 3 - italic_font: FontSpec = FontSpec( - family=None, style=None, postscript_name=None, full_name=None, system='auto', axes=(), variable_name=None, features=(), created_from_string='auto' - ) + italic_font: FontSpec = FontSpec(family=None, style=None, postscript_name=None, full_name=None, system='auto', axes=(), variable_name=None, features=(), created_from_string='auto') kitty_mod: int = 5 linux_bell_theme: str = '__custom' linux_display_server: choices_for_linux_display_server = 'auto' @@ -687,11 +627,7 @@ class Options: mark3_background: Color = Color(242, 116, 188) mark3_foreground: Color = Color(0, 0, 0) momentum_scroll: float = 0.96 - mouse_hide_wait: MouseHideWait = ( - MouseHideWait(hide_wait=0.0, show_wait=0.0, show_threshold=40, scroll_show=True) - if is_macos - else MouseHideWait(hide_wait=3.0, show_wait=0.0, show_threshold=40, scroll_show=True) - ) + mouse_hide_wait: MouseHideWait = MouseHideWait(hide_wait=0.0, show_wait=0.0, show_threshold=40, scroll_show=True) if is_macos else MouseHideWait(hide_wait=3.0, show_wait=0.0, show_threshold=40, scroll_show=True) notify_on_cmd_finish: NotifyOnCmdFinish = NotifyOnCmdFinish(when='never', duration=5.0, action='notify', cmdline=(), clear_on=('focus', 'next')) open_url_with: list[str] = ['default'] padding_fill_strategy: choices_for_padding_fill_strategy = 'background' @@ -769,11 +705,7 @@ class Options: url_prefixes: tuple[str, ...] = ('file', 'ftp', 'ftps', 'gemini', 'git', 'gopher', 'http', 'https', 'irc', 'ircs', 'kitty', 'mailto', 'news', 'sftp', 'ssh') url_style: int = 3 visual_bell_color: kitty.fast_data_types.Color | None = None - visual_bell_duration: tuple[float, kitty.options.utils.EasingFunction, kitty.options.utils.EasingFunction] = ( - 0.0, - kitty.options.utils.EasingFunction(), - kitty.options.utils.EasingFunction(), - ) + visual_bell_duration: tuple[float, kitty.options.utils.EasingFunction, kitty.options.utils.EasingFunction] = (0.0, kitty.options.utils.EasingFunction(), kitty.options.utils.EasingFunction()) visual_window_select_characters: str = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ' wayland_enable_ime: bool = True wayland_titlebar_color: int = 0 @@ -799,6 +731,7 @@ class Options: window_title_bar_min_windows: int = 0 window_title_template: str = '{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.window}{progress_percent}{title}' action_alias: dict[str, str] = {} + custom_shader: dict[typing.Literal['after-window-background'], tuple[str, ...]] = {} env: dict[str, str] = {} exe_search_path: dict[str, str] = {} filter_notification: dict[str, str] = {} @@ -815,267 +748,40 @@ class Options: alias_map: AliasMap = AliasMap() mouse_map: list[kitty.options.utils.MouseMapping] = [] mousemap: MouseMap = {} - color_table: 'array[int]' = array( - 'L', - ( - 0x000000, - 0xCC0403, - 0x19CB00, - 0xCECB00, - 0x0D73CC, - 0xCB1ED1, - 0x0DCDCD, - 0xDDDDDD, - 0x767676, - 0xF2201F, - 0x23FD00, - 0xFFFD00, - 0x1A8FFF, - 0xFD28FF, - 0x14FFFF, - 0xFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ), - ) + color_table: "array[int]" = array("L", ( + 0x000000, 0xcc0403, 0x19cb00, 0xcecb00, 0x0d73cc, 0xcb1ed1, 0x0dcdcd, 0xdddddd, + 0x767676, 0xf2201f, 0x23fd00, 0xfffd00, 0x1a8fff, 0xfd28ff, 0x14ffff, 0xffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + )) config_paths: tuple[str, ...] = () all_config_paths: tuple[str, ...] = () config_overrides: tuple[str, ...] = () @@ -1110,7 +816,7 @@ class Options: def _asdict(self) -> dict[str, typing.Any]: return {k: self._copy_of_val(k) for k in self} - def _replace(self, **kw: typing.Any) -> 'Options': + def _replace(self, **kw: typing.Any) -> "Options": ans = Options() for name in self: setattr(ans, name, self._copy_of_val(name)) @@ -1124,28 +830,28 @@ class Options: return getattr(self, k) except AttributeError: pass - raise KeyError(f'No option named: {k}') + raise KeyError(f"No option named: {k}") def __getattr__(self, key: str) -> typing.Any: - if key.startswith('color'): + if key.startswith("color"): q = key[5:] if q.isdigit(): k = int(q) if 0 <= k <= 255: x = self.color_table[k] - if x == 0xFFFFFFFF: + if x == 0xffffffff: return None return Color((x >> 16) & 255, (x >> 8) & 255, x & 255) raise AttributeError(key) def __setattr__(self, key: str, val: typing.Any) -> typing.Any: - if key.startswith('color'): + if key.startswith("color"): q = key[5:] if q.isdigit(): k = int(q) if 0 <= k <= 255: if val is None: - self.color_table[k] = 0xFFFFFFFF + self.color_table[k] = 0xffffffff else: self.color_table[k] = int(val) return @@ -1155,6 +861,7 @@ class Options: defaults = Options() defaults.action_alias = {} +defaults.custom_shader = {} defaults.env = {} defaults.exe_search_path = {} defaults.filter_notification = {} @@ -1169,95 +876,23 @@ defaults.watcher = {} defaults.map = [ # copy_to_clipboard - KeyDefinition( - trigger=SingleKey(mods=256, key=99), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='copy_to_clipboard', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=99), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='copy_to_clipboard'), # paste_from_clipboard - KeyDefinition( - trigger=SingleKey(mods=256, key=118), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='paste_from_clipboard', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=118), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='paste_from_clipboard'), # paste_from_selection - KeyDefinition( - trigger=SingleKey(mods=256, key=115), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='paste_from_selection', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=115), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='paste_from_selection'), # paste_from_selection KeyDefinition(trigger=SingleKey(mods=1, key=57348), definition='paste_from_selection'), # pass_selection_to_program - KeyDefinition( - trigger=SingleKey(mods=256, key=111), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='pass_selection_to_program', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=111), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='pass_selection_to_program'), # scroll_line_up KeyDefinition(trigger=SingleKey(mods=256, key=57352), definition='scroll_line_up smooth'), # scroll_line_up - KeyDefinition( - trigger=SingleKey(mods=256, key=107), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='scroll_line_up smooth', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=107), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='scroll_line_up smooth'), # scroll_line_down KeyDefinition(trigger=SingleKey(mods=256, key=57353), definition='scroll_line_down smooth'), # scroll_line_down - KeyDefinition( - trigger=SingleKey(mods=256, key=106), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='scroll_line_down smooth', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=106), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='scroll_line_down smooth'), # scroll_page_up KeyDefinition(trigger=SingleKey(mods=256, key=57354), definition='scroll_page_up'), # scroll_page_down @@ -1267,141 +902,33 @@ defaults.map = [ # scroll_end KeyDefinition(trigger=SingleKey(mods=256, key=57357), definition='scroll_end'), # scroll_to_previous_prompt - KeyDefinition( - trigger=SingleKey(mods=256, key=122), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='scroll_to_prompt -1', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=122), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='scroll_to_prompt -1'), # scroll_to_next_prompt - KeyDefinition( - trigger=SingleKey(mods=256, key=120), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='scroll_to_prompt 1', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=120), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='scroll_to_prompt 1'), # show_scrollback - KeyDefinition( - trigger=SingleKey(mods=256, key=104), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='show_scrollback', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=104), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='show_scrollback'), # show_last_command_output - KeyDefinition( - trigger=SingleKey(mods=256, key=103), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='show_last_command_output', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=103), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='show_last_command_output'), # search_scrollback KeyDefinition(trigger=SingleKey(mods=256, key=47), definition='search_scrollback'), # new_window KeyDefinition(trigger=SingleKey(mods=256, key=57345), definition='new_window'), # new_os_window - KeyDefinition( - trigger=SingleKey(mods=256, key=110), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='new_os_window', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=110), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='new_os_window'), # close_window - KeyDefinition( - trigger=SingleKey(mods=256, key=119), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='close_window', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=119), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='close_window'), # next_window KeyDefinition(trigger=SingleKey(mods=256, key=93), definition='next_window'), # previous_window KeyDefinition(trigger=SingleKey(mods=256, key=91), definition='previous_window'), # move_window_forward - KeyDefinition( - trigger=SingleKey(mods=256, key=102), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='move_window_forward', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=102), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='move_window_forward'), # move_window_backward - KeyDefinition( - trigger=SingleKey(mods=256, key=98), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='move_window_backward', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=98), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='move_window_backward'), # move_window_to_top KeyDefinition(trigger=SingleKey(mods=256, key=96), definition='move_window_to_top'), # start_resizing_window - KeyDefinition( - trigger=SingleKey(mods=256, key=114), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='start_resizing_window', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=114), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='start_resizing_window'), # first_window KeyDefinition(trigger=SingleKey(mods=256, key=49), definition='first_window'), # second_window @@ -1435,65 +962,17 @@ defaults.map = [ # previous_tab KeyDefinition(trigger=SingleKey(mods=5, key=57346), definition='previous_tab'), # new_tab - KeyDefinition( - trigger=SingleKey(mods=256, key=116), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='new_tab', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=116), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='new_tab'), # close_tab - KeyDefinition( - trigger=SingleKey(mods=256, key=113), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='close_tab', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=113), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='close_tab'), # move_tab_forward KeyDefinition(trigger=SingleKey(mods=256, key=46), definition='move_tab_forward'), # move_tab_backward KeyDefinition(trigger=SingleKey(mods=256, key=44), definition='move_tab_backward'), # set_tab_title - KeyDefinition( - trigger=SingleKey(mods=258, key=116), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='set_tab_title', - ), + KeyDefinition(trigger=SingleKey(mods=258, key=116), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='set_tab_title'), # next_layout - KeyDefinition( - trigger=SingleKey(mods=256, key=108), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='next_layout', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=108), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='next_layout'), # increase_font_size KeyDefinition(trigger=SingleKey(mods=256, key=61), definition='change_font_size all +2.0'), # increase_font_size @@ -1507,163 +986,25 @@ defaults.map = [ # reset_font_size KeyDefinition(trigger=SingleKey(mods=256, key=57347), definition='change_font_size all 0'), # open_url - KeyDefinition( - trigger=SingleKey(mods=256, key=101), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='open_url_with_hints', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=101), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='open_url_with_hints'), # insert_selected_path - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=112), - rest=(SingleKey(key=102),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='kitten hints --type path --program -', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=112), rest=(SingleKey(key=102),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='kitten hints --type path --program -'), # open_selected_path - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=112), - rest=(SingleKey(mods=1, key=102),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='kitten hints --type path', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=112), rest=(SingleKey(mods=1, key=102),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='kitten hints --type path'), # insert_chosen_file - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=112), - rest=(SingleKey(key=99),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='kitten choose-files', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=112), rest=(SingleKey(key=99),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='kitten choose-files'), # insert_chosen_directory - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=112), - rest=(SingleKey(key=100),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='kitten choose-files --mode=dir', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=112), rest=(SingleKey(key=100),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='kitten choose-files --mode=dir'), # insert_selected_line - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=112), - rest=(SingleKey(key=108),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='kitten hints --type line --program -', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=112), rest=(SingleKey(key=108),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='kitten hints --type line --program -'), # insert_selected_word - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=112), - rest=(SingleKey(key=119),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='kitten hints --type word --program -', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=112), rest=(SingleKey(key=119),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='kitten hints --type word --program -'), # insert_selected_hash - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=112), - rest=(SingleKey(key=104),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='kitten hints --type hash --program -', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=112), rest=(SingleKey(key=104),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='kitten hints --type hash --program -'), # goto_file_line - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=112), - rest=(SingleKey(key=110),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='kitten hints --type linenum', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=112), rest=(SingleKey(key=110),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='kitten hints --type linenum'), # open_selected_hyperlink - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=112), - rest=(SingleKey(key=121),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='kitten hints --type hyperlink', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=112), rest=(SingleKey(key=121),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='kitten hints --type hyperlink'), # show_kitty_doc KeyDefinition(trigger=SingleKey(mods=256, key=57364), definition='show_kitty_doc overview'), # command_palette @@ -1673,87 +1014,19 @@ defaults.map = [ # toggle_maximized KeyDefinition(trigger=SingleKey(mods=256, key=57373), definition='toggle_maximized'), # input_unicode_character - KeyDefinition( - trigger=SingleKey(mods=256, key=117), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='kitten unicode_input', - ), + KeyDefinition(trigger=SingleKey(mods=256, key=117), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='kitten unicode_input'), # edit_config_file KeyDefinition(trigger=SingleKey(mods=256, key=57365), definition='edit_config_file'), # kitty_shell KeyDefinition(trigger=SingleKey(mods=256, key=57344), definition='kitty_shell window'), # increase_background_opacity - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=97), - rest=(SingleKey(key=109),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='set_background_opacity +0.1', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=97), rest=(SingleKey(key=109),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='set_background_opacity +0.1'), # decrease_background_opacity - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=97), - rest=(SingleKey(key=108),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='set_background_opacity -0.1', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=97), rest=(SingleKey(key=108),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='set_background_opacity -0.1'), # full_background_opacity - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=97), - rest=(SingleKey(key=49),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='set_background_opacity 1', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=97), rest=(SingleKey(key=49),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='set_background_opacity 1'), # reset_background_opacity - KeyDefinition( - is_sequence=True, - trigger=SingleKey(mods=256, key=97), - rest=(SingleKey(key=100),), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='set_background_opacity default', - ), + KeyDefinition(is_sequence=True, trigger=SingleKey(mods=256, key=97), rest=(SingleKey(key=100),), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='set_background_opacity default'), # reset_terminal KeyDefinition(trigger=SingleKey(mods=256, key=57349), definition='clear_terminal reset active'), # reload_config_file @@ -1763,36 +1036,8 @@ defaults.map = [ ] if is_macos: - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=8, key=99), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='copy_or_noop', - ) - ) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=8, key=118), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='paste_from_clipboard', - ) - ) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=99), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='copy_or_noop')) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=118), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='paste_from_clipboard')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=10, key=57354), definition='scroll_line_up smooth')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=57352), definition='scroll_line_up smooth')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=10, key=57355), definition='scroll_line_down smooth')) @@ -1801,67 +1046,11 @@ if is_macos: defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=57355), definition='scroll_page_down')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=57356), definition='scroll_home')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=57357), definition='scroll_end')) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=8, key=102), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='search_scrollback', - ) - ) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=102), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='search_scrollback')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=57345), definition='new_window')) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=8, key=110), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='new_os_window', - ) - ) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=9, key=100), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='close_window', - ) - ) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=8, key=114), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='start_resizing_window', - ) - ) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=110), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='new_os_window')) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=9, key=100), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='close_window')) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=114), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='start_resizing_window')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=49), definition='first_window')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=50), definition='second_window')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=51), definition='third_window')) @@ -1873,102 +1062,18 @@ if is_macos: defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=57), definition='ninth_window')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=9, key=93), definition='next_tab')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=9, key=91), definition='previous_tab')) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=8, key=116), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='new_tab', - ) - ) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=8, key=119), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='close_tab', - ) - ) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=9, key=119), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='close_os_window', - ) - ) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=9, key=105), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='set_tab_title', - ) - ) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=116), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='new_tab')) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=119), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='close_tab')) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=9, key=119), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='close_os_window')) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=9, key=105), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='set_tab_title')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=43), definition='change_font_size all +2.0')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=61), definition='change_font_size all +2.0')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=9, key=61), definition='change_font_size all +2.0')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=45), definition='change_font_size all -2.0')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=9, key=45), definition='change_font_size all -2.0')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=48), definition='change_font_size all 0')) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=12, key=102), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='toggle_fullscreen', - ) - ) - defaults.map.append( - KeyDefinition( - trigger=SingleKey(mods=10, key=115), - options=KeyMapOptions( - when_focus_on='', - new_mode='', - mode='', - on_unknown='beep', - on_action='keep', - timeout=None, - allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate), - ), - definition='toggle_macos_secure_keyboard_entry', - ) - ) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=12, key=102), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='toggle_fullscreen')) + defaults.map.append(KeyDefinition(trigger=SingleKey(mods=10, key=115), options=KeyMapOptions(when_focus_on='', new_mode='', mode='', on_unknown='beep', on_action='keep', timeout=None, allow_fallback=(KeyFallbackType.shifted, KeyFallbackType.alternate)), definition='toggle_macos_secure_keyboard_entry')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=8, key=96), definition='macos_cycle_through_os_windows')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=9, key=96), definition='macos_cycle_through_os_windows_backwards')) defaults.map.append(KeyDefinition(trigger=SingleKey(mods=12, key=32), definition='kitten unicode_input')) @@ -2054,558 +1159,559 @@ defaults.mouse_map = [ ] -nullable_colors = frozenset( - { - 'cursor', - 'cursor_text_color', - 'cursor_trail_color', - 'visual_bell_color', - 'active_border_color', - 'window_title_bar_active_foreground', - 'window_title_bar_active_background', - 'window_title_bar_inactive_foreground', - 'window_title_bar_inactive_background', - 'tab_bar_background', - 'tab_bar_margin_color', - 'selection_foreground', - 'selection_background', - 'color16', - 'color17', - 'color18', - 'color19', - 'color20', - 'color21', - 'color22', - 'color23', - 'color24', - 'color25', - 'color26', - 'color27', - 'color28', - 'color29', - 'color30', - 'color31', - 'color32', - 'color33', - 'color34', - 'color35', - 'color36', - 'color37', - 'color38', - 'color39', - 'color40', - 'color41', - 'color42', - 'color43', - 'color44', - 'color45', - 'color46', - 'color47', - 'color48', - 'color49', - 'color50', - 'color51', - 'color52', - 'color53', - 'color54', - 'color55', - 'color56', - 'color57', - 'color58', - 'color59', - 'color60', - 'color61', - 'color62', - 'color63', - 'color64', - 'color65', - 'color66', - 'color67', - 'color68', - 'color69', - 'color70', - 'color71', - 'color72', - 'color73', - 'color74', - 'color75', - 'color76', - 'color77', - 'color78', - 'color79', - 'color80', - 'color81', - 'color82', - 'color83', - 'color84', - 'color85', - 'color86', - 'color87', - 'color88', - 'color89', - 'color90', - 'color91', - 'color92', - 'color93', - 'color94', - 'color95', - 'color96', - 'color97', - 'color98', - 'color99', - 'color100', - 'color101', - 'color102', - 'color103', - 'color104', - 'color105', - 'color106', - 'color107', - 'color108', - 'color109', - 'color110', - 'color111', - 'color112', - 'color113', - 'color114', - 'color115', - 'color116', - 'color117', - 'color118', - 'color119', - 'color120', - 'color121', - 'color122', - 'color123', - 'color124', - 'color125', - 'color126', - 'color127', - 'color128', - 'color129', - 'color130', - 'color131', - 'color132', - 'color133', - 'color134', - 'color135', - 'color136', - 'color137', - 'color138', - 'color139', - 'color140', - 'color141', - 'color142', - 'color143', - 'color144', - 'color145', - 'color146', - 'color147', - 'color148', - 'color149', - 'color150', - 'color151', - 'color152', - 'color153', - 'color154', - 'color155', - 'color156', - 'color157', - 'color158', - 'color159', - 'color160', - 'color161', - 'color162', - 'color163', - 'color164', - 'color165', - 'color166', - 'color167', - 'color168', - 'color169', - 'color170', - 'color171', - 'color172', - 'color173', - 'color174', - 'color175', - 'color176', - 'color177', - 'color178', - 'color179', - 'color180', - 'color181', - 'color182', - 'color183', - 'color184', - 'color185', - 'color186', - 'color187', - 'color188', - 'color189', - 'color190', - 'color191', - 'color192', - 'color193', - 'color194', - 'color195', - 'color196', - 'color197', - 'color198', - 'color199', - 'color200', - 'color201', - 'color202', - 'color203', - 'color204', - 'color205', - 'color206', - 'color207', - 'color208', - 'color209', - 'color210', - 'color211', - 'color212', - 'color213', - 'color214', - 'color215', - 'color216', - 'color217', - 'color218', - 'color219', - 'color220', - 'color221', - 'color222', - 'color223', - 'color224', - 'color225', - 'color226', - 'color227', - 'color228', - 'color229', - 'color230', - 'color231', - 'color232', - 'color233', - 'color234', - 'color235', - 'color236', - 'color237', - 'color238', - 'color239', - 'color240', - 'color241', - 'color242', - 'color243', - 'color244', - 'color245', - 'color246', - 'color247', - 'color248', - 'color249', - 'color250', - 'color251', - 'color252', - 'color253', - 'color254', - 'color255', - } -) +nullable_colors = frozenset({ + 'cursor', + 'cursor_text_color', + 'cursor_trail_color', + 'visual_bell_color', + 'active_border_color', + 'window_title_bar_active_foreground', + 'window_title_bar_active_background', + 'window_title_bar_inactive_foreground', + 'window_title_bar_inactive_background', + 'tab_bar_background', + 'tab_bar_margin_color', + 'selection_foreground', + 'selection_background', + 'color16', + 'color17', + 'color18', + 'color19', + 'color20', + 'color21', + 'color22', + 'color23', + 'color24', + 'color25', + 'color26', + 'color27', + 'color28', + 'color29', + 'color30', + 'color31', + 'color32', + 'color33', + 'color34', + 'color35', + 'color36', + 'color37', + 'color38', + 'color39', + 'color40', + 'color41', + 'color42', + 'color43', + 'color44', + 'color45', + 'color46', + 'color47', + 'color48', + 'color49', + 'color50', + 'color51', + 'color52', + 'color53', + 'color54', + 'color55', + 'color56', + 'color57', + 'color58', + 'color59', + 'color60', + 'color61', + 'color62', + 'color63', + 'color64', + 'color65', + 'color66', + 'color67', + 'color68', + 'color69', + 'color70', + 'color71', + 'color72', + 'color73', + 'color74', + 'color75', + 'color76', + 'color77', + 'color78', + 'color79', + 'color80', + 'color81', + 'color82', + 'color83', + 'color84', + 'color85', + 'color86', + 'color87', + 'color88', + 'color89', + 'color90', + 'color91', + 'color92', + 'color93', + 'color94', + 'color95', + 'color96', + 'color97', + 'color98', + 'color99', + 'color100', + 'color101', + 'color102', + 'color103', + 'color104', + 'color105', + 'color106', + 'color107', + 'color108', + 'color109', + 'color110', + 'color111', + 'color112', + 'color113', + 'color114', + 'color115', + 'color116', + 'color117', + 'color118', + 'color119', + 'color120', + 'color121', + 'color122', + 'color123', + 'color124', + 'color125', + 'color126', + 'color127', + 'color128', + 'color129', + 'color130', + 'color131', + 'color132', + 'color133', + 'color134', + 'color135', + 'color136', + 'color137', + 'color138', + 'color139', + 'color140', + 'color141', + 'color142', + 'color143', + 'color144', + 'color145', + 'color146', + 'color147', + 'color148', + 'color149', + 'color150', + 'color151', + 'color152', + 'color153', + 'color154', + 'color155', + 'color156', + 'color157', + 'color158', + 'color159', + 'color160', + 'color161', + 'color162', + 'color163', + 'color164', + 'color165', + 'color166', + 'color167', + 'color168', + 'color169', + 'color170', + 'color171', + 'color172', + 'color173', + 'color174', + 'color175', + 'color176', + 'color177', + 'color178', + 'color179', + 'color180', + 'color181', + 'color182', + 'color183', + 'color184', + 'color185', + 'color186', + 'color187', + 'color188', + 'color189', + 'color190', + 'color191', + 'color192', + 'color193', + 'color194', + 'color195', + 'color196', + 'color197', + 'color198', + 'color199', + 'color200', + 'color201', + 'color202', + 'color203', + 'color204', + 'color205', + 'color206', + 'color207', + 'color208', + 'color209', + 'color210', + 'color211', + 'color212', + 'color213', + 'color214', + 'color215', + 'color216', + 'color217', + 'color218', + 'color219', + 'color220', + 'color221', + 'color222', + 'color223', + 'color224', + 'color225', + 'color226', + 'color227', + 'color228', + 'color229', + 'color230', + 'color231', + 'color232', + 'color233', + 'color234', + 'color235', + 'color236', + 'color237', + 'color238', + 'color239', + 'color240', + 'color241', + 'color242', + 'color243', + 'color244', + 'color245', + 'color246', + 'color247', + 'color248', + 'color249', + 'color250', + 'color251', + 'color252', + 'color253', + 'color254', + 'color255' +}) -special_colors = frozenset({'scrollbar_handle_color', 'scrollbar_track_color', 'wayland_titlebar_color', 'macos_titlebar_color'}) +special_colors = frozenset({ + 'scrollbar_handle_color', + 'scrollbar_track_color', + 'wayland_titlebar_color', + 'macos_titlebar_color' +}) -all_colors = frozenset( - { - 'cursor', - 'cursor_text_color', - 'cursor_trail_color', - 'scrollbar_handle_color', - 'scrollbar_track_color', - 'url_color', - 'visual_bell_color', - 'active_border_color', - 'inactive_border_color', - 'bell_border_color', - 'window_title_bar_active_foreground', - 'window_title_bar_active_background', - 'window_title_bar_inactive_foreground', - 'window_title_bar_inactive_background', - 'active_tab_foreground', - 'active_tab_background', - 'inactive_tab_foreground', - 'inactive_tab_background', - 'tab_bar_background', - 'tab_bar_margin_color', - 'foreground', - 'background', - 'selection_foreground', - 'selection_background', - 'color0', - 'color8', - 'color1', - 'color9', - 'color2', - 'color10', - 'color3', - 'color11', - 'color4', - 'color12', - 'color5', - 'color13', - 'color6', - 'color14', - 'color7', - 'color15', - 'mark1_foreground', - 'mark1_background', - 'mark2_foreground', - 'mark2_background', - 'mark3_foreground', - 'mark3_background', - 'color16', - 'color17', - 'color18', - 'color19', - 'color20', - 'color21', - 'color22', - 'color23', - 'color24', - 'color25', - 'color26', - 'color27', - 'color28', - 'color29', - 'color30', - 'color31', - 'color32', - 'color33', - 'color34', - 'color35', - 'color36', - 'color37', - 'color38', - 'color39', - 'color40', - 'color41', - 'color42', - 'color43', - 'color44', - 'color45', - 'color46', - 'color47', - 'color48', - 'color49', - 'color50', - 'color51', - 'color52', - 'color53', - 'color54', - 'color55', - 'color56', - 'color57', - 'color58', - 'color59', - 'color60', - 'color61', - 'color62', - 'color63', - 'color64', - 'color65', - 'color66', - 'color67', - 'color68', - 'color69', - 'color70', - 'color71', - 'color72', - 'color73', - 'color74', - 'color75', - 'color76', - 'color77', - 'color78', - 'color79', - 'color80', - 'color81', - 'color82', - 'color83', - 'color84', - 'color85', - 'color86', - 'color87', - 'color88', - 'color89', - 'color90', - 'color91', - 'color92', - 'color93', - 'color94', - 'color95', - 'color96', - 'color97', - 'color98', - 'color99', - 'color100', - 'color101', - 'color102', - 'color103', - 'color104', - 'color105', - 'color106', - 'color107', - 'color108', - 'color109', - 'color110', - 'color111', - 'color112', - 'color113', - 'color114', - 'color115', - 'color116', - 'color117', - 'color118', - 'color119', - 'color120', - 'color121', - 'color122', - 'color123', - 'color124', - 'color125', - 'color126', - 'color127', - 'color128', - 'color129', - 'color130', - 'color131', - 'color132', - 'color133', - 'color134', - 'color135', - 'color136', - 'color137', - 'color138', - 'color139', - 'color140', - 'color141', - 'color142', - 'color143', - 'color144', - 'color145', - 'color146', - 'color147', - 'color148', - 'color149', - 'color150', - 'color151', - 'color152', - 'color153', - 'color154', - 'color155', - 'color156', - 'color157', - 'color158', - 'color159', - 'color160', - 'color161', - 'color162', - 'color163', - 'color164', - 'color165', - 'color166', - 'color167', - 'color168', - 'color169', - 'color170', - 'color171', - 'color172', - 'color173', - 'color174', - 'color175', - 'color176', - 'color177', - 'color178', - 'color179', - 'color180', - 'color181', - 'color182', - 'color183', - 'color184', - 'color185', - 'color186', - 'color187', - 'color188', - 'color189', - 'color190', - 'color191', - 'color192', - 'color193', - 'color194', - 'color195', - 'color196', - 'color197', - 'color198', - 'color199', - 'color200', - 'color201', - 'color202', - 'color203', - 'color204', - 'color205', - 'color206', - 'color207', - 'color208', - 'color209', - 'color210', - 'color211', - 'color212', - 'color213', - 'color214', - 'color215', - 'color216', - 'color217', - 'color218', - 'color219', - 'color220', - 'color221', - 'color222', - 'color223', - 'color224', - 'color225', - 'color226', - 'color227', - 'color228', - 'color229', - 'color230', - 'color231', - 'color232', - 'color233', - 'color234', - 'color235', - 'color236', - 'color237', - 'color238', - 'color239', - 'color240', - 'color241', - 'color242', - 'color243', - 'color244', - 'color245', - 'color246', - 'color247', - 'color248', - 'color249', - 'color250', - 'color251', - 'color252', - 'color253', - 'color254', - 'color255', - 'wayland_titlebar_color', - 'macos_titlebar_color', - } -) +all_colors = frozenset({ + 'cursor', + 'cursor_text_color', + 'cursor_trail_color', + 'scrollbar_handle_color', + 'scrollbar_track_color', + 'url_color', + 'visual_bell_color', + 'active_border_color', + 'inactive_border_color', + 'bell_border_color', + 'window_title_bar_active_foreground', + 'window_title_bar_active_background', + 'window_title_bar_inactive_foreground', + 'window_title_bar_inactive_background', + 'active_tab_foreground', + 'active_tab_background', + 'inactive_tab_foreground', + 'inactive_tab_background', + 'tab_bar_background', + 'tab_bar_margin_color', + 'foreground', + 'background', + 'selection_foreground', + 'selection_background', + 'color0', + 'color8', + 'color1', + 'color9', + 'color2', + 'color10', + 'color3', + 'color11', + 'color4', + 'color12', + 'color5', + 'color13', + 'color6', + 'color14', + 'color7', + 'color15', + 'mark1_foreground', + 'mark1_background', + 'mark2_foreground', + 'mark2_background', + 'mark3_foreground', + 'mark3_background', + 'color16', + 'color17', + 'color18', + 'color19', + 'color20', + 'color21', + 'color22', + 'color23', + 'color24', + 'color25', + 'color26', + 'color27', + 'color28', + 'color29', + 'color30', + 'color31', + 'color32', + 'color33', + 'color34', + 'color35', + 'color36', + 'color37', + 'color38', + 'color39', + 'color40', + 'color41', + 'color42', + 'color43', + 'color44', + 'color45', + 'color46', + 'color47', + 'color48', + 'color49', + 'color50', + 'color51', + 'color52', + 'color53', + 'color54', + 'color55', + 'color56', + 'color57', + 'color58', + 'color59', + 'color60', + 'color61', + 'color62', + 'color63', + 'color64', + 'color65', + 'color66', + 'color67', + 'color68', + 'color69', + 'color70', + 'color71', + 'color72', + 'color73', + 'color74', + 'color75', + 'color76', + 'color77', + 'color78', + 'color79', + 'color80', + 'color81', + 'color82', + 'color83', + 'color84', + 'color85', + 'color86', + 'color87', + 'color88', + 'color89', + 'color90', + 'color91', + 'color92', + 'color93', + 'color94', + 'color95', + 'color96', + 'color97', + 'color98', + 'color99', + 'color100', + 'color101', + 'color102', + 'color103', + 'color104', + 'color105', + 'color106', + 'color107', + 'color108', + 'color109', + 'color110', + 'color111', + 'color112', + 'color113', + 'color114', + 'color115', + 'color116', + 'color117', + 'color118', + 'color119', + 'color120', + 'color121', + 'color122', + 'color123', + 'color124', + 'color125', + 'color126', + 'color127', + 'color128', + 'color129', + 'color130', + 'color131', + 'color132', + 'color133', + 'color134', + 'color135', + 'color136', + 'color137', + 'color138', + 'color139', + 'color140', + 'color141', + 'color142', + 'color143', + 'color144', + 'color145', + 'color146', + 'color147', + 'color148', + 'color149', + 'color150', + 'color151', + 'color152', + 'color153', + 'color154', + 'color155', + 'color156', + 'color157', + 'color158', + 'color159', + 'color160', + 'color161', + 'color162', + 'color163', + 'color164', + 'color165', + 'color166', + 'color167', + 'color168', + 'color169', + 'color170', + 'color171', + 'color172', + 'color173', + 'color174', + 'color175', + 'color176', + 'color177', + 'color178', + 'color179', + 'color180', + 'color181', + 'color182', + 'color183', + 'color184', + 'color185', + 'color186', + 'color187', + 'color188', + 'color189', + 'color190', + 'color191', + 'color192', + 'color193', + 'color194', + 'color195', + 'color196', + 'color197', + 'color198', + 'color199', + 'color200', + 'color201', + 'color202', + 'color203', + 'color204', + 'color205', + 'color206', + 'color207', + 'color208', + 'color209', + 'color210', + 'color211', + 'color212', + 'color213', + 'color214', + 'color215', + 'color216', + 'color217', + 'color218', + 'color219', + 'color220', + 'color221', + 'color222', + 'color223', + 'color224', + 'color225', + 'color226', + 'color227', + 'color228', + 'color229', + 'color230', + 'color231', + 'color232', + 'color233', + 'color234', + 'color235', + 'color236', + 'color237', + 'color238', + 'color239', + 'color240', + 'color241', + 'color242', + 'color243', + 'color244', + 'color245', + 'color246', + 'color247', + 'color248', + 'color249', + 'color250', + 'color251', + 'color252', + 'color253', + 'color254', + 'color255', + 'wayland_titlebar_color', + 'macos_titlebar_color' +}) -secret_options = ('remote_control_password', 'file_transfer_confirmation_bypass') +secret_options = ('remote_control_password', 'file_transfer_confirmation_bypass') \ No newline at end of file diff --git a/kitty/options/utils.py b/kitty/options/utils.py index 4c02ba0fe..fd1e02224 100644 --- a/kitty/options/utils.py +++ b/kitty/options/utils.py @@ -905,11 +905,11 @@ def background_images(x: str) -> tuple[str, ...]: return tuple(x for x in sorted(glob(x)) if x.rpartition('.')[-1].lower() in ('jpeg', 'jpg', 'png', 'webp', 'tif', 'tiff', 'bmp', 'gif')) or (x,) -def filter_notification(val: str, current_val: dict[str, str]) -> Iterable[tuple[str, str]]: +def filter_notification(val: str, current_val: dict[str, str]) -> Iterator[tuple[str, str]]: yield val, '' -def remote_control_password(val: str, current_val: dict[str, str]) -> Iterable[tuple[str, Sequence[str]]]: +def remote_control_password(val: str, current_val: dict[str, str]) -> Iterator[tuple[str, Sequence[str]]]: val = val.strip() if val: parts = to_cmdline(val, expand=False) @@ -923,6 +923,28 @@ def remote_control_password(val: str, current_val: dict[str, str]) -> Iterable[t yield parts[0], tuple(parts[1:]) +CustomShaderSlots = Literal['after-window-background'] +all_custom_shader_slots = get_args(CustomShaderSlots) + + +def custom_shader(val: str, current_val: dict[str, str]) -> Iterator[tuple[CustomShaderSlots, tuple[str, ...]]]: + val = val.strip() + if val: + parts = tuple(shlex_split(val)) + if parts[0] not in all_custom_shader_slots: + raise ValueError(f'The shader slot {parts[0]} is unknown') + if len(parts) < 2: + raise ValueError(f'No actual shaders specified for {parts[0]}') + from kitty.shaders.slang import custom_shader + + for x in parts[1:]: + try: + custom_shader(x) + except Exception as e: + raise ValueError(f'Custom shader {x} not found or not readable with error: {e}') from e + yield cast(CustomShaderSlots, parts[0]), parts[1:] + + def clipboard_control(x: str) -> tuple[str, ...]: return tuple(x.lower().split())