I wasn't aware of the fact that 1000, 1002 and 1003 are mutually exclusive and turn each other off. Also now it's not needed to set the protocol, it gets set by default.
307 lines
7.5 KiB
C
307 lines
7.5 KiB
C
#ifndef TERMO_H
|
|
#define TERMO_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <limits.h>
|
|
|
|
#include "termo-config.h"
|
|
|
|
#define TERMO_CHECK_VERSION \
|
|
termo_check_version (TERMO_VERSION_MAJOR, TERMO_VERSION_MINOR)
|
|
|
|
typedef enum termo_sym termo_sym_t;
|
|
enum termo_sym
|
|
{
|
|
TERMO_SYM_UNKNOWN = -1,
|
|
TERMO_SYM_NONE = 0,
|
|
|
|
// Special names in C0
|
|
TERMO_SYM_BACKSPACE,
|
|
TERMO_SYM_TAB,
|
|
TERMO_SYM_ENTER,
|
|
TERMO_SYM_ESCAPE,
|
|
|
|
// Special names in G0
|
|
TERMO_SYM_SPACE,
|
|
TERMO_SYM_DEL,
|
|
|
|
// Special keys
|
|
TERMO_SYM_UP,
|
|
TERMO_SYM_DOWN,
|
|
TERMO_SYM_LEFT,
|
|
TERMO_SYM_RIGHT,
|
|
TERMO_SYM_BEGIN,
|
|
TERMO_SYM_FIND,
|
|
TERMO_SYM_INSERT,
|
|
TERMO_SYM_DELETE,
|
|
TERMO_SYM_SELECT,
|
|
TERMO_SYM_PAGEUP,
|
|
TERMO_SYM_PAGEDOWN,
|
|
TERMO_SYM_HOME,
|
|
TERMO_SYM_END,
|
|
|
|
// Special keys from terminfo
|
|
TERMO_SYM_CANCEL,
|
|
TERMO_SYM_CLEAR,
|
|
TERMO_SYM_CLOSE,
|
|
TERMO_SYM_COMMAND,
|
|
TERMO_SYM_COPY,
|
|
TERMO_SYM_EXIT,
|
|
TERMO_SYM_HELP,
|
|
TERMO_SYM_MARK,
|
|
TERMO_SYM_MESSAGE,
|
|
TERMO_SYM_MOVE,
|
|
TERMO_SYM_OPEN,
|
|
TERMO_SYM_OPTIONS,
|
|
TERMO_SYM_PRINT,
|
|
TERMO_SYM_REDO,
|
|
TERMO_SYM_REFERENCE,
|
|
TERMO_SYM_REFRESH,
|
|
TERMO_SYM_REPLACE,
|
|
TERMO_SYM_RESTART,
|
|
TERMO_SYM_RESUME,
|
|
TERMO_SYM_SAVE,
|
|
TERMO_SYM_SUSPEND,
|
|
TERMO_SYM_UNDO,
|
|
|
|
// Numeric keypad special keys
|
|
TERMO_SYM_KP0,
|
|
TERMO_SYM_KP1,
|
|
TERMO_SYM_KP2,
|
|
TERMO_SYM_KP3,
|
|
TERMO_SYM_KP4,
|
|
TERMO_SYM_KP5,
|
|
TERMO_SYM_KP6,
|
|
TERMO_SYM_KP7,
|
|
TERMO_SYM_KP8,
|
|
TERMO_SYM_KP9,
|
|
TERMO_SYM_KPENTER,
|
|
TERMO_SYM_KPPLUS,
|
|
TERMO_SYM_KPMINUS,
|
|
TERMO_SYM_KPMULT,
|
|
TERMO_SYM_KPDIV,
|
|
TERMO_SYM_KPCOMMA,
|
|
TERMO_SYM_KPPERIOD,
|
|
TERMO_SYM_KPEQUALS,
|
|
|
|
TERMO_N_SYMS
|
|
};
|
|
|
|
typedef enum termo_type termo_type_t;
|
|
enum termo_type
|
|
{
|
|
TERMO_TYPE_KEY,
|
|
TERMO_TYPE_FUNCTION,
|
|
TERMO_TYPE_KEYSYM,
|
|
TERMO_TYPE_MOUSE,
|
|
TERMO_TYPE_POSITION,
|
|
TERMO_TYPE_MODEREPORT,
|
|
// add other recognised types here
|
|
|
|
TERMO_TYPE_UNKNOWN_CSI = -1
|
|
};
|
|
|
|
typedef enum termo_result termo_result_t;
|
|
enum termo_result
|
|
{
|
|
TERMO_RES_NONE,
|
|
TERMO_RES_KEY,
|
|
TERMO_RES_EOF,
|
|
TERMO_RES_AGAIN,
|
|
TERMO_RES_ERROR
|
|
};
|
|
|
|
typedef enum termo_mouse_event termo_mouse_event_t;
|
|
enum termo_mouse_event
|
|
{
|
|
TERMO_MOUSE_UNKNOWN,
|
|
TERMO_MOUSE_PRESS,
|
|
TERMO_MOUSE_DRAG,
|
|
TERMO_MOUSE_RELEASE
|
|
};
|
|
|
|
// You will want to handle GPM (incompatible license) and FreeBSD's sysmouse
|
|
// yourself. http://www.monkey.org/openbsd/archive/tech/0009/msg00018.html
|
|
|
|
typedef enum termo_mouse_proto termo_mouse_proto_t;
|
|
enum termo_mouse_proto
|
|
{
|
|
TERMO_MOUSE_PROTO_NONE,
|
|
TERMO_MOUSE_PROTO_XTERM,
|
|
TERMO_MOUSE_PROTO_UTF8,
|
|
TERMO_MOUSE_PROTO_SGR,
|
|
TERMO_MOUSE_PROTO_RXVT
|
|
};
|
|
|
|
typedef enum termo_mouse_tracking termo_mouse_tracking_t;
|
|
enum termo_mouse_tracking
|
|
{
|
|
TERMO_MOUSE_TRACKING_OFF,
|
|
TERMO_MOUSE_TRACKING_CLICK,
|
|
TERMO_MOUSE_TRACKING_DRAG,
|
|
TERMO_MOUSE_TRACKING_MOVE
|
|
};
|
|
|
|
enum
|
|
{
|
|
TERMO_KEYMOD_SHIFT = 1 << 0,
|
|
TERMO_KEYMOD_ALT = 1 << 1,
|
|
TERMO_KEYMOD_CTRL = 1 << 2
|
|
};
|
|
|
|
typedef struct termo_key termo_key_t;
|
|
struct termo_key
|
|
{
|
|
termo_type_t type;
|
|
union
|
|
{
|
|
uint32_t codepoint; // TERMO_TYPE_KEY
|
|
int number; // TERMO_TYPE_FUNCTION
|
|
termo_sym_t sym; // TERMO_TYPE_KEYSYM
|
|
|
|
// TERMO_TYPE_MODEREPORT
|
|
// opaque, see termo_interpret_modereport()
|
|
struct { char initial; int mode, value; } mode;
|
|
|
|
// TERMO_TYPE_MOUSE
|
|
// opaque, see termo_interpret_mouse()
|
|
struct { int16_t x, y, info; } mouse;
|
|
} code;
|
|
|
|
int modifiers;
|
|
|
|
// The raw multibyte sequence for the key
|
|
char multibyte[MB_LEN_MAX + 1];
|
|
};
|
|
|
|
typedef struct termo termo_t;
|
|
|
|
enum
|
|
{
|
|
// Do not interpret C0//DEL codes if possible
|
|
TERMO_FLAG_NOINTERPRET = 1 << 0,
|
|
// Convert KP codes to regular keypresses
|
|
TERMO_FLAG_CONVERTKP = 1 << 1,
|
|
// Don't try to decode the input characters
|
|
TERMO_FLAG_RAW = 1 << 2,
|
|
// Do not make initial termios calls on construction
|
|
TERMO_FLAG_NOTERMIOS = 1 << 4,
|
|
// Sets TERMO_CANON_SPACESYMBOL
|
|
TERMO_FLAG_SPACESYMBOL = 1 << 5,
|
|
// Allow Ctrl-C to be read as normal, disabling SIGINT
|
|
TERMO_FLAG_CTRLC = 1 << 6,
|
|
// Return ERROR on signal (EINTR) rather than retry
|
|
TERMO_FLAG_EINTR = 1 << 7
|
|
};
|
|
|
|
enum
|
|
{
|
|
TERMO_CANON_SPACESYMBOL = 1 << 0, // Space is symbolic rather than Unicode
|
|
TERMO_CANON_DELBS = 1 << 1 // Del is converted to Backspace
|
|
};
|
|
|
|
void termo_check_version (int major, int minor);
|
|
|
|
termo_t *termo_new (int fd, const char *encoding, int flags);
|
|
termo_t *termo_new_abstract (const char *term,
|
|
const char *encoding, int flags);
|
|
void termo_free (termo_t *tk);
|
|
void termo_destroy (termo_t *tk);
|
|
|
|
int termo_start (termo_t *tk);
|
|
int termo_stop (termo_t *tk);
|
|
int termo_is_started (termo_t *tk);
|
|
|
|
int termo_get_fd (termo_t *tk);
|
|
|
|
int termo_get_flags (termo_t *tk);
|
|
void termo_set_flags (termo_t *tk, int newflags);
|
|
|
|
int termo_get_waittime (termo_t *tk);
|
|
void termo_set_waittime (termo_t *tk, int msec);
|
|
|
|
int termo_get_canonflags (termo_t *tk);
|
|
void termo_set_canonflags (termo_t *tk, int flags);
|
|
|
|
size_t termo_get_buffer_size (termo_t *tk);
|
|
int termo_set_buffer_size (termo_t *tk, size_t size);
|
|
|
|
size_t termo_get_buffer_remaining (termo_t *tk);
|
|
|
|
void termo_canonicalise (termo_t *tk, termo_key_t *key);
|
|
|
|
termo_mouse_proto_t termo_get_mouse_proto (termo_t *tk);
|
|
int termo_set_mouse_proto (termo_t *tk, termo_mouse_proto_t proto);
|
|
termo_mouse_proto_t termo_guess_mouse_proto (termo_t *tk);
|
|
|
|
termo_mouse_tracking_t termo_get_mouse_tracking_mode (termo_t *tk);
|
|
int termo_set_mouse_tracking_mode (termo_t *tk, termo_mouse_tracking_t mode);
|
|
|
|
termo_result_t termo_getkey (termo_t *tk, termo_key_t *key);
|
|
termo_result_t termo_getkey_force (termo_t *tk, termo_key_t *key);
|
|
termo_result_t termo_waitkey (termo_t *tk, termo_key_t *key);
|
|
|
|
termo_result_t termo_advisereadable (termo_t *tk);
|
|
|
|
size_t termo_push_bytes (termo_t *tk, const char *bytes, size_t len);
|
|
|
|
termo_sym_t termo_register_keyname (termo_t *tk,
|
|
termo_sym_t sym, const char *name);
|
|
const char *termo_get_keyname (termo_t *tk, termo_sym_t sym);
|
|
const char *termo_lookup_keyname (termo_t *tk,
|
|
const char *str, termo_sym_t *sym);
|
|
|
|
termo_sym_t termo_keyname2sym (termo_t *tk, const char *keyname);
|
|
|
|
termo_result_t termo_interpret_mouse (termo_t *tk,
|
|
const termo_key_t *key, termo_mouse_event_t *event,
|
|
int *button, int *line, int *col);
|
|
termo_result_t termo_interpret_position (termo_t *tk,
|
|
const termo_key_t *key, int *line, int *col);
|
|
termo_result_t termo_interpret_modereport (termo_t *tk,
|
|
const termo_key_t *key, int *initial, int *mode, int *value);
|
|
termo_result_t termo_interpret_csi (termo_t *tk,
|
|
const termo_key_t *key, long args[], size_t *nargs, unsigned long *cmd);
|
|
|
|
typedef enum termo_format termo_format_t;
|
|
enum termo_format
|
|
{
|
|
// Shift-... instead of S-...
|
|
TERMO_FORMAT_LONGMOD = 1 << 0,
|
|
// ^X instead of C-X
|
|
TERMO_FORMAT_CARETCTRL = 1 << 1,
|
|
// Meta- or M- instead of Alt- or A-
|
|
TERMO_FORMAT_ALTISMETA = 1 << 2,
|
|
// Wrap special keys in brackets like <Escape>
|
|
TERMO_FORMAT_WRAPBRACKET = 1 << 3,
|
|
// M Foo instead of M-Foo
|
|
TERMO_FORMAT_SPACEMOD = 1 << 4,
|
|
// meta or m instead of Meta or M
|
|
TERMO_FORMAT_LOWERMOD = 1 << 5,
|
|
// page down instead of PageDown
|
|
TERMO_FORMAT_LOWERSPACE = 1 << 6,
|
|
// Include mouse position if relevant; @ col,line
|
|
TERMO_FORMAT_MOUSE_POS = 1 << 8
|
|
};
|
|
|
|
// Some useful combinations
|
|
|
|
#define TERMO_FORMAT_VIM (termo_format_t) \
|
|
(TERMO_FORMAT_ALTISMETA | TERMO_FORMAT_WRAPBRACKET)
|
|
#define TERMO_FORMAT_URWID (termo_format_t) \
|
|
(TERMO_FORMAT_LONGMOD | TERMO_FORMAT_ALTISMETA | \
|
|
TERMO_FORMAT_LOWERMOD | TERMO_FORMAT_SPACEMOD | \
|
|
TERMO_FORMAT_LOWERSPACE)
|
|
|
|
size_t termo_strfkey (termo_t *tk, char *buffer, size_t len,
|
|
termo_key_t *key, termo_format_t format);
|
|
const char *termo_strpkey (termo_t *tk, const char *str,
|
|
termo_key_t *key, termo_format_t format);
|
|
|
|
int termo_keycmp (termo_t *tk,
|
|
const termo_key_t *key1, const termo_key_t *key2);
|
|
|
|
#endif // ! TERMO_H
|
|
|