From d9563e52c88b5237a693253c0d320804f0e8dffb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 10 Feb 2017 15:34:06 +0530 Subject: [PATCH] Reduce size of encoded key event by using base64 encoding --- key_encoding.asciidoc | 238 +++++++++++++++++------------------ kitty/keys.py | 26 ++-- preprocess-readme.py | 2 +- protocol-extensions.asciidoc | 17 ++- 4 files changed, 143 insertions(+), 140 deletions(-) diff --git a/key_encoding.asciidoc b/key_encoding.asciidoc index 25dbd1225..7f0004235 100644 --- a/key_encoding.asciidoc +++ b/key_encoding.asciidoc @@ -5,124 +5,124 @@ See link:protocol-extensions.asciidoc#keyboard-handling[Keyboard Handling protoc |=== | Name | Encoded representation (base64) -| 0 | `BM` -| 1 | `BN` -| 2 | `BO` -| 3 | `BP` -| 4 | `BQ` -| 5 | `BR` -| 6 | `BS` -| 7 | `BT` -| 8 | `BU` -| 9 | `BV` -| A | `Bd` -| APOSTROPHE | `BD` -| B | `Be` -| BACKSLASH | `CU` -| BACKSPACE | `HH` -| C | `Bf` -| CAPS LOCK | `Hc` -| COMMA | `BI` -| D | `Bg` -| DELETE | `HJ` -| DOWN | `HM` -| E | `Bh` -| END | `HR` -| ENTER | `HF` -| EQUAL | `BZ` -| ESCAPE | `HE` -| F | `Bi` -| F1 | `IC` -| F10 | `IL` -| F11 | `IM` -| F12 | `IN` -| F13 | `IO` -| F14 | `IP` -| F15 | `IQ` -| F16 | `IR` -| F17 | `IS` -| F18 | `IT` -| F19 | `IU` -| F2 | `ID` -| F20 | `IV` -| F21 | `IW` -| F22 | `IX` -| F23 | `IY` -| F24 | `IZ` -| F25 | `Ia` -| F3 | `IE` -| F4 | `IF` -| F5 | `IG` -| F6 | `IH` -| F7 | `II` -| F8 | `IJ` -| F9 | `IK` -| G | `Bj` -| GRAVE ACCENT | `CY` -| H | `CA` -| HOME | `HQ` -| I | `CB` -| INSERT | `HI` -| J | `CC` -| K | `CD` -| KP 0 | `Ig` -| KP 1 | `Ih` -| KP 2 | `Ii` -| KP 3 | `Ij` -| KP 4 | `JA` -| KP 5 | `JB` -| KP 6 | `JC` -| KP 7 | `JD` -| KP 8 | `JE` -| KP 9 | `JF` -| KP ADD | `JK` -| KP DECIMAL | `JG` -| KP DIVIDE | `JH` -| KP ENTER | `JL` -| KP EQUAL | `JM` -| KP MULTIPLY | `JI` -| KP SUBTRACT | `JJ` -| L | `CE` -| LEFT | `HL` -| LEFT ALT | `JS` -| LEFT BRACKET | `CT` -| LEFT CONTROL | `JR` -| LEFT SHIFT | `JQ` -| LEFT SUPER | `JT` -| M | `CF` -| MINUS | `BJ` -| N | `CG` -| NUM LOCK | `He` -| O | `CH` -| P | `CI` -| PAGE DOWN | `HP` -| PAGE UP | `HO` -| PAUSE | `Hg` -| PERIOD | `BK` -| PRINT SCREEN | `Hf` -| Q | `CJ` -| R | `CK` -| RIGHT | `HK` -| RIGHT ALT | `JW` -| RIGHT BRACKET | `CV` -| RIGHT CONTROL | `JV` -| RIGHT SHIFT | `JU` -| RIGHT SUPER | `JX` -| S | `CL` -| SCROLL LOCK | `Hd` -| SEMICOLON | `BX` -| SLASH | `BL` -| SPACE | `g` -| T | `CM` -| TAB | `HG` -| U | `CN` -| UP | `HN` -| V | `CO` -| W | `CP` -| WORLD 1 | `ER` -| WORLD 2 | `ES` -| X | `CQ` -| Y | `CR` -| Z | `CS` +| 0 | `G` +| 1 | `H` +| 2 | `I` +| 3 | `J` +| 4 | `K` +| 5 | `L` +| 6 | `M` +| 7 | `N` +| 8 | `O` +| 9 | `P` +| A | `S` +| APOSTROPHE | `B` +| B | `T` +| BACKSLASH | `t` +| BACKSPACE | `1` +| C | `U` +| CAPS LOCK | `BA` +| COMMA | `C` +| D | `V` +| DELETE | `3` +| DOWN | `6` +| E | `W` +| END | `/` +| ENTER | `z` +| EQUAL | `R` +| ESCAPE | `y` +| F | `X` +| F1 | `BF` +| F10 | `BO` +| F11 | `BP` +| F12 | `BQ` +| F13 | `BR` +| F14 | `BS` +| F15 | `BT` +| F16 | `BU` +| F17 | `BV` +| F18 | `BW` +| F19 | `BX` +| F2 | `BG` +| F20 | `BY` +| F21 | `BZ` +| F22 | `Ba` +| F23 | `Bb` +| F24 | `Bc` +| F25 | `Bd` +| F3 | `BH` +| F4 | `BI` +| F5 | `BJ` +| F6 | `BK` +| F7 | `BL` +| F8 | `BM` +| F9 | `BN` +| G | `Y` +| GRAVE ACCENT | `v` +| H | `Z` +| HOME | `+` +| I | `a` +| INSERT | `2` +| J | `b` +| K | `c` +| KP 0 | `Be` +| KP 1 | `Bf` +| KP 2 | `Bg` +| KP 3 | `Bh` +| KP 4 | `Bi` +| KP 5 | `Bj` +| KP 6 | `Bk` +| KP 7 | `Bl` +| KP 8 | `Bm` +| KP 9 | `Bn` +| KP ADD | `Bs` +| KP DECIMAL | `Bo` +| KP DIVIDE | `Bp` +| KP ENTER | `Bt` +| KP EQUAL | `Bu` +| KP MULTIPLY | `Bq` +| KP SUBTRACT | `Br` +| L | `d` +| LEFT | `5` +| LEFT ALT | `Bx` +| LEFT BRACKET | `s` +| LEFT CONTROL | `Bw` +| LEFT SHIFT | `Bv` +| LEFT SUPER | `By` +| M | `e` +| MINUS | `D` +| N | `f` +| NUM LOCK | `BC` +| O | `g` +| P | `h` +| PAGE DOWN | `9` +| PAGE UP | `8` +| PAUSE | `BE` +| PERIOD | `E` +| PRINT SCREEN | `BD` +| Q | `i` +| R | `j` +| RIGHT | `4` +| RIGHT ALT | `B1` +| RIGHT BRACKET | `u` +| RIGHT CONTROL | `B0` +| RIGHT SHIFT | `Bz` +| RIGHT SUPER | `B2` +| S | `k` +| SCROLL LOCK | `BB` +| SEMICOLON | `Q` +| SLASH | `F` +| SPACE | `A` +| T | `l` +| TAB | `0` +| U | `m` +| UP | `7` +| V | `n` +| W | `o` +| WORLD 1 | `w` +| WORLD 2 | `x` +| X | `p` +| Y | `q` +| Z | `r` |=== diff --git a/kitty/keys.py b/kitty/keys.py index 75783f163..6e6d060fb 100644 --- a/kitty/keys.py +++ b/kitty/keys.py @@ -87,23 +87,29 @@ action_map = {defines.GLFW_PRESS: b'p', defines.GLFW_RELEASE: b'r', defines.GLFW def base64_encode(integer, chars=string.ascii_uppercase + string.ascii_lowercase + string.digits + '+/'): ans = '' - while integer > 0: - integer, remainder = divmod(integer, 36) + while True: + integer, remainder = divmod(integer, 64) ans = chars[remainder] + ans + if integer == 0: + break return ans -def key_extended_map(): +def generate_key_extended_map(symbolic=False): ans = {} - for k in dir(defines): - if k.startswith('GLFW_KEY_'): - val = getattr(defines, k) - if val < defines.GLFW_KEY_LAST and val != defines.GLFW_KEY_UNKNOWN: - ans[k[9:]] = base64_encode(val) + i = 0 + keys = {a for a in dir(defines) if a.startswith('GLFW_KEY_')} + + for k in sorted(keys, key=lambda k: getattr(defines, k)): + val = getattr(defines, k) + if val < defines.GLFW_KEY_LAST and val != defines.GLFW_KEY_UNKNOWN: + key = k[9:] if symbolic else val + ans[key] = base64_encode(i) + i += 1 return ans -key_extended_map = key_extended_map() +key_extended_map = generate_key_extended_map() def extended_key_event(key, scancode, mods, action): @@ -113,7 +119,7 @@ def extended_key_event(key, scancode, mods, action): return b'' if mods == 0 and key in (defines.GLFW_KEY_BACKSPACE, defines.GLFW_KEY_ENTER): return smkx_key_map[key] - return '\033_K{}{:x}:{}\033\\'.format(action_map[action], mods, key_extended_map[key]).encode('ascii') + return '\033_K{}{}{}\033\\'.format(action_map[action], base64_encode(mods), key_extended_map[key]).encode('ascii') def interpret_key_event(key, scancode, mods, window, action): diff --git a/preprocess-readme.py b/preprocess-readme.py index df544d6fa..caa6ffe1a 100755 --- a/preprocess-readme.py +++ b/preprocess-readme.py @@ -37,7 +37,7 @@ if raw != nraw: raw = subprocess.check_output([ 'kitty', '-c', - 'from kitty.keys import *; import json; print(json.dumps(key_extended_map))' + 'from kitty.keys import *; import json; print(json.dumps(generate_key_extended_map(True)))' ]).decode('utf-8') key_map = json.loads(raw) lines = [ diff --git a/protocol-extensions.asciidoc b/protocol-extensions.asciidoc index 5f2fd1c68..b53b03c44 100644 --- a/protocol-extensions.asciidoc +++ b/protocol-extensions.asciidoc @@ -362,21 +362,18 @@ The escape sequence encodes the following properties: * The actual key being pressed ``` -_K:\ +_K\ ``` Where `` is one of `p` -- press, `r` -- release and `t` -- repeat. -Modifiers is a bitmask represented as a single hexadecimal digit in lower case. -Shift -- `0x1`, Control -- `0x2`, Alt -- `0x4` and Super -- `0x8`. `` is -a number (encoded in base64) corresponding to the key pressed. The key name to -number mapping is defined in link:key_encoding.asciidoc[this table]. +Modifiers is a bitmask represented as a single base64 digit. Shift -- `0x1`, +Control -- `0x2`, Alt -- `0x4` and Super -- `0x8`. `` is a number +(encoded in base64) corresponding to the key pressed. The key name to number +mapping is defined in link:key_encoding.asciidoc[this table]. For example: ``` -_Kp6:CQ\ is ++x (press) -_Krf:HO\ is ++++PageUp (release) +_KpGp\ is ++x (press) +_KrP8\ is ++++PageUp (release) ``` - -There is a `:` between the modifiers and the key-press so that in the future -more modifiers can be added, if needed.