vterm_internal.h revision 5b78a3aa7741c3f44b676ccffa765cecee1cbd4c
1#ifndef __VTERM_INTERNAL_H__ 2#define __VTERM_INTERNAL_H__ 3 4#include "vterm.h" 5 6#include <stdarg.h> 7 8typedef struct VTermEncoding VTermEncoding; 9 10typedef struct { 11 VTermEncoding *enc; 12 13 // This size should be increased if required by other stateful encodings 14 char data[4*sizeof(uint32_t)]; 15} VTermEncodingInstance; 16 17struct VTermPen 18{ 19 VTermColor fg; 20 VTermColor bg; 21 unsigned int bold:1; 22 unsigned int underline:2; 23 unsigned int italic:1; 24 unsigned int blink:1; 25 unsigned int reverse:1; 26 unsigned int strike:1; 27 unsigned int font:4; /* To store 0-9 */ 28}; 29 30struct VTermState 31{ 32 VTerm *vt; 33 34 const VTermStateCallbacks *callbacks; 35 void *cbdata; 36 37 int rows; 38 int cols; 39 40 /* Current cursor position */ 41 VTermPos pos; 42 43 int at_phantom; /* True if we're on the "81st" phantom column to defer a wraparound */ 44 45 int scrollregion_top; 46 int scrollregion_bottom; /* -1 means unbounded */ 47#define SCROLLREGION_BOTTOM(state) ((state)->scrollregion_bottom > -1 ? (state)->scrollregion_bottom : (state)->rows) 48 int scrollregion_left; 49#define SCROLLREGION_LEFT(state) ((state)->mode.leftrightmargin ? (state)->scrollregion_left : 0) 50 int scrollregion_right; /* -1 means unbounded */ 51#define SCROLLREGION_RIGHT(state) ((state)->mode.leftrightmargin && (state)->scrollregion_right > -1 ? (state)->scrollregion_right : (state)->cols) 52 53 /* Bitvector of tab stops */ 54 unsigned char *tabstops; 55 56 /* Mouse state */ 57 int mouse_col, mouse_row; 58 int mouse_buttons; 59 int mouse_flags; 60 enum { MOUSE_X10, MOUSE_UTF8, MOUSE_SGR, MOUSE_RXVT } mouse_protocol; 61 62 /* Last glyph output, for Unicode recombining purposes */ 63 uint32_t *combine_chars; 64 size_t combine_chars_size; // Number of ELEMENTS in the above 65 int combine_width; // The width of the glyph above 66 VTermPos combine_pos; // Position before movement 67 68 struct { 69 int keypad:1; 70 int cursor:1; 71 int autowrap:1; 72 int insert:1; 73 int newline:1; 74 int cursor_visible:1; 75 int cursor_blink:1; 76 unsigned int cursor_shape:2; 77 int alt_screen:1; 78 int origin:1; 79 int screen:1; 80 int leftrightmargin:1; 81 } mode; 82 83 VTermEncodingInstance encoding[4], encoding_utf8; 84 int gl_set, gr_set, gsingle_set; 85 86 struct VTermPen pen; 87 88 VTermColor default_fg; 89 VTermColor default_bg; 90 int fg_ansi; 91 int bold_is_highbright; 92 93 int protected_cell; 94 95 /* Saved state under DEC mode 1048/1049 */ 96 struct { 97 VTermPos pos; 98 struct VTermPen pen; 99 100 struct { 101 int cursor_visible:1; 102 int cursor_blink:1; 103 unsigned int cursor_shape:2; 104 } mode; 105 } saved; 106}; 107 108struct VTerm 109{ 110 VTermAllocatorFunctions *allocator; 111 void *allocdata; 112 113 int rows; 114 int cols; 115 116 struct { 117 int utf8:1; 118 int ctrl8bit:1; 119 } mode; 120 121 enum VTermParserState { 122 NORMAL, 123 CSI, 124 OSC, 125 DCS, 126 ESC, 127 ESC_IN_OSC, 128 ESC_IN_DCS, 129 } parser_state; 130 const VTermParserCallbacks *parser_callbacks; 131 void *cbdata; 132 133 /* len == malloc()ed size; cur == number of valid bytes */ 134 char *strbuffer; 135 size_t strbuffer_len; 136 size_t strbuffer_cur; 137 138 char *outbuffer; 139 size_t outbuffer_len; 140 size_t outbuffer_cur; 141 142 VTermState *state; 143 VTermScreen *screen; 144}; 145 146struct VTermEncoding { 147 void (*init) (VTermEncoding *enc, void *data); 148 void (*decode)(VTermEncoding *enc, void *data, 149 uint32_t cp[], int *cpi, int cplen, 150 const char bytes[], size_t *pos, size_t len); 151}; 152 153typedef enum { 154 ENC_UTF8, 155 ENC_SINGLE_94 156} VTermEncodingType; 157 158void *vterm_allocator_malloc(VTerm *vt, size_t size); 159void vterm_allocator_free(VTerm *vt, void *ptr); 160 161void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len); 162void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args); 163void vterm_push_output_sprintf(VTerm *vt, const char *format, ...); 164void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...); 165 166void vterm_state_free(VTermState *state); 167 168void vterm_state_resetpen(VTermState *state); 169void vterm_state_setpen(VTermState *state, const long args[], int argcount); 170void vterm_state_savepen(VTermState *state, int save); 171 172enum { 173 C1_SS3 = 0x8f, 174 C1_DCS = 0x90, 175 C1_CSI = 0x9b, 176 C1_ST = 0x9c, 177}; 178 179void vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format, ...); 180 181void vterm_screen_free(VTermScreen *screen); 182 183VTermEncoding *vterm_lookup_encoding(VTermEncodingType type, char designation); 184 185int vterm_unicode_width(int codepoint); 186int vterm_unicode_is_combining(int codepoint); 187 188#endif 189