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