Type check set_mode and reset_mode

This commit is contained in:
Kovid Goyal 2021-08-04 22:25:27 +05:30
parent 96326280e5
commit 03517459db
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 47 additions and 43 deletions

View File

@ -87,14 +87,14 @@ def launch(args: List[str]) -> None:
del args[:2] del args[:2]
args = [kitten] + args args = [kitten] + args
os.environ['KITTY_CONFIG_DIRECTORY'] = config_dir os.environ['KITTY_CONFIG_DIRECTORY'] = config_dir
from kittens.tui.operations import clear_screen, reset_mode from kittens.tui.operations import clear_screen, reset_mode, Mode
set_debug(kitten) set_debug(kitten)
m = import_kitten_main_module(config_dir, kitten) m = import_kitten_main_module(config_dir, kitten)
try: try:
result = m['start'](args) result = m['start'](args)
finally: finally:
sys.stdin = sys.__stdin__ sys.stdin = sys.__stdin__
print(reset_mode('ALTERNATE_SCREEN') + clear_screen(), end='') print(reset_mode(Mode.ALTERNATE_SCREEN) + clear_screen(), end='')
if result is not None: if result is not None:
import json import json
data = json.dumps(result) data = json.dumps(result)

View File

@ -5,6 +5,7 @@
import sys import sys
from contextlib import contextmanager from contextlib import contextmanager
from functools import wraps from functools import wraps
from enum import Enum
from typing import ( from typing import (
IO, Any, Callable, Dict, Generator, Optional, Tuple, TypeVar, Union IO, Any, Callable, Dict, Generator, Optional, Tuple, TypeVar, Union
) )
@ -22,26 +23,28 @@ SAVE_PRIVATE_MODE_VALUES = '\033[?s'
RESTORE_PRIVATE_MODE_VALUES = '\033[?r' RESTORE_PRIVATE_MODE_VALUES = '\033[?r'
SAVE_COLORS = '\033[#P' SAVE_COLORS = '\033[#P'
RESTORE_COLORS = '\033[#Q' RESTORE_COLORS = '\033[#Q'
MODES = dict(
LNM=(20, ''),
IRM=(4, ''), class Mode(Enum):
DECKM=(1, '?'), LNM = (20, '')
DECSCNM=(5, '?'), IRM = (4, '')
DECOM=(6, '?'), DECKM = (1, '?')
DECAWM=(7, '?'), DECSCNM = (5, '?')
DECARM=(8, '?'), DECOM = (6, '?')
DECTCEM=(25, '?'), DECAWM = (7, '?')
MOUSE_BUTTON_TRACKING=(1000, '?'), DECARM = (8, '?')
MOUSE_MOTION_TRACKING=(1002, '?'), DECTCEM = (25, '?')
MOUSE_MOVE_TRACKING=(1003, '?'), MOUSE_BUTTON_TRACKING = (1000, '?')
FOCUS_TRACKING=(1004, '?'), MOUSE_MOTION_TRACKING = (1002, '?')
MOUSE_UTF8_MODE=(1005, '?'), MOUSE_MOVE_TRACKING = (1003, '?')
MOUSE_SGR_MODE=(1006, '?'), FOCUS_TRACKING = (1004, '?')
MOUSE_URXVT_MODE=(1015, '?'), MOUSE_UTF8_MODE = (1005, '?')
ALTERNATE_SCREEN=(1049, '?'), MOUSE_SGR_MODE = (1006, '?')
BRACKETED_PASTE=(2004, '?'), MOUSE_URXVT_MODE = (1015, '?')
PENDING_UPDATE=(2026, '?'), ALTERNATE_SCREEN = (1049, '?')
) BRACKETED_PASTE = (2004, '?')
PENDING_UPDATE = (2026, '?')
F = TypeVar('F') F = TypeVar('F')
all_cmds: Dict[str, Callable] = {} all_cmds: Dict[str, Callable] = {}
@ -53,14 +56,14 @@ def cmd(f: F) -> F:
@cmd @cmd
def set_mode(which: str, private: bool = True) -> str: def set_mode(which: Mode) -> str:
num, private_ = MODES[which] num, private = which.value
return '\033[{}{}h'.format(private_, num) return '\033[{}{}h'.format(private, num)
@cmd @cmd
def reset_mode(which: str) -> str: def reset_mode(which: Mode) -> str:
num, private = MODES[which] num, private = which.value
return '\033[{}{}l'.format(private, num) return '\033[{}{}l'.format(private, num)
@ -101,12 +104,12 @@ def set_window_title(value: str) -> str:
@cmd @cmd
def set_line_wrapping(yes_or_no: bool) -> str: def set_line_wrapping(yes_or_no: bool) -> str:
return set_mode('DECAWM') if yes_or_no else reset_mode('DECAWM') return set_mode(Mode.DECAWM) if yes_or_no else reset_mode(Mode.DECAWM)
@cmd @cmd
def set_cursor_visible(yes_or_no: bool) -> str: def set_cursor_visible(yes_or_no: bool) -> str:
return set_mode('DECTCEM') if yes_or_no else reset_mode('DECTCEM') return set_mode(Mode.DECTCEM) if yes_or_no else reset_mode(Mode.DECTCEM)
@cmd @cmd
@ -263,18 +266,18 @@ def clear_images_on_screen(delete_data: bool = False) -> str:
def init_state(alternate_screen: bool = True) -> str: def init_state(alternate_screen: bool = True) -> str:
ans = ( ans = (
S7C1T + SAVE_CURSOR + SAVE_PRIVATE_MODE_VALUES + reset_mode('LNM') + S7C1T + SAVE_CURSOR + SAVE_PRIVATE_MODE_VALUES + reset_mode(Mode.LNM) +
reset_mode('IRM') + reset_mode('DECKM') + reset_mode('DECSCNM') + reset_mode(Mode.IRM) + reset_mode(Mode.DECKM) + reset_mode(Mode.DECSCNM) +
set_mode('DECARM') + set_mode('DECAWM') + set_mode(Mode.DECARM) + set_mode(Mode.DECAWM) +
set_mode('DECTCEM') + reset_mode('MOUSE_BUTTON_TRACKING') + set_mode(Mode.DECTCEM) + reset_mode(Mode.MOUSE_BUTTON_TRACKING) +
reset_mode('MOUSE_MOTION_TRACKING') + reset_mode('MOUSE_MOVE_TRACKING') + reset_mode(Mode.MOUSE_MOTION_TRACKING) + reset_mode(Mode.MOUSE_MOVE_TRACKING) +
reset_mode('FOCUS_TRACKING') + reset_mode('MOUSE_UTF8_MODE') + reset_mode(Mode.FOCUS_TRACKING) + reset_mode(Mode.MOUSE_UTF8_MODE) +
reset_mode('MOUSE_SGR_MODE') + reset_mode('MOUSE_UTF8_MODE') + reset_mode(Mode.MOUSE_SGR_MODE) + reset_mode(Mode.MOUSE_UTF8_MODE) +
set_mode('BRACKETED_PASTE') + SAVE_COLORS + set_mode(Mode.BRACKETED_PASTE) + SAVE_COLORS +
'\033[*x' # reset DECSACE to default region select '\033[*x' # reset DECSACE to default region select
) )
if alternate_screen: if alternate_screen:
ans += set_mode('ALTERNATE_SCREEN') + reset_mode('DECOM') ans += set_mode(Mode.ALTERNATE_SCREEN) + reset_mode(Mode.DECOM)
ans += clear_screen() ans += clear_screen()
ans += '\033[>31u' # extended keyboard mode ans += '\033[>31u' # extended keyboard mode
return ans return ans
@ -284,7 +287,7 @@ def reset_state(normal_screen: bool = True) -> str:
ans = '' ans = ''
ans += '\033[<u' # restore keyboard mode ans += '\033[<u' # restore keyboard mode
if normal_screen: if normal_screen:
ans += reset_mode('ALTERNATE_SCREEN') ans += reset_mode(Mode.ALTERNATE_SCREEN)
ans += RESTORE_PRIVATE_MODE_VALUES ans += RESTORE_PRIVATE_MODE_VALUES
ans += RESTORE_CURSOR ans += RESTORE_CURSOR
ans += RESTORE_COLORS ans += RESTORE_COLORS
@ -293,9 +296,9 @@ def reset_state(normal_screen: bool = True) -> str:
@contextmanager @contextmanager
def pending_update(write: Callable[[str], None]) -> Generator[None, None, None]: def pending_update(write: Callable[[str], None]) -> Generator[None, None, None]:
write(set_mode('PENDING_UPDATE')) write(set_mode(Mode.PENDING_UPDATE))
yield yield
write(reset_mode('PENDING_UPDATE')) write(reset_mode(Mode.PENDING_UPDATE))
@contextmanager @contextmanager
@ -308,9 +311,9 @@ def cursor(write: Callable[[str], None]) -> Generator[None, None, None]:
@contextmanager @contextmanager
def alternate_screen(f: Optional[IO[str]] = None) -> Generator[None, None, None]: def alternate_screen(f: Optional[IO[str]] = None) -> Generator[None, None, None]:
f = f or sys.stdout f = f or sys.stdout
print(set_mode('ALTERNATE_SCREEN'), end='', file=f) print(set_mode(Mode.ALTERNATE_SCREEN), end='', file=f)
yield yield
print(reset_mode('ALTERNATE_SCREEN'), end='', file=f) print(reset_mode(Mode.ALTERNATE_SCREEN), end='', file=f)
@contextmanager @contextmanager
@ -414,6 +417,7 @@ def as_type_stub() -> str:
'from kitty.typing import GraphicsCommandType, ScreenSize', 'from kitty.typing import GraphicsCommandType, ScreenSize',
'from kitty.rgb import Color', 'from kitty.rgb import Color',
'import kitty.rgb', 'import kitty.rgb',
'import kittens.tui.operations',
] ]
methods = [] methods = []
for name, func in all_cmds.items(): for name, func in all_cmds.items():