From a8ad4461a1957b5a10b4b163260725a7f856dcd4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 20 Jan 2019 14:38:19 +0530 Subject: [PATCH] Create a kitten to demonstrate the kitty extended keyboard protocol --- kittens/key_demo/__init__.py | 0 kittens/key_demo/main.py | 59 ++++++++++++++++++++++++++++++++++++ kitty/key_encoding.py | 9 ++++++ 3 files changed, 68 insertions(+) create mode 100644 kittens/key_demo/__init__.py create mode 100644 kittens/key_demo/main.py diff --git a/kittens/key_demo/__init__.py b/kittens/key_demo/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/kittens/key_demo/main.py b/kittens/key_demo/main.py new file mode 100644 index 000000000..79cdc263d --- /dev/null +++ b/kittens/key_demo/main.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 +# License: GPL v3 Copyright: 2018, Kovid Goyal + +import sys + +from kitty.key_encoding import ( + ALT, CTRL, PRESS, RELEASE, REPEAT, SHIFT, SUPER, encode_key_event +) + +from ..tui.handler import Handler +from ..tui.loop import Loop + + +class KeysHandler(Handler): + + def initialize(self): + self.cmd.set_window_title('Kitty extended keyboard protocol demo') + self.cmd.set_cursor_visible(False) + self.print('Press any keys - Ctrl+C or Ctrl+D will terminate') + + def on_text(self, text, in_bracketed_paste=False): + self.print('Text input: ' + text) + + def on_key(self, key_event): + etype = { + PRESS: 'PRESS', + REPEAT: 'REPEAT', + RELEASE: 'RELEASE' + }[key_event.type] + mods = [] + for m, name in { + SHIFT: 'Shift', + ALT: 'Alt', + CTRL: 'Ctrl', + SUPER: 'Super'}.items(): + if key_event.mods & m: + mods.append(name) + mods = '+'.join(mods) + if mods: + mods += '+' + self.print('Key {}: {}{} [{}]'.format(etype, mods, key_event.key, encode_key_event(key_event))) + + def on_interrupt(self): + self.quit_loop(0) + + def on_eot(self): + self.quit_loop(0) + + +def main(args): + loop = Loop() + handler = KeysHandler() + loop.loop(handler) + raise SystemExit(loop.return_code) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/kitty/key_encoding.py b/kitty/key_encoding.py index 2ffc4af48..fb24ccce0 100644 --- a/kitty/key_encoding.py +++ b/kitty/key_encoding.py @@ -320,7 +320,9 @@ PRESS, REPEAT, RELEASE = 1, 2, 4 SHIFT, ALT, CTRL, SUPER = 1, 2, 4, 8 KeyEvent = namedtuple('KeyEvent', 'type mods key') type_map = {'p': PRESS, 't': REPEAT, 'r': RELEASE} +rtype_map = {v: k for k, v in type_map.items()} mod_map = {c: i for i, c in enumerate('ABCDEFGHIJKLMNOP')} +rmod_map = {v: k for k, v in mod_map.items()} key_rmap = {} g = globals() config_key_map = {} @@ -365,3 +367,10 @@ def decode_key_event(text): mods = mod_map[text[2]] key = key_rmap[text[3:5]] return KeyEvent(typ, mods, key) + + +def encode_key_event(key_event): + typ = rtype_map[key_event.type] + mods = rmod_map[key_event.mods] + key = ENCODING[key_event.key.replace('_', ' ')] + return typ + mods + key