Files
termo/termo.h
Přemysl Janouch 2d777dd67e Rewrite the mouse API
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.
2014-11-19 03:19:13 +01:00

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