No need ot build the key map on every startup

This commit is contained in:
Kovid Goyal 2017-02-11 10:48:36 +05:30
parent a66d2b0890
commit 72125701f5
2 changed files with 132 additions and 20 deletions

View File

@ -128,6 +128,127 @@ ENCODING = {
'Y': 'q',
'Z': 'r'
}
KEY_MAP = {
32: 'A',
39: 'B',
44: 'C',
45: 'D',
46: 'E',
47: 'F',
48: 'G',
49: 'H',
50: 'I',
51: 'J',
52: 'K',
53: 'L',
54: 'M',
55: 'N',
56: 'O',
57: 'P',
59: 'Q',
61: 'R',
65: 'S',
66: 'T',
67: 'U',
68: 'V',
69: 'W',
70: 'X',
71: 'Y',
72: 'Z',
73: 'a',
74: 'b',
75: 'c',
76: 'd',
77: 'e',
78: 'f',
79: 'g',
80: 'h',
81: 'i',
82: 'j',
83: 'k',
84: 'l',
85: 'm',
86: 'n',
87: 'o',
88: 'p',
89: 'q',
90: 'r',
91: 's',
92: 't',
93: 'u',
96: 'v',
161: 'w',
162: 'x',
256: 'y',
257: 'z',
258: '0',
259: '1',
260: '2',
261: '3',
262: '4',
263: '5',
264: '6',
265: '7',
266: '8',
267: '9',
268: '.',
269: '-',
280: ':',
281: '+',
282: '=',
283: '^',
284: '!',
290: '/',
291: '*',
292: '?',
293: '&',
294: '<',
295: '>',
296: '(',
297: ')',
298: '[',
299: ']',
300: '{',
301: '}',
302: '@',
303: '%',
304: '$',
305: '#',
306: 'BA',
307: 'BB',
308: 'BC',
309: 'BD',
310: 'BE',
311: 'BF',
312: 'BG',
313: 'BH',
314: 'BI',
320: 'BJ',
321: 'BK',
322: 'BL',
323: 'BM',
324: 'BN',
325: 'BO',
326: 'BP',
327: 'BQ',
328: 'BR',
329: 'BS',
330: 'BT',
331: 'BU',
332: 'BV',
333: 'BW',
334: 'BX',
335: 'BY',
336: 'BZ',
340: 'Ba',
341: 'Bb',
342: 'Bc',
343: 'Bd',
344: 'Be',
345: 'Bf',
346: 'Bg',
347: 'Bh'
}
# END_ENCODING }}}
@ -151,35 +272,28 @@ def symbolic_name(glfw_name):
return glfw_name[9:].replace('_', ' ')
def generate_extended_key_map(symbolic=False):
keys = (a for a in dir(defines) if a.startswith('GLFW_KEY_'))
ans = {}
for k in keys:
name = symbolic_name(k)
enc = ENCODING.get(name)
if name is not None:
ans[getattr(defines, k)] = enc
return ans
def update_encoding():
import re
import subprocess
from pprint import pformat
keys = {a for a in dir(defines) if a.startswith('GLFW_KEY_')}
ans = ENCODING
key_map = {}
i = len(ans)
for k in sorted(keys, key=lambda k: getattr(defines, k)):
val = getattr(defines, k)
name = symbolic_name(k)
if val < defines.GLFW_KEY_LAST and val != defines.GLFW_KEY_UNKNOWN and name not in ans:
ans[name] = encode(i)
i += 1
if val < defines.GLFW_KEY_LAST and val != defines.GLFW_KEY_UNKNOWN:
if name not in ans:
ans[name] = encode(i)
i += 1
key_map[val] = ans[name]
with open(__file__, 'r+') as f:
raw = f.read()
nraw = re.sub(
r'^ENCODING = {.+^# END_ENCODING',
'ENCODING = {}\n# END_ENCODING'.format(pformat(ans, indent=4)),
'ENCODING = {!r}\nKEY_MAP={!r}\n# END_ENCODING'.format(
ans, key_map
),
raw,
flags=re.MULTILINE | re.DOTALL
)

View File

@ -5,7 +5,7 @@
from . import fast_data_types as defines
from .terminfo import key_as_bytes
from .utils import base64_encode
from .key_encoding import generate_extended_key_map
from .key_encoding import KEY_MAP
smkx_key_map = {
defines.GLFW_KEY_UP: 'kcuu1',
@ -114,8 +114,6 @@ action_map = {
defines.GLFW_REPEAT: b't'
}
extended_key_map = generate_extended_key_map()
def extended_key_event(key, scancode, mods, action):
if key >= defines.GLFW_KEY_LAST or key == defines.GLFW_KEY_UNKNOWN or (
@ -127,7 +125,7 @@ def extended_key_event(key, scancode, mods, action):
defines.GLFW_KEY_BACKSPACE, defines.GLFW_KEY_ENTER
):
return smkx_key_map[key]
name = extended_key_map.get(key)
name = KEY_MAP.get(key)
if name is None:
return b''
return '\033_K{}{}{}\033\\'.format(