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