neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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;