#ifndef TERMKEY2_H #define TERMKEY2_H #include #include #include #include "termkey2-config.h" #define TERMKEY_CHECK_VERSION \ termkey_check_version (TERMKEY_VERSION_MAJOR, TERMKEY_VERSION_MINOR) typedef enum termkey_sym termkey_sym_t; enum termkey_sym { TERMKEY_SYM_UNKNOWN = -1, TERMKEY_SYM_NONE = 0, /* Special names in C0 */ TERMKEY_SYM_BACKSPACE, TERMKEY_SYM_TAB, TERMKEY_SYM_ENTER, TERMKEY_SYM_ESCAPE, /* Special names in G0 */ TERMKEY_SYM_SPACE, TERMKEY_SYM_DEL, /* Special keys */ TERMKEY_SYM_UP, TERMKEY_SYM_DOWN, TERMKEY_SYM_LEFT, TERMKEY_SYM_RIGHT, TERMKEY_SYM_BEGIN, TERMKEY_SYM_FIND, TERMKEY_SYM_INSERT, TERMKEY_SYM_DELETE, TERMKEY_SYM_SELECT, TERMKEY_SYM_PAGEUP, TERMKEY_SYM_PAGEDOWN, TERMKEY_SYM_HOME, TERMKEY_SYM_END, /* Special keys from terminfo */ TERMKEY_SYM_CANCEL, TERMKEY_SYM_CLEAR, TERMKEY_SYM_CLOSE, TERMKEY_SYM_COMMAND, TERMKEY_SYM_COPY, TERMKEY_SYM_EXIT, TERMKEY_SYM_HELP, TERMKEY_SYM_MARK, TERMKEY_SYM_MESSAGE, TERMKEY_SYM_MOVE, TERMKEY_SYM_OPEN, TERMKEY_SYM_OPTIONS, TERMKEY_SYM_PRINT, TERMKEY_SYM_REDO, TERMKEY_SYM_REFERENCE, TERMKEY_SYM_REFRESH, TERMKEY_SYM_REPLACE, TERMKEY_SYM_RESTART, TERMKEY_SYM_RESUME, TERMKEY_SYM_SAVE, TERMKEY_SYM_SUSPEND, TERMKEY_SYM_UNDO, /* Numeric keypad special keys */ TERMKEY_SYM_KP0, TERMKEY_SYM_KP1, TERMKEY_SYM_KP2, TERMKEY_SYM_KP3, TERMKEY_SYM_KP4, TERMKEY_SYM_KP5, TERMKEY_SYM_KP6, TERMKEY_SYM_KP7, TERMKEY_SYM_KP8, TERMKEY_SYM_KP9, TERMKEY_SYM_KPENTER, TERMKEY_SYM_KPPLUS, TERMKEY_SYM_KPMINUS, TERMKEY_SYM_KPMULT, TERMKEY_SYM_KPDIV, TERMKEY_SYM_KPCOMMA, TERMKEY_SYM_KPPERIOD, TERMKEY_SYM_KPEQUALS, TERMKEY_N_SYMS }; typedef enum termkey_type termkey_type_t; enum termkey_type { TERMKEY_TYPE_KEY, TERMKEY_TYPE_FUNCTION, TERMKEY_TYPE_KEYSYM, TERMKEY_TYPE_MOUSE, TERMKEY_TYPE_POSITION, TERMKEY_TYPE_MODEREPORT, /* add other recognised types here */ TERMKEY_TYPE_UNKNOWN_CSI = -1 }; typedef enum termkey_result termkey_result_t; enum termkey_result { TERMKEY_RES_NONE, TERMKEY_RES_KEY, TERMKEY_RES_EOF, TERMKEY_RES_AGAIN, TERMKEY_RES_ERROR }; typedef enum termkey_mouse_event termkey_mouse_event_t; enum termkey_mouse_event { TERMKEY_MOUSE_UNKNOWN, TERMKEY_MOUSE_PRESS, TERMKEY_MOUSE_DRAG, TERMKEY_MOUSE_RELEASE }; enum { TERMKEY_KEYMOD_SHIFT = 1 << 0, TERMKEY_KEYMOD_ALT = 1 << 1, TERMKEY_KEYMOD_CTRL = 1 << 2 }; typedef struct termkey_key termkey_key_t; struct termkey_key { termkey_type_t type; union { uint32_t codepoint; /* TERMKEY_TYPE_KEY */ int number; /* TERMKEY_TYPE_FUNCTION */ termkey_sym_t sym; /* TERMKEY_TYPE_KEYSYM */ char mouse[4]; /* TERMKEY_TYPE_MOUSE */ /* opaque, see termkey_interpret_mouse() */ } code; int modifiers; /* The raw multibyte sequence for the key */ char multibyte[MB_LEN_MAX + 1]; }; typedef struct termkey termkey_t; enum { /* Do not interpret C0//DEL codes if possible */ TERMKEY_FLAG_NOINTERPRET = 1 << 0, /* Convert KP codes to regular keypresses */ TERMKEY_FLAG_CONVERTKP = 1 << 1, /* Don't try to decode the input characters */ TERMKEY_FLAG_RAW = 1 << 2, /* Do not make initial termios calls on construction */ TERMKEY_FLAG_NOTERMIOS = 1 << 4, /* Sets TERMKEY_CANON_SPACESYMBOL */ TERMKEY_FLAG_SPACESYMBOL = 1 << 5, /* Allow Ctrl-C to be read as normal, disabling SIGINT */ TERMKEY_FLAG_CTRLC = 1 << 6, /* Return ERROR on signal (EINTR) rather than retry */ TERMKEY_FLAG_EINTR = 1 << 7 }; enum { TERMKEY_CANON_SPACESYMBOL = 1 << 0, /* Space is symbolic rather than Unicode */ TERMKEY_CANON_DELBS = 1 << 1 /* Del is converted to Backspace */ }; void termkey_check_version (int major, int minor); termkey_t *termkey_new (int fd, const char *encoding, int flags); termkey_t *termkey_new_abstract (const char *term, const char *encoding, int flags); void termkey_free (termkey_t *tk); void termkey_destroy (termkey_t *tk); int termkey_start (termkey_t *tk); int termkey_stop (termkey_t *tk); int termkey_is_started (termkey_t *tk); int termkey_get_fd (termkey_t *tk); int termkey_get_flags (termkey_t *tk); void termkey_set_flags (termkey_t *tk, int newflags); int termkey_get_waittime (termkey_t *tk); void termkey_set_waittime (termkey_t *tk, int msec); int termkey_get_canonflags (termkey_t *tk); void termkey_set_canonflags (termkey_t *tk, int flags); size_t termkey_get_buffer_size (termkey_t *tk); int termkey_set_buffer_size (termkey_t *tk, size_t size); size_t termkey_get_buffer_remaining (termkey_t *tk); void termkey_canonicalise (termkey_t *tk, termkey_key_t *key); termkey_result_t termkey_getkey (termkey_t *tk, termkey_key_t *key); termkey_result_t termkey_getkey_force (termkey_t *tk, termkey_key_t *key); termkey_result_t termkey_waitkey (termkey_t *tk, termkey_key_t *key); termkey_result_t termkey_advisereadable (termkey_t *tk); size_t termkey_push_bytes (termkey_t *tk, const char *bytes, size_t len); termkey_sym_t termkey_register_keyname (termkey_t *tk, termkey_sym_t sym, const char *name); const char *termkey_get_keyname (termkey_t *tk, termkey_sym_t sym); const char *termkey_lookup_keyname (termkey_t *tk, const char *str, termkey_sym_t *sym); termkey_sym_t termkey_keyname2sym (termkey_t *tk, const char *keyname); termkey_result_t termkey_interpret_mouse (termkey_t *tk, const termkey_key_t *key, termkey_mouse_event_t *event, int *button, int *line, int *col); termkey_result_t termkey_interpret_position (termkey_t *tk, const termkey_key_t *key, int *line, int *col); termkey_result_t termkey_interpret_modereport (termkey_t *tk, const termkey_key_t *key, int *initial, int *mode, int *value); termkey_result_t termkey_interpret_csi (termkey_t *tk, const termkey_key_t *key, long args[], size_t *nargs, unsigned long *cmd); typedef enum termkey_format termkey_format_t; enum termkey_format { /* Shift-... instead of S-... */ TERMKEY_FORMAT_LONGMOD = 1 << 0, /* ^X instead of C-X */ TERMKEY_FORMAT_CARETCTRL = 1 << 1, /* Meta- or M- instead of Alt- or A- */ TERMKEY_FORMAT_ALTISMETA = 1 << 2, /* Wrap special keys in brackets like */ TERMKEY_FORMAT_WRAPBRACKET = 1 << 3, /* M Foo instead of M-Foo */ TERMKEY_FORMAT_SPACEMOD = 1 << 4, /* meta or m instead of Meta or M */ TERMKEY_FORMAT_LOWERMOD = 1 << 5, /* page down instead of PageDown */ TERMKEY_FORMAT_LOWERSPACE = 1 << 6, /* Include mouse position if relevant; @ col,line */ TERMKEY_FORMAT_MOUSE_POS = 1 << 8 }; /* Some useful combinations */ #define TERMKEY_FORMAT_VIM (termkey_format_t) \ (TERMKEY_FORMAT_ALTISMETA | TERMKEY_FORMAT_WRAPBRACKET) #define TERMKEY_FORMAT_URWID (termkey_format_t) \ (TERMKEY_FORMAT_LONGMOD | TERMKEY_FORMAT_ALTISMETA | \ TERMKEY_FORMAT_LOWERMOD | TERMKEY_FORMAT_SPACEMOD | \ TERMKEY_FORMAT_LOWERSPACE) size_t termkey_strfkey (termkey_t *tk, char *buffer, size_t len, termkey_key_t *key, termkey_format_t format); const char *termkey_strpkey (termkey_t *tk, const char *str, termkey_key_t *key, termkey_format_t format); int termkey_keycmp (termkey_t *tk, const termkey_key_t *key1, const termkey_key_t *key2); #endif // ! TERMKEY2_H