Make CLI Only kittens run in overlay windows when run via the kitten
action mapping by default.
This commit is contained in:
Kovid Goyal 2024-07-05 13:14:48 +05:30
parent d8dc237af7
commit 24f01136c7
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
3 changed files with 32 additions and 22 deletions

View file

@ -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)

View file

@ -7,10 +7,11 @@
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:

View file

@ -1897,13 +1897,13 @@ def run_kitten_with_metadata(
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 @@ def run_kitten_with_metadata(
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 @@ def run_kitten_with_metadata(
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: