diff --git a/gen/config.py b/gen/config.py index d41e9c84d..7feefd6ef 100755 --- a/gen/config.py +++ b/gen/config.py @@ -60,9 +60,11 @@ def main(args: list[str]=sys.argv) -> None: patch_color_list('tools/themes/collection.go', all_colors, 'ALL') nc = ',\n '.join(f'{x!r}' for x in nullable_colors) sc = ',\n '.join(f'{x!r}' for x in special_colors) + ac = ',\n '.join(f'{x!r}' for x in all_colors) write_output('kitty', definition, f'\nnullable_colors = frozenset({{\n {nc}\n}})\n' f'\nspecial_colors = frozenset({{\n {sc}\n}})\n' + f'\nall_colors = frozenset({{\n {ac}\n}})\n' ) diff --git a/kitty/colors.py b/kitty/colors.py index c10776aa0..734003484 100644 --- a/kitty/colors.py +++ b/kitty/colors.py @@ -5,13 +5,14 @@ import os from collections.abc import Iterable, Sequence from contextlib import suppress from enum import Enum -from typing import Literal, Optional, TypedDict +from typing import Any, Literal, Optional, TypedDict from .config import parse_config from .constants import config_dir from .fast_data_types import Color, get_boss, get_options, glfw_get_system_color_theme, patch_color_profiles, patch_global_colors, set_os_window_chrome -from .options.types import Options, nullable_colors, special_colors +from .options.types import Options, all_colors, nullable_colors, special_colors from .rgb import color_from_int +from .types import run_once from .typing_compat import WindowType ColorsSpec = dict[str, Optional[int]] @@ -191,19 +192,32 @@ class ThemeColors: theme_colors = ThemeColors() -def parse_colors(args: Iterable[str | Iterable[str]], background_image_options: BackgroundImageOptions | None = None) -> Colors: +@run_once +def all_color_related_conf_keys() -> frozenset[str]: + return all_colors | frozenset(BackgroundImageOptions.__optional_keys__) | frozenset({'transparent_background_colors'}) + + +def parse_colors( + args: Iterable[str | Iterable[str]], background_image_options: BackgroundImageOptions | None = None, + allow_reading_conf_files: bool = True, +) -> Colors: + from kitty.options.parse import parse_conf_item colors: dict[str, Color | None | int] = {} nullable_color_map: dict[str, int | None] = {} special_color_map: dict[str, int] = {} transparent_background_colors = () + allowed = all_color_related_conf_keys() for spec in args: + conf: dict[str, Any] = {} if isinstance(spec, str): - if '=' in spec: - conf = parse_config((spec.replace('=', ' '),)) - else: + k, sep, v = spec.partition('=') + if sep == '=': + if k in allowed: + parse_conf_item(k, v, conf) + elif allow_reading_conf_files: with open(os.path.expanduser(spec), encoding='utf-8', errors='replace') as f: conf = parse_config(f) - else: + elif allow_reading_conf_files: conf = parse_config(spec) transparent_background_colors = conf.pop('transparent_background_colors', ()) if background_image_options is not None: diff --git a/kitty/options/types.py b/kitty/options/types.py index bbe05b840..2766de82d 100644 --- a/kitty/options/types.py +++ b/kitty/options/types.py @@ -1412,5 +1412,296 @@ special_colors = frozenset({ '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') \ No newline at end of file