• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
vterm_color_equal(VTermColor a,VTermColor b)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