| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #ifndef TERMINAL_KEY_H | ||
| 2 | #define TERMINAL_KEY_H | ||
| 3 | |||
| 4 | #include <stddef.h> | ||
| 5 | #include <stdint.h> | ||
| 6 | #include "util/macros.h" | ||
| 7 | |||
| 8 | enum { | ||
| 9 | // Buffer size for keycode_to_str() | ||
| 10 | KEYCODE_STR_BUFSIZE = 32 // next_pow2(sizeof("QUERY REPLY; 0x12345678")) | ||
| 11 | }; | ||
| 12 | |||
| 13 | // NOLINTNEXTLINE(readability-enum-initial-value,cert-int09-c) | ||
| 14 | enum { | ||
| 15 | KEY_NONE = 0, | ||
| 16 | KEY_TAB = '\t', | ||
| 17 | KEY_ENTER = '\n', | ||
| 18 | KEY_SPACE = ' ', | ||
| 19 | |||
| 20 | // This is the maximum Unicode codepoint allowed by RFC 3629. | ||
| 21 | // When stored in a 32-bit integer, it only requires the first | ||
| 22 | // 21 low-order bits, leaving 11 high-order bits available to | ||
| 23 | // be used as bit flags. | ||
| 24 | KEY_UNICODE_MAX = 0x10FFFF, // UNICODE_MAX_VALID_CODEPOINT | ||
| 25 | KEY_MASK = 0x1FFFFF, // (1 << 21) - 1 | ||
| 26 | |||
| 27 | // In addition to the 11 unused, high-order bits, there are also | ||
| 28 | // 983,042 unused values in the range from KEY_UNICODE_MAX + 1 to | ||
| 29 | // KEY_MASK, which can be used to represent special keys. | ||
| 30 | KEY_SPECIAL_MIN = KEY_UNICODE_MAX + 1, | ||
| 31 | |||
| 32 | // Note: these must be kept in sync with the array of names in key.c | ||
| 33 | KEY_ESCAPE = KEY_SPECIAL_MIN, | ||
| 34 | KEY_BACKSPACE, | ||
| 35 | KEY_INSERT, | ||
| 36 | KEY_DELETE, | ||
| 37 | KEY_HOME, | ||
| 38 | KEY_END, | ||
| 39 | KEY_PAGE_UP, | ||
| 40 | KEY_PAGE_DOWN, | ||
| 41 | KEY_UP, | ||
| 42 | KEY_DOWN, | ||
| 43 | KEY_RIGHT, | ||
| 44 | KEY_LEFT, | ||
| 45 | KEY_BEGIN, // Keypad '5' | ||
| 46 | KEY_SCROLL_LOCK, | ||
| 47 | KEY_PRINT_SCREEN, | ||
| 48 | KEY_PAUSE, | ||
| 49 | KEY_MENU, | ||
| 50 | KEY_F1, | ||
| 51 | KEY_F2, | ||
| 52 | KEY_F3, | ||
| 53 | KEY_F4, | ||
| 54 | KEY_F5, | ||
| 55 | KEY_F6, | ||
| 56 | KEY_F7, | ||
| 57 | KEY_F8, | ||
| 58 | KEY_F9, | ||
| 59 | KEY_F10, | ||
| 60 | KEY_F11, | ||
| 61 | KEY_F12, | ||
| 62 | KEY_F13, | ||
| 63 | KEY_F14, | ||
| 64 | KEY_F15, | ||
| 65 | KEY_F16, | ||
| 66 | KEY_F17, | ||
| 67 | KEY_F18, | ||
| 68 | KEY_F19, | ||
| 69 | KEY_F20, | ||
| 70 | KEY_F21, | ||
| 71 | KEY_F22, | ||
| 72 | KEY_F23, | ||
| 73 | KEY_F24, | ||
| 74 | |||
| 75 | KEY_SPECIAL_MAX = KEY_F24, | ||
| 76 | NR_SPECIAL_KEYS = KEY_SPECIAL_MAX - KEY_SPECIAL_MIN + 1, | ||
| 77 | |||
| 78 | // In-band signalling for non-key events | ||
| 79 | KEYCODE_DETECTED_PASTE = KEY_SPECIAL_MAX + 1, | ||
| 80 | KEYCODE_BRACKETED_PASTE, | ||
| 81 | KEY_IGNORE, | ||
| 82 | |||
| 83 | // Modifier bit flags (as described above) | ||
| 84 | // See also: decode_modifiers() | ||
| 85 | KEYCODE_MODIFIER_OFFSET = 21, | ||
| 86 | MOD_SHIFT = 1 << KEYCODE_MODIFIER_OFFSET, | ||
| 87 | MOD_META = 2 << KEYCODE_MODIFIER_OFFSET, | ||
| 88 | MOD_CTRL = 4 << KEYCODE_MODIFIER_OFFSET, | ||
| 89 | MOD_SUPER = 8 << KEYCODE_MODIFIER_OFFSET, | ||
| 90 | MOD_HYPER = 16 << KEYCODE_MODIFIER_OFFSET, | ||
| 91 | MOD_MASK = MOD_SHIFT | MOD_META | MOD_CTRL | MOD_SUPER | MOD_HYPER, | ||
| 92 | |||
| 93 | // If this bit is set, all other bits correspond to TermFeatureFlags. | ||
| 94 | // This is used by the functions in query.c to communicate replies to | ||
| 95 | // term_read_input(), although such values are handled entirely within | ||
| 96 | // that function and are never present in KeyCode values it returns. | ||
| 97 | KEYCODE_QUERY_REPLY_BIT = 1u << 30, | ||
| 98 | }; | ||
| 99 | |||
| 100 | typedef uint32_t KeyCode; | ||
| 101 | |||
| 102 | 595 | static inline KeyCode keycode_get_key(KeyCode k) | |
| 103 | { | ||
| 104 | 595 | return k & KEY_MASK; | |
| 105 | } | ||
| 106 | |||
| 107 | static inline KeyCode keycode_get_modifiers(KeyCode k) | ||
| 108 | { | ||
| 109 | return k & MOD_MASK; | ||
| 110 | } | ||
| 111 | |||
| 112 | KeyCode keycode_from_str(const char *str) NONNULL_ARGS WARN_UNUSED_RESULT; | ||
| 113 | size_t keycode_to_str(KeyCode key, char buf[static KEYCODE_STR_BUFSIZE]) NONNULL_ARGS; | ||
| 114 | |||
| 115 | #endif | ||
| 116 |