termkey_defs.h (5311B)
1 #pragma once 2 3 #include <stddef.h> 4 #include <stdint.h> 5 6 #ifdef HAVE_UNIBILIUM 7 # include <unibilium.h> 8 #endif 9 10 #include <uv.h> 11 12 #include "nvim/event/defs.h" 13 #include "nvim/tui/terminfo_defs.h" 14 #include "nvim/tui/tui_defs.h" 15 #include "nvim/types_defs.h" 16 17 typedef struct TermKey TermKey; 18 19 typedef struct { 20 TermKey *tk; 21 int saved_string_id; 22 char *saved_string; 23 } TermKeyCsi; 24 25 typedef enum { 26 TERMKEY_RES_NONE, 27 TERMKEY_RES_KEY, 28 TERMKEY_RES_EOF, 29 TERMKEY_RES_AGAIN, 30 TERMKEY_RES_ERROR, 31 } TermKeyResult; 32 33 typedef enum { 34 TERMKEY_SYM_UNKNOWN = -1, 35 TERMKEY_SYM_NONE = 0, 36 37 // Special names in C0 38 TERMKEY_SYM_BACKSPACE, 39 TERMKEY_SYM_TAB, 40 TERMKEY_SYM_ENTER, 41 TERMKEY_SYM_ESCAPE, 42 43 // Special names in G0 44 TERMKEY_SYM_SPACE, 45 TERMKEY_SYM_DEL, 46 47 // Special keys 48 TERMKEY_SYM_UP, 49 TERMKEY_SYM_DOWN, 50 TERMKEY_SYM_LEFT, 51 TERMKEY_SYM_RIGHT, 52 TERMKEY_SYM_BEGIN, 53 TERMKEY_SYM_FIND, 54 TERMKEY_SYM_INSERT, 55 TERMKEY_SYM_DELETE, 56 TERMKEY_SYM_SELECT, 57 TERMKEY_SYM_PAGEUP, 58 TERMKEY_SYM_PAGEDOWN, 59 TERMKEY_SYM_HOME, 60 TERMKEY_SYM_END, 61 62 // Special keys from terminfo 63 TERMKEY_SYM_CANCEL, 64 TERMKEY_SYM_CLEAR, 65 TERMKEY_SYM_CLOSE, 66 TERMKEY_SYM_COMMAND, 67 TERMKEY_SYM_COPY, 68 TERMKEY_SYM_EXIT, 69 TERMKEY_SYM_HELP, 70 TERMKEY_SYM_MARK, 71 TERMKEY_SYM_MESSAGE, 72 TERMKEY_SYM_MOVE, 73 TERMKEY_SYM_OPEN, 74 TERMKEY_SYM_OPTIONS, 75 TERMKEY_SYM_PRINT, 76 TERMKEY_SYM_REDO, 77 TERMKEY_SYM_REFERENCE, 78 TERMKEY_SYM_REFRESH, 79 TERMKEY_SYM_REPLACE, 80 TERMKEY_SYM_RESTART, 81 TERMKEY_SYM_RESUME, 82 TERMKEY_SYM_SAVE, 83 TERMKEY_SYM_SUSPEND, 84 TERMKEY_SYM_UNDO, 85 86 // Numeric keypad special keys 87 TERMKEY_SYM_KP0, 88 TERMKEY_SYM_KP1, 89 TERMKEY_SYM_KP2, 90 TERMKEY_SYM_KP3, 91 TERMKEY_SYM_KP4, 92 TERMKEY_SYM_KP5, 93 TERMKEY_SYM_KP6, 94 TERMKEY_SYM_KP7, 95 TERMKEY_SYM_KP8, 96 TERMKEY_SYM_KP9, 97 TERMKEY_SYM_KPENTER, 98 TERMKEY_SYM_KPPLUS, 99 TERMKEY_SYM_KPMINUS, 100 TERMKEY_SYM_KPMULT, 101 TERMKEY_SYM_KPDIV, 102 TERMKEY_SYM_KPCOMMA, 103 TERMKEY_SYM_KPPERIOD, 104 TERMKEY_SYM_KPEQUALS, 105 106 // et cetera ad nauseum 107 TERMKEY_N_SYMS, 108 } TermKeySym; 109 110 typedef enum { 111 TERMKEY_TYPE_UNICODE, 112 TERMKEY_TYPE_FUNCTION, 113 TERMKEY_TYPE_KEYSYM, 114 TERMKEY_TYPE_MOUSE, 115 TERMKEY_TYPE_POSITION, 116 TERMKEY_TYPE_MODEREPORT, 117 TERMKEY_TYPE_DCS, 118 TERMKEY_TYPE_OSC, 119 TERMKEY_TYPE_APC, 120 // add other recognised types here 121 122 TERMKEY_TYPE_UNKNOWN_CSI = -1, 123 } TermKeyType; 124 125 typedef enum { 126 TERMKEY_MOUSE_UNKNOWN, 127 TERMKEY_MOUSE_PRESS, 128 TERMKEY_MOUSE_DRAG, 129 TERMKEY_MOUSE_RELEASE, 130 } TermKeyMouseEvent; 131 132 typedef enum { 133 TERMKEY_EVENT_UNKNOWN, 134 TERMKEY_EVENT_PRESS, 135 TERMKEY_EVENT_REPEAT, 136 TERMKEY_EVENT_RELEASE, 137 } TermKeyEvent; 138 139 enum { 140 TERMKEY_KEYMOD_SHIFT = 1 << 0, 141 TERMKEY_KEYMOD_ALT = 1 << 1, 142 TERMKEY_KEYMOD_CTRL = 1 << 2, 143 }; 144 145 typedef struct { 146 const unsigned char *param; 147 size_t length; 148 } TermKeyCsiParam; 149 150 enum { 151 TERMKEY_FLAG_NOINTERPRET = 1 << 0, // Do not interpret C0//DEL codes if possible 152 TERMKEY_FLAG_CONVERTKP = 1 << 1, // Convert KP codes to regular keypresses 153 TERMKEY_FLAG_RAW = 1 << 2, // Input is raw bytes, not UTF-8 154 TERMKEY_FLAG_UTF8 = 1 << 3, // Input is definitely UTF-8 155 TERMKEY_FLAG_NOTERMIOS = 1 << 4, // Do not make initial termios calls on construction 156 TERMKEY_FLAG_SPACESYMBOL = 1 << 5, // Sets TERMKEY_CANON_SPACESYMBOL 157 TERMKEY_FLAG_CTRLC = 1 << 6, // Allow Ctrl-C to be read as normal, disabling SIGINT 158 TERMKEY_FLAG_EINTR = 1 << 7, // Return ERROR on signal (EINTR) rather than retry 159 TERMKEY_FLAG_NOSTART = 1 << 8, // Do not call termkey_start() in constructor 160 TERMKEY_FLAG_KEEPC0 = 1 << 9, // Keep raw C0 control codes 161 }; 162 163 enum { 164 TERMKEY_CANON_SPACESYMBOL = 1 << 0, // Space is symbolic rather than Unicode 165 TERMKEY_CANON_DELBS = 1 << 1, // Del is converted to Backspace 166 }; 167 168 typedef struct { 169 TermKeyType type; 170 union { 171 int codepoint; // TERMKEY_TYPE_UNICODE 172 int number; // TERMKEY_TYPE_FUNCTION 173 TermKeySym sym; // TERMKEY_TYPE_KEYSYM 174 char mouse[4]; // TERMKEY_TYPE_MOUSE 175 // opaque. see termkey_interpret_mouse 176 } code; 177 178 int modifiers; 179 180 TermKeyEvent event; 181 182 // Any Unicode character can be UTF-8 encoded in no more than 6 bytes, plus 183 // terminating NUL 184 char utf8[7]; 185 } TermKeyKey; 186 187 // Mostly-undocumented hooks for doing evil evil things 188 typedef const char *TermKey_Terminfo_Getstr_Hook(const char *name, const char *value, void *data); 189 190 typedef enum { 191 TERMKEY_FORMAT_LONGMOD = 1 << 0, // Shift-... instead of S-... 192 TERMKEY_FORMAT_CARETCTRL = 1 << 1, // ^X instead of C-X 193 TERMKEY_FORMAT_ALTISMETA = 1 << 2, // Meta- or M- instead of Alt- or A- 194 TERMKEY_FORMAT_WRAPBRACKET = 1 << 3, // Wrap special keys in brackets like <Escape> 195 TERMKEY_FORMAT_SPACEMOD = 1 << 4, // M Foo instead of M-Foo 196 TERMKEY_FORMAT_LOWERMOD = 1 << 5, // meta or m instead of Meta or M 197 TERMKEY_FORMAT_LOWERSPACE = 1 << 6, // page down instead of PageDown 198 199 TERMKEY_FORMAT_MOUSE_POS = 1 << 8, // Include mouse position if relevant; @ col,line 200 } TermKeyFormat; 201 202 // Some useful combinations 203 204 #define TERMKEY_FORMAT_VIM (TermKeyFormat)(TERMKEY_FORMAT_ALTISMETA|TERMKEY_FORMAT_WRAPBRACKET) 205 206 typedef struct { 207 TermKey *tk; 208 209 TerminfoEntry *ti; // not used after first 'start' call 210 211 struct trie_node *root; 212 213 char *start_string; 214 char *stop_string; 215 } TermKeyTI;