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