1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */
2 
3 #ifndef __VT_VT100_PARSER_H__
4 #define __VT_VT100_PARSER_H__
5 
6 #include <pobl/bl_types.h> /* u_xxx */
7 #include <mef/ef_parser.h>
8 #include <mef/ef_conv.h>
9 
10 #include "vt_pty.h"
11 #include "vt_screen.h"
12 #include "vt_char_encoding.h"
13 #include "vt_drcs.h"
14 #include "vt_termcap.h"
15 #include "vt_config_proto.h"
16 
17 #define PTY_WR_BUFFER_SIZE 100
18 
19 #if 0
20 #define ENABLE_OSC5379PICTURE
21 #endif
22 
23 /*
24  * Possible patterns are:
25  *  NOT_USE_UNICODE_FONT(0x1)
26  *  USE_UNICODE_PROPERTY(0x2)
27  *  NOT_USE_UNICODE_FONT|USE_UNICODE_PROPERTY(0x3)
28  *  ONLY_USE_UNICODE_FONT(0x4)
29  */
30 typedef enum vt_unicode_policy {
31   NO_UNICODE_POLICY = 0x0,
32   NOT_USE_UNICODE_FONT = 0x1,
33   ONLY_USE_UNICODE_FONT = 0x2,
34   NOT_USE_UNICODE_BOXDRAW_FONT = 0x4,
35   ONLY_USE_UNICODE_BOXDRAW_FONT = 0x8,
36   USE_UNICODE_DRCS = 0x10,
37   CONVERT_UNICODE_TO_ISCII = 0x20,
38 
39   UNICODE_POLICY_MAX
40 
41 } vt_unicode_policy_t;
42 
43 typedef enum vt_mouse_report_mode {
44   NO_MOUSE_REPORT = 0,
45 
46   MOUSE_REPORT = 0x1,
47   BUTTON_EVENT_MOUSE_REPORT = 0x2,
48   ANY_EVENT_MOUSE_REPORT = 0x3,
49   LOCATOR_CHARCELL_REPORT = 0x4,
50   LOCATOR_PIXEL_REPORT = 0x5,
51 
52 } vt_mouse_report_mode_t;
53 
54 typedef enum vt_extended_mouse_report_mode {
55   NO_EXTENDED_MOUSE_REPORT = 0,
56 
57   EXTENDED_MOUSE_REPORT_UTF8 = 0x1,
58   EXTENDED_MOUSE_REPORT_SGR = 0x2,
59   EXTENDED_MOUSE_REPORT_URXVT = 0x3,
60 
61 } vt_extended_mouse_report_mode_t;
62 
63 typedef enum vt_locator_report_mode {
64   LOCATOR_BUTTON_DOWN = 0x1,
65   LOCATOR_BUTTON_UP = 0x2,
66   LOCATOR_ONESHOT = 0x4,
67   LOCATOR_REQUEST = 0x8,
68   LOCATOR_FILTER_RECT = 0x10,
69 
70 } vt_locator_report_mode_t;
71 
72 typedef enum vt_alt_color_mode {
73   ALT_COLOR_BOLD = 0x1,
74   ALT_COLOR_UNDERLINE = 0x2,
75   ALT_COLOR_BLINKING = 0x4,
76   ALT_COLOR_REVERSE = 0x8,
77   ALT_COLOR_ITALIC = 0x10,
78   ALT_COLOR_CROSSED_OUT = 0x20,
79 
80 } vt_alt_color_mode_t;
81 
82 typedef enum vt_cursor_style {
83   CS_BLOCK = 0x0,
84   CS_UNDERLINE = 0x1,
85   CS_BAR = 0x2,
86   CS_BLINK = 0x4,
87   CS_BOX = 0x8,
88 } vt_cursor_style_t;
89 
90 typedef struct vt_write_buffer {
91   vt_char_t chars[PTY_WR_BUFFER_SIZE];
92   u_int filled_len;
93 
94   /* for "CSI b"(REP) sequence */
95   vt_char_t *last_ch;
96 
97   int (*output_func)(vt_screen_t *, vt_char_t *chars, u_int);
98 
99 } vt_write_buffer_t;
100 
101 typedef struct vt_read_buffer {
102   u_char *chars;
103   size_t len;
104   size_t filled_len;
105   size_t left; /* not parsed bytes */
106   size_t new_len;
107 
108 } vt_read_buffer_t;
109 
110 typedef struct vt_xterm_event_listener {
111   void *self;
112 
113   void (*start)(void *);             /* called in *visual* context. (Note that not logical) */
114   void (*stop)(void *);                                        /* called in visual context. */
115   void (*interrupt)(void *);                                   /* called in visual context. */
116 
117   void (*resize)(void *, u_int, u_int, int, int);              /* called in visual context. */
118   void (*reverse_video)(void *, int);                          /* called in visual context. */
119   void (*set_mouse_report)(void *);                            /* called in visual context. */
120   void (*request_locator)(void *);                             /* called in visual context. */
121   void (*set_window_name)(void *, u_char *);                   /* called in logical context. */
122   void (*set_icon_name)(void *, u_char *);                     /* called in logical context. */
123   void (*bel)(void *);                                         /* called in visual context. */
124   int (*im_is_active)(void *);                                 /* called in logical context. */
125   void (*switch_im_mode)(void *);                              /* called in logical context. */
126   void (*set_selection)(void *, vt_char_t *, u_int, u_char *); /* called in logical context. */
127   void (*get_display_size)(void *, u_int *, u_int *);          /* called in logical context. */
128   void (*get_window_size)(void *, u_int *, u_int *);           /* called in logical context. */
129   int (*get_rgb)(void *, u_int8_t *, u_int8_t *, u_int8_t *,
130                  vt_color_t);                                  /* called in logical context. */
131   vt_char_t *(*get_picture_data)(void *, char *, int *, int *, int *, int *,
132                                  u_int32_t **, int, int);      /* called in logical context. */
133   int (*get_emoji_data)(void *, vt_char_t *, vt_char_t *);     /* called in logical context. */
134   void (*show_tmp_picture)(void *, char *);                    /* called in logical context. */
135 #ifdef ENABLE_OSC5379PICTURE
136   void (*add_frame_to_animation)(void *, char *, int *, int *);/* called in logical context. */
137 #endif
138   int (*check_iscii_font)(void *, ef_charset_t);               /* called in logical context. */
139   void (*lock_keyboard)(void *, int);                          /* called in logical context. */
140 
141 } vt_xterm_event_listener_t;
142 
143 /*
144  * !! Notice !!
145  * Validation of Keys and vals is not checked before these event called by
146  * vt_parser.
147  */
148 typedef struct vt_config_event_listener {
149   void *self;
150 
151   /* Assume that exec, set and get affect each window. */
152   int (*exec)(void *, char *);
153   int (*set)(void *, char *, char *, char *);
154   void (*get)(void *, char *, char *, int);
155 
156   /* Assume that saved, set_font and set_color affect all window. */
157   void (*saved)(void); /* Event that mlterm/main file was changed. */
158 
159   void (*set_font)(void *, char *, char *, char *, int);
160   void (*get_font)(void *, char *, char *, int);
161   void (*set_color)(void *, char *, char *, char *, int);
162   void (*get_color)(void *, char *, int);
163 
164 } vt_config_event_listener_t;
165 
166 typedef struct vt_parser *vt_parser_ptr_t;
167 
168 typedef struct vt_storable_states {
169   int is_saved : 1;
170 
171   int is_bold : 1;
172   int is_italic : 1;
173   int is_reversed : 1;
174   int is_blinking : 1;
175   int is_invisible : 1;
176   int is_protected : 1;
177   int is_relative_origin : 1;
178   int last_column_flag : 1;
179 
180   /* vt_line_style_t */ int line_style : 7;
181   /* vt_color_t */ u_int16_t fg_color;
182   /* vt_color_t */ u_int16_t bg_color;
183   ef_charset_t cs;
184 
185 } vt_storable_states_t;
186 
187 typedef struct vt_saved_names {
188   char **names;
189   u_int num;
190 
191 } vt_saved_names_t;
192 
193 typedef struct vt_macro {
194   u_char *str;
195   int8_t is_sixel;
196   u_int8_t sixel_num;
197 
198 } vt_macro_t;
199 
200 typedef struct vt_parser {
201   vt_read_buffer_t r_buf;
202   vt_write_buffer_t w_buf;
203 
204   vt_pty_t *pty;
205 
206   vt_screen_t *screen;
207   vt_termcap_ptr_t termcap;
208 
209   ef_parser_t *cc_parser; /* char code parser */
210   ef_conv_t *cc_conv;     /* char code converter */
211   /* vt_char_encoding_t */ u_int16_t encoding;
212   /* ef_charset_t */ u_int16_t cs;
213 
214   /* vt_color_t */ u_int16_t fg_color;
215   /* vt_color_t */ u_int16_t bg_color;
216 
217   vt_xterm_event_listener_t *xterm_listener;
218   vt_config_event_listener_t *config_listener;
219 
220   int log_file;
221 
222   char *win_name;
223   char *icon_name;
224 
225   struct {
226     u_int16_t top;
227     u_int16_t left;
228     u_int16_t bottom;
229     u_int16_t right;
230 
231   } loc_filter;
232 
233   struct {
234     u_int16_t flags;
235     u_int8_t fg[16];
236     u_int8_t bg[16];
237   } alt_colors;
238 
239   /* for save/restore cursor */
240   vt_storable_states_t saved_normal;
241   vt_storable_states_t saved_alternate;
242 
243   vt_saved_names_t saved_win_names;
244   vt_saved_names_t saved_icon_names;
245 
246   vt_drcs_t *drcs;
247 
248   vt_macro_t *macros;
249   u_int num_macros;
250 
251   u_int32_t *sixel_palette;
252   u_int32_t vtmode_flags[2];
253   u_int32_t saved_vtmode_flags[2];
254 
255   /* vt_unicode_policy_t */ int8_t unicode_policy;
256 
257   /* vt_mouse_report_mode_t */ int8_t mouse_mode;
258   /* vt_extended_mouse_report_mode_t */ int8_t ext_mouse_mode;
259   /* vt_locator_report_mode_t */ int8_t locator_mode;
260 
261   /* vt_alt_color_mode_t */ int8_t alt_color_mode;
262   u_int8_t col_size_of_width_a; /* 1 or 2 */
263   /* vt_cursor_style_t */ int8_t cursor_style;
264   /* vt_line_style_t */ int8_t line_style;
265   int8_t modify_cursor_keys;
266   int8_t modify_function_keys;
267   int8_t modify_other_keys;
268   u_char prev_local_echo_char;
269 
270   u_int8_t hide_pointer_mode;
271 
272   /* Used for non iso2022 encoding */
273   /* ef_charset_t */ u_int16_t gl;
274   /* ef_charset_t */ u_int16_t g0;
275   /* ef_charset_t */ u_int16_t g1;
276 
277   /* XXX Use (vt_parser->xxxxx ? 1 : 0) in copying these flags to int, otherwise int is -1. */
278   int is_so : 1;
279 
280   int is_bold : 1;
281   int is_italic : 1;
282   int is_reversed : 1;
283   int is_blinking : 1;
284   int is_invisible : 1;
285 
286   int use_char_combining : 1;
287   int use_multi_col_char : 1;
288   int logging_vt_seq : 1;
289   int is_app_keypad : 1;
290   int is_bracketed_paste_mode : 1;
291   int want_focus_event : 1;
292   int im_is_active : 1;
293   int sixel_scrolling : 1;
294   int yield : 1;
295   int is_auto_encoding : 1;
296   int use_auto_detect : 1;
297   int is_visible_cursor : 1;
298   int is_protected : 1;
299   int ignore_broadcasted_chars : 1;
300   int set_title_using_hex : 1;
301   int get_title_using_hex : 1;
302   int set_title_using_utf8 : 1;
303   int get_title_using_utf8 : 1;
304   int use_ansi_colors : 1;
305   int is_transferring_data : 2; /* 0x1=send 0x2=recv */
306   int is_zmodem_ready : 1;
307   int use_local_echo : 1;
308 
309 #ifdef USE_VT52
310   int is_vt52_mode : 1;
311 #endif
312 
313 } vt_parser_t;
314 
315 void vt_set_use_alt_buffer(int use);
316 
317 void vt_set_unicode_noconv_areas(char *areas);
318 
319 void vt_set_full_width_areas(char *areas);
320 
321 void vt_set_half_width_areas(char *areas);
322 
323 void vt_set_use_ttyrec_format(int use);
324 
325 #ifdef USE_LIBSSH2
326 void vt_set_use_scp_full(int use);
327 #else
328 #define vt_set_use_scp_full(use) (0)
329 #endif
330 
331 void vt_set_recv_dir(const char *dir);
332 
333 void vt_set_timeout_read_pty(u_long timeout);
334 
335 void vt_set_primary_da(char *da);
336 
337 void vt_set_secondary_da(char *da);
338 
339 void vt_set_local_echo_wait(u_int msec);
340 
341 #define vt_parser_init vt_config_proto_init
342 
343 void vt_parser_final(void);
344 
345 vt_parser_t *vt_parser_new(vt_screen_t *screen, vt_termcap_ptr_t termcap, vt_char_encoding_t encoding,
346                            int is_auto_encoding, int use_auto_detect, int logging_vt_seq,
347                            vt_unicode_policy_t policy, u_int col_size_a, int use_char_combining,
348                            int use_multi_col_char, const char *win_name, const char *icon_name,
349                            int use_ansi_colors, vt_alt_color_mode_t alt_color_mode,
350                            vt_cursor_style_t cursor_style, int ignore_broadcasted_chars, int use_local_echo);
351 
352 int vt_parser_destroy(vt_parser_t *vt_parser);
353 
354 void vt_parser_set_pty(vt_parser_t *vt_parser, vt_pty_t *pty);
355 
356 void vt_parser_set_xterm_listener(vt_parser_t *vt_parser,
357                                         vt_xterm_event_listener_t *xterm_listener);
358 
359 void vt_parser_set_config_listener(vt_parser_t *vt_parser,
360                                          vt_config_event_listener_t *config_listener);
361 
362 #define vt_parser_is_sending_data(parser) ((parser)->is_transferring_data & 0x1)
363 
364 #define vt_parser_is_zmodem_ready(parser) ((parser)->is_zmodem_ready)
365 
366 int vt_parse_vt100_sequence(vt_parser_t *vt_parser);
367 
368 #define vt_parser_has_pending_sequence(vt_parser) \
369   ((vt_parser)->r_buf.left > 0 || (vt_parser)->is_transferring_data)
370 
371 size_t vt_parser_write(vt_parser_t *vt_parser, u_char *buf, size_t len);
372 
373 int vt_parser_write_modified_key(vt_parser_t *vt_parser, int key, int modcode);
374 
375 int vt_parser_write_special_key(vt_parser_t *vt_parser, vt_special_key_t key,
376                                 int modcode, int is_numlock);
377 
378 /* Must be called in visual context. */
379 int vt_parser_write_loopback(vt_parser_t *vt_parser, const u_char *buf, size_t len);
380 
381 /* Must be called in visual context. */
382 int vt_parser_show_message(vt_parser_t *vt_parser, char *msg);
383 
384 #if 1 /* defined(__ANDROID__) || defined(__APPLE__) || defined(USE_SDL2) */
385 /* Must be called in visual context. */
386 int vt_parser_preedit(vt_parser_t *vt_parser, const u_char *buf, size_t len);
387 #endif
388 
389 int vt_parser_change_encoding(vt_parser_t *vt_parser, vt_char_encoding_t encoding);
390 
391 #define vt_parser_get_encoding(vt_parser) ((vt_parser)->encoding)
392 
393 size_t vt_parser_convert_to(vt_parser_t *vt_parser, u_char *dst, size_t len,
394                             ef_parser_t *parser);
395 
396 void vt_init_encoding_conv(vt_parser_t *vt_parser);
397 
398 #define vt_get_window_name(vt_parser) ((vt_parser)->win_name)
399 
400 #define vt_get_icon_name(vt_parser) ((vt_parser)->icon_name)
401 
402 #define vt_parser_set_use_char_combining(vt_parser, use) \
403   ((vt_parser)->use_char_combining = (use))
404 
405 #define vt_parser_is_using_char_combining(vt_parser) ((vt_parser)->use_char_combining)
406 
407 #define vt_parser_is_using_multi_col_char(vt_parser) ((vt_parser)->use_multi_col_char)
408 
409 #define vt_parser_get_mouse_report_mode(vt_parser) ((vt_parser)->mouse_mode)
410 
411 #define vt_parser_is_bracketed_paste_mode(vt_parser) \
412   ((vt_parser)->is_bracketed_paste_mode)
413 
414 #define vt_parser_want_focus_event(vt_parser) ((vt_parser)->want_focus_event)
415 
416 #define vt_parser_set_unicode_policy(vt_parser, policy) \
417   ((vt_parser)->unicode_policy = (policy))
418 
419 #define vt_parser_get_unicode_policy(vt_parser) ((vt_parser)->unicode_policy)
420 
421 int vt_set_auto_detect_encodings(char *encodings);
422 
423 int vt_convert_to_internal_ch(vt_parser_t *vt_parser, ef_char_t *ch);
424 
425 #define vt_parser_select_drcs(vt_parser) vt_drcs_select((vt_parser)->drcs)
426 
427 void vt_parser_set_alt_color_mode(vt_parser_t *vt_parser, vt_alt_color_mode_t mode);
428 
429 #define vt_parser_get_alt_color_mode(vt_parser) ((vt_parser)->alt_color_mode)
430 
431 void vt_set_broadcasting(int flag);
432 
433 int vt_parser_is_broadcasting(vt_parser_t *vt_parser);
434 
435 int true_or_false(const char *str);
436 
437 int vt_parser_get_config(vt_parser_t *vt_parser, vt_pty_t *output, char *key,
438                          int to_menu, int *flag);
439 
440 int vt_parser_set_config(vt_parser_t *vt_parser, char *key, char *val);
441 
442 int vt_parser_exec_cmd(vt_parser_t *vt_parser, char *cmd);
443 
444 void vt_parser_reset(vt_parser_t *vt_parser, int level);
445 
446 void vt_parser_report_mouse_tracking(vt_parser_t *vt_parser, int col, int row,
447                                      int button, int is_released, int key_state,
448                                      int button_state);
449 
450 #define vt_parser_is_visible_cursor(vt_parser) ((vt_parser)->is_visible_cursor)
451 
452 #define vt_parser_get_cursor_style(vt_parser) ((vt_parser)->cursor_style)
453 
454 #define vt_parser_get_hide_pointer_mode(vt_parser) ((vt_parser)->hide_pointer_mode)
455 
456 #endif
457