diff options
Diffstat (limited to 'termkey2.h')
-rw-r--r-- | termkey2.h | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/termkey2.h b/termkey2.h new file mode 100644 index 0000000..9362215 --- /dev/null +++ b/termkey2.h @@ -0,0 +1,271 @@ +#ifndef TERMKEY2_H +#define TERMKEY2_H + +#include <stdint.h> +#include <stdlib.h> +#include <limits.h> + +#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 <Escape> */ + 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 + |