diff --git a/kittens/choose_fonts/main.py b/kittens/choose_fonts/main.py index 9f042654b..234ef89f3 100644 --- a/kittens/choose_fonts/main.py +++ b/kittens/choose_fonts/main.py @@ -1,8 +1,6 @@ -import os +if __name__ == '__main__': + import os + import sys -from kitty.constants import kitten_exe - - -def main(args: 'list[str]') -> None: - # allow running this kitten via map key kitten choose-fonts - os.execlp(kitten_exe(), 'kitten', *args) + from kitty.constants import kitten_exe + os.execlp(kitten_exe(), 'kitten', *sys.argv) diff --git a/kittens/runner.py b/kittens/runner.py index 779f816af..b7d3846da 100644 --- a/kittens/runner.py +++ b/kittens/runner.py @@ -7,10 +7,11 @@ import os import sys from contextlib import contextmanager from functools import partial -from typing import TYPE_CHECKING, Any, Dict, FrozenSet, Generator, List, Optional, cast +from typing import TYPE_CHECKING, Any, Callable, Dict, FrozenSet, Generator, List, NamedTuple, Optional, cast from kitty.constants import list_kitty_resources from kitty.types import run_once +from kitty.typing import BossType, WindowType from kitty.utils import resolve_abs_or_config_path aliases = {'url_hints': 'hints'} @@ -72,16 +73,27 @@ def import_kitten_main_module(config_dir: str, kitten: str) -> Dict[str, Any]: } -def create_kitten_handler(kitten: str, orig_args: List[str]) -> Any: +class KittenMetadata(NamedTuple): + handle_result: Callable[[Any, int, BossType], None] = lambda *a: None + + type_of_input: Optional[str] = None + no_ui: bool = False + has_ready_notification: bool = False + open_url_handler: Optional[Callable[[BossType, WindowType, str, int, str], bool]] = None + + + +def create_kitten_handler(kitten: str, orig_args: List[str]) -> KittenMetadata: from kitty.constants import config_dir kitten = resolved_kitten(kitten) m = import_kitten_main_module(config_dir, kitten) - ans = partial(m['end'], [kitten] + orig_args) - setattr(ans, 'type_of_input', getattr(m['end'], 'type_of_input', None)) - setattr(ans, 'no_ui', getattr(m['end'], 'no_ui', False)) - setattr(ans, 'has_ready_notification', getattr(m['end'], 'has_ready_notification', False)) - setattr(ans, 'open_url_handler', getattr(m['end'], 'open_url_handler', None)) - return ans + handle_result = m['end'] + return KittenMetadata( + handle_result=partial(handle_result, [kitten] + orig_args), + type_of_input=getattr(handle_result, 'type_of_input', None), + no_ui=getattr(handle_result, 'no_ui', False), + has_ready_notification=getattr(handle_result, 'has_ready_notification', False), + open_url_handler=getattr(handle_result, 'open_url_handler', None)) def set_debug(kitten: str) -> None: diff --git a/kitty/boss.py b/kitty/boss.py index aca8e8928..8882ae996 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -1897,13 +1897,13 @@ class Boss: default_data: Optional[Dict[str, Any]] = None ) -> Any: orig_args, args = list(args), list(args) - from kittens.runner import CLIOnlyKitten, create_kitten_handler + from kittens.runner import CLIOnlyKitten, KittenMetadata, create_kitten_handler + is_wrapped = kitten in wrapped_kitten_names() try: end_kitten = create_kitten_handler(kitten, orig_args) - except CLIOnlyKitten as err: - self.show_error(f'Cannot run the {kitten} kitten', str(err)) - return - is_wrapped = kitten in wrapped_kitten_names() + except CLIOnlyKitten: + is_wrapped = True + end_kitten = KittenMetadata() if window is None: w = self.active_window tab = self.active_tab @@ -1911,7 +1911,7 @@ class Boss: w = window tab = w.tabref() if w else None if end_kitten.no_ui: - return end_kitten(None, getattr(w, 'id', None), self) + return end_kitten.handle_result(None, w.id if w else 0, self) if w is not None and tab is not None: if not is_wrapped: @@ -1968,7 +1968,7 @@ class Boss: copy_colors_from=w ) wid = w.id - overlay_window.actions_on_close.append(partial(self.on_kitten_finish, wid, custom_callback or end_kitten, default_data=default_data)) + overlay_window.actions_on_close.append(partial(self.on_kitten_finish, wid, custom_callback or end_kitten.handle_result, default_data=default_data)) overlay_window.open_url_handler = end_kitten.open_url_handler if action_on_removal is not None: