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