1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */ 2 3 #ifndef __VT_SCREEN_H__ 4 #define __VT_SCREEN_H__ 5 6 #include <time.h> 7 #include <pobl/bl_types.h> /* int8_t */ 8 #include <mef/ef_conv.h> 9 10 #include "vt_edit.h" 11 #include "vt_logs.h" 12 #include "vt_logical_visual.h" 13 14 #define MAX_PAGE_ID 8 15 16 typedef struct vt_screen_event_listener { 17 void *self; 18 19 int (*screen_is_static)(void *); 20 void (*line_scrolled_out)(void *); 21 int (*window_scroll_upward_region)(void *, int, int, u_int); 22 int (*window_scroll_downward_region)(void *, int, int, u_int); 23 24 } vt_screen_event_listener_t; 25 26 typedef enum vt_bs_mode { 27 BSM_NONE = 0x0, 28 BSM_DEFAULT, 29 BSM_STATIC, 30 31 BSM_MAX 32 33 } vt_bs_mode_t; 34 35 typedef enum vt_write_content_area { 36 WCA_ALL, 37 WCA_CURSOR_LINE, 38 WCA_SCREEN, 39 } vt_write_content_area_t; 40 41 typedef struct vt_stored_edit { 42 vt_edit_t edit; 43 u_int32_t time; 44 45 } vt_stored_edit_t; 46 47 typedef struct vt_screen { 48 /* public(readonly) */ 49 vt_edit_t *edit; 50 51 /* 52 * private 53 */ 54 55 vt_edit_t normal_edit; 56 vt_edit_t alt_edit; 57 vt_edit_t *page_edits; /* stores 8 pages */ 58 vt_stored_edit_t *stored_edit; /* Store logical edits. */ 59 vt_edit_t *main_edit; 60 vt_edit_t *status_edit; 61 62 vt_edit_scroll_event_listener_t edit_scroll_listener; 63 64 vt_logs_t logs; 65 66 vt_logical_visual_t *logvis; 67 vt_logical_visual_t *container_logvis; 68 69 vt_screen_event_listener_t *screen_listener; 70 71 struct { 72 int (*match)(size_t *, size_t *, void *, u_char *, int); 73 74 /* Logical order */ 75 int char_index; 76 int row; 77 78 } * search; 79 80 u_int backscroll_rows; 81 /* vt_bs_mode_t */ int8_t backscroll_mode; 82 int8_t is_backscrolling; 83 84 int8_t has_blinking_char; 85 int8_t has_status_line; 86 int8_t need_rewrap_logs; 87 88 } vt_screen_t; 89 90 void vt_set_word_separators(const char *seps); 91 92 char *vt_get_word_separators(void); 93 94 void vt_set_regard_uri_as_word(int flag); 95 96 int vt_get_regard_uri_as_word(void); 97 98 #define vt_free_word_separators() vt_set_word_separators(NULL) 99 100 vt_screen_t *vt_screen_new(u_int cols, u_int rows, u_int tab_size, u_int num_log_lines, 101 int use_bce, vt_bs_mode_t bs_mode); 102 103 int vt_screen_destroy(vt_screen_t *screen); 104 105 void vt_screen_set_listener(vt_screen_t *screen, vt_screen_event_listener_t *screen_listener); 106 107 /* This considers status line */ 108 int vt_screen_resize(vt_screen_t *screen, u_int cols, u_int rows); 109 110 #define vt_screen_set_use_bce(screen, use) \ 111 vt_edit_set_use_bce(&(screen)->alt_edit, vt_edit_set_use_bce(&(screen)->normal_edit, use)) 112 113 #define vt_screen_is_using_bce(screen) vt_edit_is_using_bce((screen)->edit) 114 115 #define vt_screen_set_bce_fg_color(screen, fg_color) \ 116 vt_edit_set_bce_fg_color((screen)->edit, fg_color) 117 118 #define vt_screen_set_bce_bg_color(screen, bg_color) \ 119 vt_edit_set_bce_bg_color((screen)->edit, bg_color) 120 121 #define vt_screen_cursor_char_index(screen) vt_cursor_char_index((screen)->edit) 122 123 #define vt_screen_cursor_col(screen) vt_cursor_col((screen)->edit) 124 125 /* XXX Don't call this in visual context for now. */ 126 #define vt_screen_cursor_logical_col(screen) vt_edit_cursor_logical_col((screen)->edit) 127 128 /* This considers status line */ 129 int vt_screen_cursor_row(vt_screen_t *screen); 130 131 /* This considers status line */ 132 int vt_screen_cursor_row_in_screen(vt_screen_t *screen); 133 134 /* XXX Don't call this in visual context for now. */ 135 #define vt_screen_cursor_logical_row(screen) vt_edit_cursor_logical_row((screen)->edit) 136 137 #define vt_screen_get_cols(screen) vt_edit_get_cols((screen)->edit) 138 139 /* This considers status line */ 140 u_int vt_screen_get_rows(vt_screen_t *screen); 141 142 u_int vt_screen_get_logical_cols(vt_screen_t *screen); 143 144 u_int vt_screen_get_logical_rows(vt_screen_t *screen); 145 146 #define vt_screen_get_log_size(screen) vt_get_log_size(&(screen)->logs) 147 148 #define vt_screen_change_log_size(screen, log_size) vt_change_log_size(&(screen)->logs, log_size) 149 150 #define vt_screen_unlimit_log_size(screen) vt_unlimit_log_size(&(screen)->logs) 151 152 #define vt_screen_log_size_is_unlimited(screen) vt_log_size_is_unlimited(&(screen)->logs) 153 154 #define vt_screen_get_num_logged_lines(screen) vt_get_num_logged_lines(&(screen)->logs) 155 156 int vt_screen_convert_scr_row_to_abs(vt_screen_t *screen, int row); 157 158 /* This considers status line */ 159 vt_line_t *vt_screen_get_line(vt_screen_t *screen, int row); 160 161 /* This considers status line */ 162 vt_line_t *vt_screen_get_line_in_screen(vt_screen_t *screen, int row); 163 164 #define vt_screen_get_cursor_line(screen) \ 165 vt_edit_get_line((screen)->edit, vt_cursor_row((screen)->edit)) 166 167 void vt_screen_set_modified_all(vt_screen_t *screen); 168 169 int vt_screen_add_logical_visual(vt_screen_t *screen, vt_logical_visual_t *logvis); 170 171 int vt_screen_destroy_logical_visual(vt_screen_t *screen); 172 173 void vt_screen_render(vt_screen_t *screen); 174 175 int vt_screen_visual(vt_screen_t *screen); 176 177 int vt_screen_logical(vt_screen_t *screen); 178 179 #define vt_screen_has_logical_visual(screen) ((screen)->logvis) 180 181 #define vt_screen_logical_visual_is_reversible(screen) \ 182 (!(screen)->logvis || (screen)->logvis->is_reversible) 183 184 vt_bs_mode_t vt_screen_is_backscrolling(vt_screen_t *screen); 185 186 void vt_set_backscroll_mode(vt_screen_t *screen, vt_bs_mode_t mode); 187 188 #define vt_get_backscroll_mode(screen) ((screen)->backscroll_mode) 189 190 int vt_enter_backscroll_mode(vt_screen_t *screen); 191 192 void vt_exit_backscroll_mode(vt_screen_t *screen); 193 194 int vt_screen_backscroll_to(vt_screen_t *screen, int row); 195 196 int vt_screen_backscroll_upward(vt_screen_t *screen, u_int size); 197 198 int vt_screen_backscroll_downward(vt_screen_t *screen, u_int size); 199 200 u_int vt_screen_backscroll_upward_to_mark(vt_screen_t *screen, int *row); 201 202 u_int vt_screen_backscroll_downward_to_mark(vt_screen_t *screen, int *row); 203 204 #define vt_screen_get_tab_size(screen) vt_edit_get_tab_size((screen)->edit) 205 206 #define vt_screen_set_tab_size(screen, tab_size) vt_edit_set_tab_size((screen)->edit, tab_size) 207 208 #define vt_screen_is_tab_stop(screen, col) vt_edit_is_tab_stop((screen)->edit, col) 209 210 int vt_screen_restore_color(vt_screen_t *screen, int beg_char_index, int beg_row, 211 int end_char_index, int end_row, int is_rect); 212 213 int vt_screen_reverse_color(vt_screen_t *screen, int beg_char_index, int beg_row, 214 int end_char_index, int end_row, int is_rect); 215 216 u_int vt_screen_copy_region(vt_screen_t *screen, vt_char_t *chars, u_int num_chars, 217 int beg_char_index, int beg_row, int end_char_index, int end_row, 218 int is_rect); 219 220 u_int vt_screen_get_region_size(vt_screen_t *screen, int beg_char_index, int beg_row, 221 int end_char_index, int end_row, int is_rect); 222 223 int vt_screen_get_line_region(vt_screen_t *screen, int *beg_row, int *end_char_index, int *end_row, 224 int base_row); 225 226 int vt_screen_get_word_region(vt_screen_t *screen, int *beg_char_index, int *beg_row, 227 int *end_char_index, int *end_row, int base_char_index, int base_row); 228 229 int vt_screen_search_init(vt_screen_t *screen, int char_index, int row, 230 int (*match)(size_t *, size_t *, void *, u_char *, int)); 231 232 void vt_screen_search_final(vt_screen_t *screen); 233 234 int vt_screen_search_reset_position(vt_screen_t *screen); 235 236 int vt_screen_search_find(vt_screen_t *screen, int *beg_char_index, int *beg_row, 237 int *end_char_index, int *end_row, void *regex, int backward); 238 239 int vt_screen_blink(vt_screen_t *screen); 240 241 /* 242 * VT100 commands (called in logical context) 243 */ 244 245 vt_char_t *vt_screen_get_n_prev_char(vt_screen_t *screen, int n); 246 247 int vt_screen_combine_with_prev_char(vt_screen_t *screen, u_int32_t code, ef_charset_t cs, 248 int is_fullwidth, int is_awidth, int is_comb, 249 vt_color_t fg_color, vt_color_t bg_color, int is_bold, 250 int is_italic, int line_style, int is_blinking, 251 int is_protected); 252 253 int vt_screen_insert_chars(vt_screen_t *screen, vt_char_t *chars, u_int len); 254 255 #define vt_screen_insert_blank_chars(screen, len) vt_edit_insert_blank_chars((screen)->edit, len) 256 257 #define vt_screen_forward_tabs(screen, num) vt_edit_forward_tabs((screen)->edit, num) 258 259 #define vt_screen_backward_tabs(screen, num) vt_edit_backward_tabs((screen)->edit, num) 260 261 #define vt_screen_set_tab_stop(screen) vt_edit_set_tab_stop((screen)->edit) 262 263 #define vt_screen_clear_tab_stop(screen) vt_edit_clear_tab_stop((screen)->edit) 264 265 #define vt_screen_clear_all_tab_stops(screen) vt_edit_clear_all_tab_stops((screen)->edit) 266 267 int vt_screen_insert_new_lines(vt_screen_t *screen, u_int size); 268 269 #define vt_screen_line_feed(screen) vt_edit_go_downward((screen)->edit, SCROLL) 270 271 int vt_screen_overwrite_chars(vt_screen_t *screen, vt_char_t *chars, u_int len); 272 273 #define vt_screen_delete_cols(screen, len) vt_edit_delete_cols((screen)->edit, len) 274 275 int vt_screen_delete_lines(vt_screen_t *screen, u_int size); 276 277 #define vt_screen_clear_cols(screen, cols) vt_edit_clear_cols((screen)->edit, cols) 278 279 #define vt_screen_clear_line_to_right(screen) vt_edit_clear_line_to_right((screen)->edit) 280 281 #define vt_screen_clear_line_to_left(screen) vt_edit_clear_line_to_left((screen)->edit) 282 283 #define vt_screen_clear_below(screen) vt_edit_clear_below((screen)->edit) 284 285 #define vt_screen_clear_above(screen) vt_edit_clear_above((screen)->edit) 286 287 #define vt_screen_save_protected_chars(screen, beg_row, end_row, relative) \ 288 vt_edit_save_protected_chars((screen)->edit, beg_row, end_row, relative) 289 290 #define vt_screen_restore_protected_chars(screen, save) \ 291 vt_edit_restore_protected_chars((screen)->edit, save) 292 293 #define vt_screen_set_vmargin(screen, beg, end) vt_edit_set_vmargin((screen)->edit, beg, end) 294 295 #define vt_screen_set_use_hmargin(screen, use) vt_edit_set_use_hmargin((screen)->edit, use) 296 297 #define vt_screen_set_hmargin(screen, beg, end) vt_edit_set_hmargin((screen)->edit, beg, end) 298 299 #define vt_screen_index(screen) vt_edit_go_downward((screen)->edit, SCROLL) 300 301 #define vt_screen_reverse_index(screen) vt_edit_go_upward((screen)->edit, SCROLL) 302 303 #define vt_screen_scroll_upward(screen, size) vt_edit_scroll_upward((screen)->edit, size) 304 305 #define vt_screen_scroll_downward(screen, size) vt_edit_scroll_downward((screen)->edit, size) 306 307 #define vt_screen_scroll_leftward(screen, size) vt_edit_scroll_leftward((screen)->edit, size) 308 309 #define vt_screen_scroll_rightward(screen, size) vt_edit_scroll_rightward((screen)->edit, size) 310 311 #define vt_screen_scroll_leftward_from_cursor(screen, size) \ 312 vt_edit_scroll_leftward_from_cursor((screen)->edit, size) 313 314 #define vt_screen_scroll_rightward_from_cursor(screen, size) \ 315 vt_edit_scroll_rightward_from_cursor((screen)->edit, size) 316 317 int vt_screen_go_forward(vt_screen_t *screen, u_int size, int scroll); 318 319 int vt_screen_go_back(vt_screen_t *screen, u_int size, int scroll); 320 321 int vt_screen_go_upward(vt_screen_t *screen, u_int size); 322 323 int vt_screen_go_downward(vt_screen_t *screen, u_int size); 324 325 #define vt_screen_goto_beg_of_line(screen) vt_edit_goto_beg_of_line((screen)->edit) 326 327 #define vt_screen_go_horizontally(screen, col) \ 328 vt_edit_goto((screen)->edit, col, vt_edit_cursor_logical_row((screen)->edit)) 329 330 #define vt_screen_go_vertically(screen, row) \ 331 vt_edit_goto((screen)->edit, vt_edit_cursor_logical_col((screen)->edit), row) 332 333 #define vt_screen_goto_home(screen) vt_edit_goto_home((screen)->edit) 334 335 #define vt_screen_goto(screen, col, row) vt_edit_goto((screen)->edit, col, row) 336 337 #define vt_screen_set_relative_origin(screen, flag) \ 338 vt_edit_set_relative_origin((screen)->edit, flag) 339 340 #define vt_screen_is_relative_origin(screen) vt_edit_is_relative_origin((screen)->edit) 341 342 #define vt_screen_set_auto_wrap(screen, flag) vt_edit_set_auto_wrap((screen)->edit, flag) 343 344 #define vt_screen_is_auto_wrap(screen) vt_edit_is_auto_wrap((screen)->edit) 345 346 #define vt_screen_set_last_column_flag(screen, flag) \ 347 vt_edit_set_last_column_flag((screen)->edit, flag) 348 349 #define vt_screen_get_last_column_flag(screen) vt_edit_get_last_column_flag((screen)->edit) 350 351 #define vt_screen_get_bce_ch(screen) vt_edit_get_bce_ch((screen)->edit) 352 353 #define vt_screen_save_cursor(screen) vt_edit_save_cursor((screen)->edit) 354 355 #define vt_screen_saved_cursor_to_home(screen) vt_edit_saved_cursor_to_home((screen)->edit) 356 357 #define vt_screen_restore_cursor(screen) vt_edit_restore_cursor((screen)->edit) 358 359 int vt_screen_cursor_visible(vt_screen_t *screen); 360 361 int vt_screen_cursor_invisible(vt_screen_t *screen); 362 363 #define vt_screen_is_cursor_visible(screen) ((screen)->is_cursor_visible) 364 365 /* 366 * XXX 367 * Note that alt_edit/normal_edit are directly switched by ui_picture.c without 368 * using following 3 functions. 369 */ 370 371 #define vt_screen_is_alternative_edit(screen) ((screen)->edit == &(screen)->alt_edit) 372 373 int vt_screen_use_normal_edit(vt_screen_t *screen); 374 375 int vt_screen_use_alternative_edit(vt_screen_t *screen); 376 377 #define vt_screen_is_local_echo_mode(screen) ((screen)->stored_edit) 378 379 int vt_screen_enable_local_echo(vt_screen_t *screen); 380 381 int vt_screen_local_echo_wait(vt_screen_t *screen, int msec); 382 383 int vt_screen_disable_local_echo(vt_screen_t *screen); 384 385 #define vt_screen_fill_area(screen, code, is_protected, col, beg, num_cols, num_rows) \ 386 vt_edit_fill_area((screen)->edit, code, is_protected, col, beg, num_cols, num_rows) 387 388 void vt_screen_copy_area(vt_screen_t *screen, int src_col, int src_row, u_int num_copy_cols, 389 u_int num_copy_rows, u_int src_page, 390 int dst_col, int dst_row, u_int dst_page); 391 392 #define vt_screen_erase_area(screen, col, row, num_cols, num_rows) \ 393 vt_edit_erase_area((screen)->edit, col, row, num_cols, num_rows) 394 395 #define vt_screen_change_attr_area(screen, col, row, num_cols, num_rows, attr) \ 396 vt_edit_change_attr_area((screen)->edit, col, row, num_cols, num_rows, \ 397 vt_char_change_attr, attr) 398 399 #define vt_screen_reverse_attr_area(screen, col, row, num_cols, num_rows, attr) \ 400 vt_edit_change_attr_area((screen)->edit, col, row, num_cols, num_rows, \ 401 vt_char_reverse_attr, attr) 402 403 u_int16_t vt_screen_get_checksum(vt_screen_t *screen, int col, int row, 404 u_int num_cols, u_int num_rows, int page); 405 406 #define vt_screen_set_use_rect_attr_select(screen, use) \ 407 vt_edit_set_use_rect_attr_select((screen)->edit, use) 408 409 #define vt_screen_is_using_rect_attr_select(screen) \ 410 vt_edit_is_using_rect_attr_select((screen)->edit) 411 412 #define vt_screen_clear_size_attr(screen) vt_edit_clear_size_attr((screen)->edit) 413 414 void vt_screen_enable_blinking(vt_screen_t *screen); 415 416 int vt_screen_write_content(vt_screen_t *screen, int fd, ef_conv_t *conv, int clear_at_end, 417 vt_write_content_area_t area); 418 419 int vt_screen_get_page_id(vt_screen_t *screen); 420 421 int vt_screen_goto_page(vt_screen_t *screen, u_int page_id); 422 423 int vt_screen_goto_next_page(vt_screen_t *screen, u_int offset); 424 425 int vt_screen_goto_prev_page(vt_screen_t *prev, u_int offset); 426 427 #define vt_screen_cursor_is_rtl(screen) \ 428 ((screen)->logvis ? vt_logical_visual_cursor_is_rtl((screen)->logvis) : 0) 429 430 /* This considers status line */ 431 #define vt_screen_has_status_line(screen) ((screen)->has_status_line) 432 433 /* This considers status line */ 434 void vt_screen_set_use_status_line(vt_screen_t *screen, int use); 435 436 /* This considers status line */ 437 #define vt_status_line_is_focused(screen) ((screen)->edit == (screen)->status_edit) 438 439 /* This considers status line */ 440 void vt_focus_status_line(vt_screen_t *screen); 441 442 /* This considers status line */ 443 void vt_focus_main_screen(vt_screen_t *screen); 444 445 #endif 446