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 3073fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkeystatic inline int vterm_color_equal(VTermColor a, VTermColor b) 3173fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey{ 3273fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey return a.red == b.red && a.green == b.green && a.blue == b.blue; 3373fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey} 3473fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey 355b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTermState 365b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{ 375b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTerm *vt; 385b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 395b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const VTermStateCallbacks *callbacks; 405b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey void *cbdata; 415b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 425b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int rows; 435b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cols; 445b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 455b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* Current cursor position */ 465b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermPos pos; 475b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 485b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int at_phantom; /* True if we're on the "81st" phantom column to defer a wraparound */ 495b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 505b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int scrollregion_top; 515b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int scrollregion_bottom; /* -1 means unbounded */ 525b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_BOTTOM(state) ((state)->scrollregion_bottom > -1 ? (state)->scrollregion_bottom : (state)->rows) 535b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int scrollregion_left; 545b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_LEFT(state) ((state)->mode.leftrightmargin ? (state)->scrollregion_left : 0) 555b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int scrollregion_right; /* -1 means unbounded */ 565b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define SCROLLREGION_RIGHT(state) ((state)->mode.leftrightmargin && (state)->scrollregion_right > -1 ? (state)->scrollregion_right : (state)->cols) 575b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 585b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* Bitvector of tab stops */ 595b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned char *tabstops; 605b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 615b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* Mouse state */ 625b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int mouse_col, mouse_row; 635b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int mouse_buttons; 645b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int mouse_flags; 655b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey enum { MOUSE_X10, MOUSE_UTF8, MOUSE_SGR, MOUSE_RXVT } mouse_protocol; 665b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 675b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* Last glyph output, for Unicode recombining purposes */ 685b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey uint32_t *combine_chars; 695b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey size_t combine_chars_size; // Number of ELEMENTS in the above 705b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int combine_width; // The width of the glyph above 715b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermPos combine_pos; // Position before movement 725b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 735b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct { 745b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int keypad:1; 755b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cursor:1; 765b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int autowrap:1; 775b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int insert:1; 785b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int newline:1; 795b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cursor_visible:1; 805b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cursor_blink:1; 815b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int cursor_shape:2; 825b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int alt_screen:1; 835b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int origin:1; 845b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int screen:1; 855b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int leftrightmargin:1; 865b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } mode; 875b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 885b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermEncodingInstance encoding[4], encoding_utf8; 895b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int gl_set, gr_set, gsingle_set; 905b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 915b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct VTermPen pen; 925b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 935b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermColor default_fg; 945b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermColor default_bg; 9573fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey int fg_index; 9673fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey int bg_index; 975b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int bold_is_highbright; 985b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 9973fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey unsigned int protected_cell : 1; 1005b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1015b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* Saved state under DEC mode 1048/1049 */ 1025b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct { 1035b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermPos pos; 1045b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct VTermPen pen; 1055b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1065b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct { 1075b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cursor_visible:1; 1085b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cursor_blink:1; 1095b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned int cursor_shape:2; 1105b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } mode; 1115b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } saved; 1125b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1135b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1145b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTerm 1155b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{ 1165b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermAllocatorFunctions *allocator; 1175b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey void *allocdata; 1185b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1195b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int rows; 1205b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int cols; 1215b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1225b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct { 1235b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int utf8:1; 1245b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int ctrl8bit:1; 1255b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } mode; 1265b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1275b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey enum VTermParserState { 1285b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey NORMAL, 1295b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey CSI, 1305b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey OSC, 1315b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey DCS, 1325b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey ESC, 1335b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey ESC_IN_OSC, 1345b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey ESC_IN_DCS, 1355b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } parser_state; 1365b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const VTermParserCallbacks *parser_callbacks; 1375b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey void *cbdata; 1385b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1395b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey /* len == malloc()ed size; cur == number of valid bytes */ 1405b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey char *strbuffer; 1415b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey size_t strbuffer_len; 1425b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey size_t strbuffer_cur; 1435b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1445b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey char *outbuffer; 1455b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey size_t outbuffer_len; 1465b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey size_t outbuffer_cur; 1475b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1485b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermState *state; 1495b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermScreen *screen; 1505b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1515b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1525b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct VTermEncoding { 1535b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey void (*init) (VTermEncoding *enc, void *data); 1545b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey void (*decode)(VTermEncoding *enc, void *data, 1555b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey uint32_t cp[], int *cpi, int cplen, 1565b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const char bytes[], size_t *pos, size_t len); 1575b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1585b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1595b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeytypedef enum { 1605b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey ENC_UTF8, 1615b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey ENC_SINGLE_94 1625b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} VTermEncodingType; 1635b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1645b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid *vterm_allocator_malloc(VTerm *vt, size_t size); 1655b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_allocator_free(VTerm *vt, void *ptr); 1665b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1675b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len); 1685b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args); 1695b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_sprintf(VTerm *vt, const char *format, ...); 1705b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...); 17173fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkeyvoid vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...); 1725b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1735b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_free(VTermState *state); 1745b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1755b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_resetpen(VTermState *state); 1765b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_setpen(VTermState *state, const long args[], int argcount); 17773fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkeyint vterm_state_getpen(VTermState *state, long args[], int argcount); 1785b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_savepen(VTermState *state, int save); 1795b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1805b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyenum { 1815b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey C1_SS3 = 0x8f, 1825b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey C1_DCS = 0x90, 1835b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey C1_CSI = 0x9b, 1845b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey C1_ST = 0x9c, 1855b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1865b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1875b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format, ...); 1885b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1895b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyvoid vterm_screen_free(VTermScreen *screen); 1905b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1915b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff SharkeyVTermEncoding *vterm_lookup_encoding(VTermEncodingType type, char designation); 1925b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1935b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyint vterm_unicode_width(int codepoint); 1945b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyint vterm_unicode_is_combining(int codepoint); 1955b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1965b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#endif 197