Port key handling in more kittens

Also fix decoding of enter/f3 key events
This commit is contained in:
Kovid Goyal 2021-01-15 10:22:20 +05:30
parent 9c6ba213f9
commit e09ed038e2
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 57 additions and 65 deletions

View File

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

View File

@ -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
View File

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

View File

@ -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=(