diff --git a/docs/keyboard-protocol.rst b/docs/keyboard-protocol.rst index ec96d44f4..2b97732e2 100644 --- a/docs/keyboard-protocol.rst +++ b/docs/keyboard-protocol.rst @@ -535,9 +535,10 @@ compatibility reasons. "RAISE_VOLUME", "``57438 u``", "MUTE_VOLUME", "``57439 u``" "LEFT_SHIFT", "``57440 u``", "LEFT_CONTROL", "``57441 u``" "LEFT_ALT", "``57442 u``", "LEFT_SUPER", "``57443 u``" - "RIGHT_SHIFT", "``57444 u``", "RIGHT_CONTROL", "``57445 u``" - "RIGHT_ALT", "``57446 u``", "RIGHT_SUPER", "``57447 u``" - "ISO_LEVEL3_SHIFT", "``57448 u``", "ISO_LEVEL5_SHIFT", "``57449 u``" + "LEFT_HYPER", "``57444 u``", "RIGHT_SHIFT", "``57445 u``" + "RIGHT_CONTROL", "``57446 u``", "RIGHT_ALT", "``57447 u``" + "RIGHT_SUPER", "``57448 u``", "RIGHT_HYPER", "``57449 u``" + "ISO_LEVEL3_SHIFT", "``57450 u``", "ISO_LEVEL5_SHIFT", "``57451 u``" .. end functional key table .. }}} diff --git a/gen-key-constants.py b/gen-key-constants.py old mode 100644 new mode 100755 index e3db2fd02..dc89025ce --- a/gen-key-constants.py +++ b/gen-key-constants.py @@ -108,10 +108,12 @@ left_shift Shift_L 0x38 - left_control Control_L 0x3B - left_alt Alt_L 0x3A - left_super Super_L 0x37 - +left_hyper Hyper_L - - right_shift Shift_R 0x3C - right_control Control_R 0x3E - right_alt Alt_R 0x3D - right_super Super_R 0x36 - +right_hyper Hyper_R - - iso_level3_shift ISO_Level3_Shift - - iso_level5_shift ISO_Level5_Shift - - ''' # }}} diff --git a/glfw/glfw3.h b/glfw/glfw3.h index 6c778779b..e7ee09fda 100644 --- a/glfw/glfw3.h +++ b/glfw/glfw3.h @@ -445,13 +445,15 @@ typedef enum { GLFW_FKEY_LEFT_CONTROL = 0xe061u, GLFW_FKEY_LEFT_ALT = 0xe062u, GLFW_FKEY_LEFT_SUPER = 0xe063u, - GLFW_FKEY_RIGHT_SHIFT = 0xe064u, - GLFW_FKEY_RIGHT_CONTROL = 0xe065u, - GLFW_FKEY_RIGHT_ALT = 0xe066u, - GLFW_FKEY_RIGHT_SUPER = 0xe067u, - GLFW_FKEY_ISO_LEVEL3_SHIFT = 0xe068u, - GLFW_FKEY_ISO_LEVEL5_SHIFT = 0xe069u, - GLFW_FKEY_LAST = 0xe069u + GLFW_FKEY_LEFT_HYPER = 0xe064u, + GLFW_FKEY_RIGHT_SHIFT = 0xe065u, + GLFW_FKEY_RIGHT_CONTROL = 0xe066u, + GLFW_FKEY_RIGHT_ALT = 0xe067u, + GLFW_FKEY_RIGHT_SUPER = 0xe068u, + GLFW_FKEY_RIGHT_HYPER = 0xe069u, + GLFW_FKEY_ISO_LEVEL3_SHIFT = 0xe06au, + GLFW_FKEY_ISO_LEVEL5_SHIFT = 0xe06bu, + GLFW_FKEY_LAST = 0xe06bu } GLFWFunctionKey; /* end functional key names */ diff --git a/glfw/input.c b/glfw/input.c index 8d0f4c972..c6a7569e6 100644 --- a/glfw/input.c +++ b/glfw/input.c @@ -624,10 +624,12 @@ _glfwGetKeyName(int key) case GLFW_FKEY_LEFT_CONTROL: return "LEFT_CONTROL"; case GLFW_FKEY_LEFT_ALT: return "LEFT_ALT"; case GLFW_FKEY_LEFT_SUPER: return "LEFT_SUPER"; + case GLFW_FKEY_LEFT_HYPER: return "LEFT_HYPER"; case GLFW_FKEY_RIGHT_SHIFT: return "RIGHT_SHIFT"; case GLFW_FKEY_RIGHT_CONTROL: return "RIGHT_CONTROL"; case GLFW_FKEY_RIGHT_ALT: return "RIGHT_ALT"; case GLFW_FKEY_RIGHT_SUPER: return "RIGHT_SUPER"; + case GLFW_FKEY_RIGHT_HYPER: return "RIGHT_HYPER"; case GLFW_FKEY_ISO_LEVEL3_SHIFT: return "ISO_LEVEL3_SHIFT"; case GLFW_FKEY_ISO_LEVEL5_SHIFT: return "ISO_LEVEL5_SHIFT"; /* end functional key names */ diff --git a/glfw/xkb_glfw.c b/glfw/xkb_glfw.c index 9fe776a14..b2aac8f14 100644 --- a/glfw/xkb_glfw.c +++ b/glfw/xkb_glfw.c @@ -140,10 +140,12 @@ glfw_key_for_sym(xkb_keysym_t key) { case XKB_KEY_Control_L: return GLFW_FKEY_LEFT_CONTROL; case XKB_KEY_Alt_L: return GLFW_FKEY_LEFT_ALT; case XKB_KEY_Super_L: return GLFW_FKEY_LEFT_SUPER; + case XKB_KEY_Hyper_L: return GLFW_FKEY_LEFT_HYPER; case XKB_KEY_Shift_R: return GLFW_FKEY_RIGHT_SHIFT; case XKB_KEY_Control_R: return GLFW_FKEY_RIGHT_CONTROL; case XKB_KEY_Alt_R: return GLFW_FKEY_RIGHT_ALT; case XKB_KEY_Super_R: return GLFW_FKEY_RIGHT_SUPER; + case XKB_KEY_Hyper_R: return GLFW_FKEY_RIGHT_HYPER; case XKB_KEY_ISO_Level3_Shift: return GLFW_FKEY_ISO_LEVEL3_SHIFT; case XKB_KEY_ISO_Level5_Shift: return GLFW_FKEY_ISO_LEVEL5_SHIFT; /* end xkb to glfw */ @@ -254,10 +256,12 @@ glfw_xkb_sym_for_key(uint32_t key) { case GLFW_FKEY_LEFT_CONTROL: return XKB_KEY_Control_L; case GLFW_FKEY_LEFT_ALT: return XKB_KEY_Alt_L; case GLFW_FKEY_LEFT_SUPER: return XKB_KEY_Super_L; + case GLFW_FKEY_LEFT_HYPER: return XKB_KEY_Hyper_L; case GLFW_FKEY_RIGHT_SHIFT: return XKB_KEY_Shift_R; case GLFW_FKEY_RIGHT_CONTROL: return XKB_KEY_Control_R; case GLFW_FKEY_RIGHT_ALT: return XKB_KEY_Alt_R; case GLFW_FKEY_RIGHT_SUPER: return XKB_KEY_Super_R; + case GLFW_FKEY_RIGHT_HYPER: return XKB_KEY_Hyper_R; case GLFW_FKEY_ISO_LEVEL3_SHIFT: return XKB_KEY_ISO_Level3_Shift; case GLFW_FKEY_ISO_LEVEL5_SHIFT: return XKB_KEY_ISO_Level5_Shift; /* end glfw to xkb */ diff --git a/kitty/fast_data_types.pyi b/kitty/fast_data_types.pyi index 363608bba..11d394c65 100644 --- a/kitty/fast_data_types.pyi +++ b/kitty/fast_data_types.pyi @@ -118,10 +118,12 @@ GLFW_FKEY_LEFT_SHIFT: int GLFW_FKEY_LEFT_CONTROL: int GLFW_FKEY_LEFT_ALT: int GLFW_FKEY_LEFT_SUPER: int +GLFW_FKEY_LEFT_HYPER: int GLFW_FKEY_RIGHT_SHIFT: int GLFW_FKEY_RIGHT_CONTROL: int GLFW_FKEY_RIGHT_ALT: int GLFW_FKEY_RIGHT_SUPER: int +GLFW_FKEY_RIGHT_HYPER: int GLFW_FKEY_ISO_LEVEL3_SHIFT: int GLFW_FKEY_ISO_LEVEL5_SHIFT: int # end glfw functional keys diff --git a/kitty/glfw.c b/kitty/glfw.c index 3c5420695..2dce3191a 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -962,10 +962,12 @@ glfw_get_key_name(PyObject UNUSED *self, PyObject *args) { 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_LEFT_HYPER: return PyUnicode_FromString("left_hyper"); 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_RIGHT_HYPER: return PyUnicode_FromString("right_hyper"); case GLFW_FKEY_ISO_LEVEL3_SHIFT: return PyUnicode_FromString("iso_level3_shift"); case GLFW_FKEY_ISO_LEVEL5_SHIFT: return PyUnicode_FromString("iso_level5_shift"); /* end glfw functional key names */ @@ -1476,10 +1478,12 @@ init_glfw(PyObject *m) { ADDC(GLFW_FKEY_LEFT_CONTROL); ADDC(GLFW_FKEY_LEFT_ALT); ADDC(GLFW_FKEY_LEFT_SUPER); + ADDC(GLFW_FKEY_LEFT_HYPER); ADDC(GLFW_FKEY_RIGHT_SHIFT); ADDC(GLFW_FKEY_RIGHT_CONTROL); ADDC(GLFW_FKEY_RIGHT_ALT); ADDC(GLFW_FKEY_RIGHT_SUPER); + ADDC(GLFW_FKEY_RIGHT_HYPER); ADDC(GLFW_FKEY_ISO_LEVEL3_SHIFT); ADDC(GLFW_FKEY_ISO_LEVEL5_SHIFT); /* end glfw functional keys */ diff --git a/kitty/key_encoding.c b/kitty/key_encoding.c index 56c113632..96e89608e 100644 --- a/kitty/key_encoding.c +++ b/kitty/key_encoding.c @@ -31,8 +31,8 @@ typedef struct { KeyAction action; } EncodingData; -static inline bool -is_modifier_key(uint32_t key) { +bool +is_modifier_key(const uint32_t key) { START_ALLOW_CASE_RANGE switch (key) { case GLFW_FKEY_LEFT_SHIFT ... GLFW_FKEY_ISO_LEVEL5_SHIFT: diff --git a/kitty/key_encoding.py b/kitty/key_encoding.py index 614d7f394..ce65575a2 100644 --- a/kitty/key_encoding.py +++ b/kitty/key_encoding.py @@ -114,12 +114,14 @@ functional_key_number_to_name_map = { 57441: 'LEFT_CONTROL', 57442: 'LEFT_ALT', 57443: 'LEFT_SUPER', - 57444: 'RIGHT_SHIFT', - 57445: 'RIGHT_CONTROL', - 57446: 'RIGHT_ALT', - 57447: 'RIGHT_SUPER', - 57448: 'ISO_LEVEL3_SHIFT', - 57449: 'ISO_LEVEL5_SHIFT'} + 57444: 'LEFT_HYPER', + 57445: 'RIGHT_SHIFT', + 57446: 'RIGHT_CONTROL', + 57447: 'RIGHT_ALT', + 57448: 'RIGHT_SUPER', + 57449: 'RIGHT_HYPER', + 57450: 'ISO_LEVEL3_SHIFT', + 57451: 'ISO_LEVEL5_SHIFT'} csi_number_to_functional_number_map = { 2: 57348, 3: 57349, diff --git a/kitty/keys.c b/kitty/keys.c index ccf514911..1f0dec054 100644 --- a/kitty/keys.c +++ b/kitty/keys.c @@ -79,24 +79,6 @@ active_window(void) { return NULL; } -static inline bool -is_modifier_key(uint32_t key) { - switch(key) { - case GLFW_FKEY_LEFT_SHIFT: - case GLFW_FKEY_RIGHT_SHIFT: - case GLFW_FKEY_LEFT_ALT: - case GLFW_FKEY_RIGHT_ALT: - case GLFW_FKEY_LEFT_CONTROL: - case GLFW_FKEY_RIGHT_CONTROL: - case GLFW_FKEY_LEFT_SUPER: - case GLFW_FKEY_RIGHT_SUPER: - case GLFW_FKEY_CAPS_LOCK: - return true; - default: - return false; - } -} - static inline void update_ime_position(OSWindow *os_window, Window* w, Screen *screen) { unsigned int cell_width = os_window->fonts_data->cell_width, cell_height = os_window->fonts_data->cell_height; @@ -149,11 +131,7 @@ on_key_input(GLFWkeyevent *ev) { if (global_state.in_sequence_mode) { debug("in sequence mode, handling as shortcut\n"); if ( - action != GLFW_RELEASE && - key != GLFW_FKEY_LEFT_SHIFT && key != GLFW_FKEY_RIGHT_SHIFT && - key != GLFW_FKEY_LEFT_ALT && key != GLFW_FKEY_RIGHT_ALT && - key != GLFW_FKEY_LEFT_CONTROL && key != GLFW_FKEY_RIGHT_CONTROL && - key != GLFW_FKEY_LEFT_SUPER && key != GLFW_FKEY_RIGHT_SUPER + action != GLFW_RELEASE && !is_modifier_key(key) ) { create_key_event(); call_boss(process_sequence, "O", ke); diff --git a/kitty/keys.h b/kitty/keys.h index 19f3f3b3a..1f80d0e4a 100644 --- a/kitty/keys.h +++ b/kitty/keys.h @@ -17,3 +17,6 @@ int encode_glfw_key_event(const GLFWkeyevent *e, const bool cursor_key_mode, const unsigned flags, char *output); + +bool +is_modifier_key(const uint32_t key);