vterm_internal.h revision 5b78a3aa7741c3f44b676ccffa765cecee1cbd4c
15b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#ifndef __VTERM_INTERNAL_H__ 25b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define __VTERM_INTERNAL_H__ 35b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 45b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#include "vterm.h" 55b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 65b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#include <stdarg.h> 75b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 85b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeytypedef struct VTermEncoding VTermEncoding; 95b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 105b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeytypedef struct { 115b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermEncoding *enc; 125b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 135b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey // This size should be increased if required by other stateful encodings 145b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey char data[4*sizeof(uint32_t)]; 155b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} VTermEncodingInstance; 165b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 175b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTermPen 185b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{ 195b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermColor fg; 205b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermColor bg; 215b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int bold:1; 225b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int underline:2; 235b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int italic:1; 245b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int blink:1; 255b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int reverse:1; 265b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int strike:1; 275b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int font:4; /* To store 0-9 */ 285b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 295b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 305b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTermState 315b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{ 325b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTerm *vt; 335b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 345b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const VTermStateCallbacks *callbacks; 355b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey void *cbdata; 365b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 375b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int rows; 385b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cols; 395b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 405b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* Current cursor position */ 415b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermPos pos; 425b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 435b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int at_phantom; /* True if we're on the "81st" phantom column to defer a wraparound */ 445b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 455b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int scrollregion_top; 465b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int scrollregion_bottom; /* -1 means unbounded */ 475b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_BOTTOM(state) ((state)->scrollregion_bottom > -1 ? (state)->scrollregion_bottom : (state)->rows) 485b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int scrollregion_left; 495b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_LEFT(state) ((state)->mode.leftrightmargin ? (state)->scrollregion_left : 0) 505b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int scrollregion_right; /* -1 means unbounded */ 515b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_RIGHT(state) ((state)->mode.leftrightmargin && (state)->scrollregion_right > -1 ? (state)->scrollregion_right : (state)->cols) 525b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 535b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* Bitvector of tab stops */ 545b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned char *tabstops; 555b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 565b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* Mouse state */ 575b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int mouse_col, mouse_row; 585b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int mouse_buttons; 595b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int mouse_flags; 605b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey enum { MOUSE_X10, MOUSE_UTF8, MOUSE_SGR, MOUSE_RXVT } mouse_protocol; 615b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 625b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* Last glyph output, for Unicode recombining purposes */ 635b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey uint32_t *combine_chars; 645b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey size_t combine_chars_size; // Number of ELEMENTS in the above 655b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int combine_width; // The width of the glyph above 665b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermPos combine_pos; // Position before movement 675b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 685b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct { 695b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int keypad:1; 705b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cursor:1; 715b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int autowrap:1; 725b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int insert:1; 735b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int newline:1; 745b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cursor_visible:1; 755b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cursor_blink:1; 765b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int cursor_shape:2; 775b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int alt_screen:1; 785b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int origin:1; 795b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int screen:1; 805b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int leftrightmargin:1; 815b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } mode; 825b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 835b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermEncodingInstance encoding[4], encoding_utf8; 845b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int gl_set, gr_set, gsingle_set; 855b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 865b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct VTermPen pen; 875b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 885b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermColor default_fg; 895b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermColor default_bg; 905b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int fg_ansi; 915b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int bold_is_highbright; 925b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 935b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int protected_cell; 945b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 955b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* Saved state under DEC mode 1048/1049 */ 965b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct { 975b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermPos pos; 985b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct VTermPen pen; 995b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1005b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct { 1015b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cursor_visible:1; 1025b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cursor_blink:1; 1035b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int cursor_shape:2; 1045b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } mode; 1055b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } saved; 1065b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1075b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1085b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTerm 1095b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{ 1105b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermAllocatorFunctions *allocator; 1115b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey void *allocdata; 1125b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1135b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int rows; 1145b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cols; 1155b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1165b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct { 1175b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int utf8:1; 1185b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int ctrl8bit:1; 1195b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } mode; 1205b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1215b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey enum VTermParserState { 1225b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey NORMAL, 1235b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey CSI, 1245b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey OSC, 1255b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey DCS, 1265b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey ESC, 1275b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey ESC_IN_OSC, 1285b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey ESC_IN_DCS, 1295b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } parser_state; 1305b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const VTermParserCallbacks *parser_callbacks; 1315b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey void *cbdata; 1325b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1335b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* len == malloc()ed size; cur == number of valid bytes */ 1345b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey char *strbuffer; 1355b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey size_t strbuffer_len; 1365b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey size_t strbuffer_cur; 1375b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1385b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey char *outbuffer; 1395b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey size_t outbuffer_len; 1405b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey size_t outbuffer_cur; 1415b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1425b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermState *state; 1435b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermScreen *screen; 1445b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1455b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1465b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTermEncoding { 1475b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey void (*init) (VTermEncoding *enc, void *data); 1485b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey void (*decode)(VTermEncoding *enc, void *data, 1495b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey uint32_t cp[], int *cpi, int cplen, 1505b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const char bytes[], size_t *pos, size_t len); 1515b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1525b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1535b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeytypedef enum { 1545b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey ENC_UTF8, 1555b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey ENC_SINGLE_94 1565b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} VTermEncodingType; 1575b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1585b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid *vterm_allocator_malloc(VTerm *vt, size_t size); 1595b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_allocator_free(VTerm *vt, void *ptr); 1605b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1615b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len); 1625b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args); 1635b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_sprintf(VTerm *vt, const char *format, ...); 1645b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...); 1655b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1665b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_free(VTermState *state); 1675b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1685b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_resetpen(VTermState *state); 1695b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_setpen(VTermState *state, const long args[], int argcount); 1705b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_savepen(VTermState *state, int save); 1715b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1725b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyenum { 1735b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey C1_SS3 = 0x8f, 1745b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey C1_DCS = 0x90, 1755b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey C1_CSI = 0x9b, 1765b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey C1_ST = 0x9c, 1775b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1785b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1795b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format, ...); 1805b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1815b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_screen_free(VTermScreen *screen); 1825b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1835b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff SharkeyVTermEncoding *vterm_lookup_encoding(VTermEncodingType type, char designation); 1845b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1855b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyint vterm_unicode_width(int codepoint); 1865b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyint vterm_unicode_is_combining(int codepoint); 1875b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1885b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#endif 189