Port key handling in more kittens
Also fix decoding of enter/f3 key events
This commit is contained in:
parent
9c6ba213f9
commit
e09ed038e2
@ -9,7 +9,7 @@ from typing import Any, Dict, List, Optional
|
||||
from kitty.cli import parse_args
|
||||
from kitty.cli_stub import RCOptions, ResizeCLIOptions
|
||||
from kitty.constants import version
|
||||
from kitty.key_encoding import CTRL, RELEASE, KeyEvent, key_defs as K
|
||||
from kitty.key_encoding import CTRL, EventType, KeyEvent
|
||||
from kitty.rc.base import command_for_name, parse_subcommand_cli
|
||||
from kitty.remote_control import encode_send, parse_rc_args
|
||||
from kitty.utils import ScreenSize
|
||||
@ -19,11 +19,6 @@ from ..tui.loop import Loop
|
||||
from ..tui.operations import styled
|
||||
|
||||
global_opts = RCOptions()
|
||||
ESCAPE = K['ESCAPE']
|
||||
N = K['N']
|
||||
S = K['S']
|
||||
T = K['T']
|
||||
W = K['W']
|
||||
|
||||
|
||||
class Resize(Handler):
|
||||
@ -74,12 +69,13 @@ class Resize(Handler):
|
||||
self.quit_loop(0)
|
||||
|
||||
def on_key(self, key_event: KeyEvent) -> None:
|
||||
if key_event.type is RELEASE:
|
||||
if key_event.type is EventType.RELEASE:
|
||||
return
|
||||
if key_event.key is ESCAPE:
|
||||
if key_event.matches('esc'):
|
||||
self.quit_loop(0)
|
||||
elif key_event.key in (W, N, T, S) and key_event.mods & CTRL:
|
||||
self.do_window_resize(is_decrease=key_event.key in (N, S), is_horizontal=key_event.key in (W, N), multiplier=2)
|
||||
return
|
||||
if key_event.key in ('w', 'n', 't', 's') and key_event.mods == CTRL:
|
||||
self.do_window_resize(is_decrease=key_event.key in 'ns', is_horizontal=key_event.key in 'wn', multiplier=2)
|
||||
|
||||
def on_resize(self, new_size: ScreenSize) -> None:
|
||||
self.draw_screen()
|
||||
|
||||
@ -18,9 +18,7 @@ from kitty.cli_stub import UnicodeCLIOptions
|
||||
from kitty.config import cached_values_for
|
||||
from kitty.constants import config_dir
|
||||
from kitty.fast_data_types import is_emoji_presentation_base, wcswidth
|
||||
from kitty.key_encoding import (
|
||||
CTRL, PRESS, RELEASE, SHIFT, KeyEvent, enter_key, key_defs as K
|
||||
)
|
||||
from kitty.key_encoding import EventType, KeyEvent
|
||||
from kitty.typing import BossType
|
||||
from kitty.utils import ScreenSize, get_editor
|
||||
|
||||
@ -33,19 +31,6 @@ from ..tui.operations import (
|
||||
)
|
||||
|
||||
HEX, NAME, EMOTICONS, FAVORITES = 'HEX', 'NAME', 'EMOTICONS', 'FAVORITES'
|
||||
UP = K['UP']
|
||||
DOWN = K['DOWN']
|
||||
LEFT = K['LEFT']
|
||||
RIGHT = K['RIGHT']
|
||||
RIGHT_BRACKET = K['RIGHT_BRACKET']
|
||||
LEFT_BRACKET = K['LEFT_BRACKET']
|
||||
TAB = K['TAB']
|
||||
ESCAPE = K['ESCAPE']
|
||||
F1 = K['F1']
|
||||
F2 = K['F2']
|
||||
F3 = K['F3']
|
||||
F4 = K['F4']
|
||||
F12 = K['F12']
|
||||
favorites_path = os.path.join(config_dir, 'unicode-input-favorites.conf')
|
||||
INDEX_CHAR = '.'
|
||||
INDEX_BASE = 36
|
||||
@ -431,46 +416,46 @@ class UnicodeInput(Handler):
|
||||
self.refresh()
|
||||
|
||||
def on_key(self, key_event: KeyEvent) -> None:
|
||||
if self.mode is HEX and key_event.type is not RELEASE and not key_event.mods:
|
||||
if self.mode is HEX and key_event.type is not EventType.RELEASE and not key_event.mods:
|
||||
try:
|
||||
val = int(self.line_edit.current_input, 16)
|
||||
except Exception:
|
||||
pass
|
||||
else:
|
||||
if key_event.key is TAB:
|
||||
if key_event.matches('tab'):
|
||||
self.line_edit.current_input = hex(val + 0x10)[2:]
|
||||
self.refresh()
|
||||
return
|
||||
if key_event.key is UP:
|
||||
if key_event.matches('up'):
|
||||
self.line_edit.current_input = hex(val + 1)[2:]
|
||||
self.refresh()
|
||||
return
|
||||
if key_event.key is DOWN:
|
||||
if key_event.matches('down'):
|
||||
self.line_edit.current_input = hex(val - 1)[2:]
|
||||
self.refresh()
|
||||
return
|
||||
if self.mode is NAME and key_event.type is not RELEASE and not key_event.mods:
|
||||
if key_event.key is TAB:
|
||||
if key_event.mods == SHIFT:
|
||||
self.table.move_current(cols=-1)
|
||||
self.refresh()
|
||||
elif not key_event.mods:
|
||||
self.table.move_current(cols=1)
|
||||
self.refresh()
|
||||
return
|
||||
elif key_event.key is LEFT and not key_event.mods:
|
||||
if self.mode is NAME and key_event.type is not EventType.RELEASE and not key_event.mods:
|
||||
if key_event.matches('shift+tab'):
|
||||
self.table.move_current(cols=-1)
|
||||
self.refresh()
|
||||
return
|
||||
elif key_event.key is RIGHT and not key_event.mods:
|
||||
if key_event.matches('tab'):
|
||||
self.table.move_current(cols=1)
|
||||
self.refresh()
|
||||
return
|
||||
elif key_event.key is UP and not key_event.mods:
|
||||
if key_event.matches('left'):
|
||||
self.table.move_current(cols=-1)
|
||||
self.refresh()
|
||||
return
|
||||
if key_event.matches('right'):
|
||||
self.table.move_current(cols=1)
|
||||
self.refresh()
|
||||
return
|
||||
if key_event.matches('up'):
|
||||
self.table.move_current(rows=-1)
|
||||
self.refresh()
|
||||
return
|
||||
elif key_event.key is DOWN and not key_event.mods:
|
||||
if key_event.matches('down'):
|
||||
self.table.move_current(rows=1)
|
||||
self.refresh()
|
||||
return
|
||||
@ -478,26 +463,34 @@ class UnicodeInput(Handler):
|
||||
if self.line_edit.on_key(key_event):
|
||||
self.refresh()
|
||||
return
|
||||
if key_event is enter_key:
|
||||
if key_event.matches('enter'):
|
||||
self.quit_loop(0)
|
||||
elif key_event.type is PRESS:
|
||||
if not key_event.mods:
|
||||
if key_event.key is ESCAPE:
|
||||
self.quit_loop(1)
|
||||
elif key_event.key is F1:
|
||||
self.switch_mode(HEX)
|
||||
elif key_event.key is F2:
|
||||
self.switch_mode(NAME)
|
||||
elif key_event.key is F3:
|
||||
self.switch_mode(EMOTICONS)
|
||||
elif key_event.key is F4:
|
||||
self.switch_mode(FAVORITES)
|
||||
elif key_event.key is F12 and self.mode is FAVORITES:
|
||||
self.edit_favorites()
|
||||
elif key_event.mods == CTRL and key_event.key in (TAB, RIGHT_BRACKET, LEFT_BRACKET):
|
||||
self.next_mode(-1 if key_event.key is LEFT_BRACKET else 1)
|
||||
elif key_event.mods == CTRL | SHIFT and key_event.key is TAB:
|
||||
self.next_mode(-1)
|
||||
return
|
||||
if key_event.matches('esc'):
|
||||
self.quit_loop(1)
|
||||
return
|
||||
if key_event.matches('f1'):
|
||||
self.switch_mode(HEX)
|
||||
return
|
||||
if key_event.matches('f2'):
|
||||
self.switch_mode(NAME)
|
||||
return
|
||||
if key_event.matches('f3'):
|
||||
self.switch_mode(EMOTICONS)
|
||||
return
|
||||
if key_event.matches('f4'):
|
||||
self.switch_mode(FAVORITES)
|
||||
return
|
||||
if key_event.matches('f12') and self.mode is FAVORITES:
|
||||
self.edit_favorites()
|
||||
return
|
||||
if key_event.matches('ctrl+shift+tab'):
|
||||
self.next_mode(-1)
|
||||
return
|
||||
for key in ('tab', '[', ']'):
|
||||
if key_event.matches(f'ctrl+{key}'):
|
||||
self.next_mode(-1 if key == '[' else 1)
|
||||
return
|
||||
|
||||
def edit_favorites(self) -> None:
|
||||
if not os.path.exists(favorites_path):
|
||||
|
||||
7
kitty/key_encoding.py
generated
7
kitty/key_encoding.py
generated
@ -281,8 +281,11 @@ def decode_key_event(csi: str, csi_type: str) -> KeyEvent:
|
||||
def key_name(num: int) -> str:
|
||||
if not num:
|
||||
return ''
|
||||
num = csi_number_to_functional_number_map.get(num, num)
|
||||
ans = functional_key_number_to_name_map.get(num)
|
||||
if num != 13:
|
||||
num = csi_number_to_functional_number_map.get(num, num)
|
||||
ans = functional_key_number_to_name_map.get(num)
|
||||
else:
|
||||
ans = 'ENTER' if csi_type == 'u' else 'F3'
|
||||
if ans is None:
|
||||
ans = chr(num)
|
||||
return ans
|
||||
|
||||
@ -20,7 +20,7 @@ def generate_stub():
|
||||
'font_features': 'typing.Dict[str, typing.Tuple[str, ...]]'
|
||||
},
|
||||
preamble_lines=(
|
||||
'from kitty.constants import SingleKey',
|
||||
'from kitty.types import SingleKey',
|
||||
'from kitty.config import KeyAction, KeyMap, SequenceMap',
|
||||
),
|
||||
extra_fields=(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user