From 5297f7474d7fae20db466233d9e77e6db2c6e2a9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 12 Jan 2021 15:03:53 +0530 Subject: [PATCH] Remove another use of GLFW_KEY --- gen-key-constants.py | 4 +- glfw/input.c | 4 +- kitty/cli.py | 18 ++----- kitty/glfw.c | 116 ++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 125 insertions(+), 17 deletions(-) diff --git a/gen-key-constants.py b/gen-key-constants.py index 2e31c164c..1e746daa5 100644 --- a/gen-key-constants.py +++ b/gen-key-constants.py @@ -170,18 +170,20 @@ def generate_glfw_header() -> None: 'typedef enum {', f' GLFW_FKEY_FIRST = 0x{start_code:x}u,', ] - klines, pyi, names = [], [], [] + klines, pyi, names, knames = [], [], [], [] for name, code in name_to_code.items(): lines.append(f' GLFW_FKEY_{name.upper()} = 0x{code:x}u,') klines.append(f' ADDC(GLFW_FKEY_{name.upper()});') pyi.append(f'GLFW_FKEY_{name.upper()}: int') names.append(f' case GLFW_FKEY_{name.upper()}: return "{name.upper()}";') + knames.append(f' case GLFW_FKEY_{name.upper()}: return PyUnicode_FromString("{name}");') lines.append(f' GLFW_FKEY_LAST = 0x{last_code:x}u') lines.append('} GLFWFunctionKey;') patch_file('glfw/glfw3.h', 'functional key names', '\n'.join(lines)) patch_file('kitty/glfw.c', 'glfw functional keys', '\n'.join(klines)) patch_file('kitty/fast_data_types.pyi', 'glfw functional keys', '\n'.join(pyi), start_marker='# ', end_marker='') patch_file('glfw/input.c', 'functional key names', '\n'.join(names)) + patch_file('kitty/glfw.c', 'glfw functional key names', '\n'.join(knames)) def generate_xkb_mapping() -> None: diff --git a/glfw/input.c b/glfw/input.c index bb0e2f103..c64082916 100644 --- a/glfw/input.c +++ b/glfw/input.c @@ -527,7 +527,8 @@ encode_utf8(uint32_t ch, char* dest) { return 0; } -const char* _glfwGetKeyName(int key) +const char* +_glfwGetKeyName(int key) { switch (key) { @@ -788,6 +789,7 @@ GLFWAPI int glfwRawMouseMotionSupported(void) GLFWAPI const char* glfwGetKeyName(uint32_t key, int native_key) { _GLFW_REQUIRE_INIT_OR_RETURN(NULL); + if (key) return _glfwGetKeyName(key); native_key = _glfwPlatformGetNativeKeyForKey(key); return _glfwPlatformGetNativeKeyName(native_key); diff --git a/kitty/cli.py b/kitty/cli.py index 0b6a6f498..ab9d48559 100644 --- a/kitty/cli.py +++ b/kitty/cli.py @@ -759,14 +759,8 @@ ShortcutMap = Dict[Tuple[SingleKey, ...], KeyAction] def print_shortcut(key_sequence: Iterable[SingleKey], action: KeyAction) -> None: - if not getattr(print_shortcut, 'maps', None): - from kitty.keys import defines - v = vars(defines) - mmap = {m[len('GLFW_MOD_'):].lower(): x for m, x in v.items() if m.startswith('GLFW_MOD_')} - kmap = {k[len('GLFW_KEY_'):].lower(): x for k, x in v.items() if k.startswith('GLFW_KEY_')} - krmap = {v: k for k, v in kmap.items()} - setattr(print_shortcut, 'maps', (mmap, krmap)) - mmap, krmap = getattr(print_shortcut, 'maps') + from .fast_data_types import glfw_get_key_name, GLFW_MOD_ALT, GLFW_MOD_SHIFT, GLFW_MOD_CONTROL, GLFW_MOD_SUPER + mmap = {'shift': GLFW_MOD_SHIFT, 'alt': GLFW_MOD_ALT, 'ctrl': GLFW_MOD_CONTROL, ('cmd' if is_macos else 'super'): GLFW_MOD_SUPER} keys = [] for key_spec in key_sequence: names = [] @@ -775,12 +769,8 @@ def print_shortcut(key_sequence: Iterable[SingleKey], action: KeyAction) -> None if mods & val: names.append(name) if key: - if is_native: - from .fast_data_types import GLFW_KEY_UNKNOWN, glfw_get_key_name - kn = glfw_get_key_name(GLFW_KEY_UNKNOWN, key) or 'Unknown key' - names.append(kn) - else: - names.append(krmap[key]) + kname = glfw_get_key_name(0, key) if is_native else glfw_get_key_name(key, 0) + names.append(kname or f'{key}') keys.append('+'.join(names)) print('\t', ' > '.join(keys), action) diff --git a/kitty/glfw.c b/kitty/glfw.c index f4a1f9f20..c9579b5b2 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -7,6 +7,7 @@ #include "state.h" #include "fonts.h" #include "monotonic.h" +#include "charsets.h" #include #include "glfw-wrapper.h" extern bool cocoa_make_window_resizable(void *w, bool); @@ -858,8 +859,121 @@ static PyObject* glfw_get_key_name(PyObject UNUSED *self, PyObject *args) { int key, native_key; if (!PyArg_ParseTuple(args, "ii", &key, &native_key)) return NULL; + if (key) { + switch (key) { + /* start glfw functional key names (auto generated by gen-key-constants.py do not edit) */ + case GLFW_FKEY_ESCAPE: return PyUnicode_FromString("escape"); + case GLFW_FKEY_ENTER: return PyUnicode_FromString("enter"); + case GLFW_FKEY_TAB: return PyUnicode_FromString("tab"); + case GLFW_FKEY_BACKSPACE: return PyUnicode_FromString("backspace"); + case GLFW_FKEY_INSERT: return PyUnicode_FromString("insert"); + case GLFW_FKEY_DELETE: return PyUnicode_FromString("delete"); + case GLFW_FKEY_LEFT: return PyUnicode_FromString("left"); + case GLFW_FKEY_RIGHT: return PyUnicode_FromString("right"); + case GLFW_FKEY_UP: return PyUnicode_FromString("up"); + case GLFW_FKEY_DOWN: return PyUnicode_FromString("down"); + case GLFW_FKEY_PAGE_UP: return PyUnicode_FromString("page_up"); + case GLFW_FKEY_PAGE_DOWN: return PyUnicode_FromString("page_down"); + case GLFW_FKEY_HOME: return PyUnicode_FromString("home"); + case GLFW_FKEY_END: return PyUnicode_FromString("end"); + case GLFW_FKEY_CAPS_LOCK: return PyUnicode_FromString("caps_lock"); + case GLFW_FKEY_SCROLL_LOCK: return PyUnicode_FromString("scroll_lock"); + case GLFW_FKEY_NUM_LOCK: return PyUnicode_FromString("num_lock"); + case GLFW_FKEY_PRINT_SCREEN: return PyUnicode_FromString("print_screen"); + case GLFW_FKEY_PAUSE: return PyUnicode_FromString("pause"); + case GLFW_FKEY_MENU: return PyUnicode_FromString("menu"); + case GLFW_FKEY_F1: return PyUnicode_FromString("f1"); + case GLFW_FKEY_F2: return PyUnicode_FromString("f2"); + case GLFW_FKEY_F3: return PyUnicode_FromString("f3"); + case GLFW_FKEY_F4: return PyUnicode_FromString("f4"); + case GLFW_FKEY_F5: return PyUnicode_FromString("f5"); + case GLFW_FKEY_F6: return PyUnicode_FromString("f6"); + case GLFW_FKEY_F7: return PyUnicode_FromString("f7"); + case GLFW_FKEY_F8: return PyUnicode_FromString("f8"); + case GLFW_FKEY_F9: return PyUnicode_FromString("f9"); + case GLFW_FKEY_F10: return PyUnicode_FromString("f10"); + case GLFW_FKEY_F11: return PyUnicode_FromString("f11"); + case GLFW_FKEY_F12: return PyUnicode_FromString("f12"); + case GLFW_FKEY_F13: return PyUnicode_FromString("f13"); + case GLFW_FKEY_F14: return PyUnicode_FromString("f14"); + case GLFW_FKEY_F15: return PyUnicode_FromString("f15"); + case GLFW_FKEY_F16: return PyUnicode_FromString("f16"); + case GLFW_FKEY_F17: return PyUnicode_FromString("f17"); + case GLFW_FKEY_F18: return PyUnicode_FromString("f18"); + case GLFW_FKEY_F19: return PyUnicode_FromString("f19"); + case GLFW_FKEY_F20: return PyUnicode_FromString("f20"); + case GLFW_FKEY_F21: return PyUnicode_FromString("f21"); + case GLFW_FKEY_F22: return PyUnicode_FromString("f22"); + case GLFW_FKEY_F23: return PyUnicode_FromString("f23"); + case GLFW_FKEY_F24: return PyUnicode_FromString("f24"); + case GLFW_FKEY_F25: return PyUnicode_FromString("f25"); + case GLFW_FKEY_F26: return PyUnicode_FromString("f26"); + case GLFW_FKEY_F27: return PyUnicode_FromString("f27"); + case GLFW_FKEY_F28: return PyUnicode_FromString("f28"); + case GLFW_FKEY_F29: return PyUnicode_FromString("f29"); + case GLFW_FKEY_F30: return PyUnicode_FromString("f30"); + case GLFW_FKEY_F31: return PyUnicode_FromString("f31"); + case GLFW_FKEY_F32: return PyUnicode_FromString("f32"); + case GLFW_FKEY_F33: return PyUnicode_FromString("f33"); + case GLFW_FKEY_F34: return PyUnicode_FromString("f34"); + case GLFW_FKEY_F35: return PyUnicode_FromString("f35"); + case GLFW_FKEY_KP_0: return PyUnicode_FromString("kp_0"); + case GLFW_FKEY_KP_1: return PyUnicode_FromString("kp_1"); + case GLFW_FKEY_KP_2: return PyUnicode_FromString("kp_2"); + case GLFW_FKEY_KP_3: return PyUnicode_FromString("kp_3"); + case GLFW_FKEY_KP_4: return PyUnicode_FromString("kp_4"); + case GLFW_FKEY_KP_5: return PyUnicode_FromString("kp_5"); + case GLFW_FKEY_KP_6: return PyUnicode_FromString("kp_6"); + case GLFW_FKEY_KP_7: return PyUnicode_FromString("kp_7"); + case GLFW_FKEY_KP_8: return PyUnicode_FromString("kp_8"); + case GLFW_FKEY_KP_9: return PyUnicode_FromString("kp_9"); + case GLFW_FKEY_KP_DECIMAL: return PyUnicode_FromString("kp_decimal"); + case GLFW_FKEY_KP_DIVIDE: return PyUnicode_FromString("kp_divide"); + case GLFW_FKEY_KP_MULTIPLY: return PyUnicode_FromString("kp_multiply"); + case GLFW_FKEY_KP_SUBTRACT: return PyUnicode_FromString("kp_subtract"); + case GLFW_FKEY_KP_ADD: return PyUnicode_FromString("kp_add"); + case GLFW_FKEY_KP_ENTER: return PyUnicode_FromString("kp_enter"); + case GLFW_FKEY_KP_EQUAL: return PyUnicode_FromString("kp_equal"); + case GLFW_FKEY_KP_SEPARATOR: return PyUnicode_FromString("kp_separator"); + case GLFW_FKEY_KP_LEFT: return PyUnicode_FromString("kp_left"); + case GLFW_FKEY_KP_RIGHT: return PyUnicode_FromString("kp_right"); + case GLFW_FKEY_KP_UP: return PyUnicode_FromString("kp_up"); + case GLFW_FKEY_KP_DOWN: return PyUnicode_FromString("kp_down"); + case GLFW_FKEY_KP_PAGE_UP: return PyUnicode_FromString("kp_page_up"); + case GLFW_FKEY_KP_PAGE_DOWN: return PyUnicode_FromString("kp_page_down"); + case GLFW_FKEY_KP_HOME: return PyUnicode_FromString("kp_home"); + case GLFW_FKEY_KP_END: return PyUnicode_FromString("kp_end"); + case GLFW_FKEY_KP_INSERT: return PyUnicode_FromString("kp_insert"); + case GLFW_FKEY_KP_DELETE: return PyUnicode_FromString("kp_delete"); + case GLFW_FKEY_LEFT_SHIFT: return PyUnicode_FromString("left_shift"); + case GLFW_FKEY_LEFT_CONTROL: return PyUnicode_FromString("left_control"); + case GLFW_FKEY_LEFT_ALT: return PyUnicode_FromString("left_alt"); + case GLFW_FKEY_LEFT_SUPER: return PyUnicode_FromString("left_super"); + case GLFW_FKEY_RIGHT_SHIFT: return PyUnicode_FromString("right_shift"); + case GLFW_FKEY_RIGHT_CONTROL: return PyUnicode_FromString("right_control"); + case GLFW_FKEY_RIGHT_ALT: return PyUnicode_FromString("right_alt"); + case GLFW_FKEY_RIGHT_SUPER: return PyUnicode_FromString("right_super"); + case GLFW_FKEY_MEDIA_PLAY: return PyUnicode_FromString("media_play"); + case GLFW_FKEY_MEDIA_PAUSE: return PyUnicode_FromString("media_pause"); + case GLFW_FKEY_MEDIA_PLAY_PAUSE: return PyUnicode_FromString("media_play_pause"); + case GLFW_FKEY_MEDIA_REVERSE: return PyUnicode_FromString("media_reverse"); + case GLFW_FKEY_MEDIA_STOP: return PyUnicode_FromString("media_stop"); + case GLFW_FKEY_MEDIA_FAST_FORWARD: return PyUnicode_FromString("media_fast_forward"); + case GLFW_FKEY_MEDIA_REWIND: return PyUnicode_FromString("media_rewind"); + case GLFW_FKEY_MEDIA_TRACK_NEXT: return PyUnicode_FromString("media_track_next"); + case GLFW_FKEY_MEDIA_TRACK_PREVIOUS: return PyUnicode_FromString("media_track_previous"); + case GLFW_FKEY_MEDIA_RECORD: return PyUnicode_FromString("media_record"); + case GLFW_FKEY_LOWER_VOLUME: return PyUnicode_FromString("lower_volume"); + case GLFW_FKEY_RAISE_VOLUME: return PyUnicode_FromString("raise_volume"); + case GLFW_FKEY_MUTE_VOLUME: return PyUnicode_FromString("mute_volume"); +/* end glfw functional key names */ + } + char buf[8] = {0}; + encode_utf8(key, buf); + return PyUnicode_FromString(buf); + } if (!glfwGetKeyName) { - return PyUnicode_FromFormat("key: %d native_key: %d", key, native_key); + return PyUnicode_FromFormat("0x%x", native_key); } return Py_BuildValue("z", glfwGetKeyName(key, native_key)); }