1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */ 2 3 #ifndef __VT_EDIT_H__ 4 #define __VT_EDIT_H__ 5 6 #include <pobl/bl_types.h> 7 8 #include "vt_str.h" 9 #include "vt_line.h" 10 #include "vt_model.h" 11 #include "vt_cursor.h" 12 13 typedef enum vt_resize_mode { 14 RZ_NONE, 15 RZ_SCROLL, 16 RZ_WRAP, 17 RZ_MODE_MAX, 18 19 } vt_resize_mode_t; 20 21 typedef struct vt_edit_scroll_event_listener { 22 void *self; 23 24 void (*receive_scrolled_out_line)(void *, vt_line_t *); 25 void (*scrolled_out_lines_finished)(void *); 26 27 int (*window_scroll_upward_region)(void *, int, int, u_int); 28 int (*window_scroll_downward_region)(void *, int, int, u_int); 29 30 int (*top_line_is_wrapped)(void *); 31 32 } vt_edit_scroll_event_listener_t; 33 34 typedef struct vt_protect_store { 35 vt_char_t *chars; 36 int beg_row; 37 int end_row; 38 39 } vt_protect_store_t; 40 41 typedef struct vt_edit { 42 vt_model_t model; 43 vt_cursor_t cursor; 44 45 u_int tab_size; 46 u_int8_t *tab_stops; 47 48 vt_char_t bce_ch; 49 50 /* used for line overlapping */ 51 vt_line_t *wraparound_ready_line; 52 53 int16_t vmargin_beg; 54 int16_t vmargin_end; 55 56 vt_edit_scroll_event_listener_t *scroll_listener; 57 58 int16_t hmargin_beg; 59 int16_t hmargin_end; 60 int8_t use_margin; 61 62 int8_t is_logging; 63 int8_t is_relative_origin; 64 int8_t is_auto_wrap; 65 int8_t use_bce; 66 int8_t use_rect_attr_select; 67 68 } vt_edit_t; 69 70 void vt_set_resize_mode(vt_resize_mode_t mode); 71 72 vt_resize_mode_t vt_get_resize_mode_by_name(const char *name); 73 74 int vt_edit_init(vt_edit_t *edit, vt_edit_scroll_event_listener_t *scroll_listener, 75 u_int num_cols, u_int num_rows, u_int tab_size, int is_logging, int use_bce); 76 77 void vt_edit_final(vt_edit_t *edit); 78 79 int vt_edit_clone(vt_edit_t *dst_edit, vt_edit_t *src_edit); 80 81 int vt_edit_resize(vt_edit_t *edit, u_int num_cols, u_int num_rows); 82 83 int vt_edit_insert_chars(vt_edit_t *edit, vt_char_t *chars, u_int num_chars); 84 85 int vt_edit_insert_blank_chars(vt_edit_t *edit, u_int num_blank_chars); 86 87 int vt_edit_overwrite_chars(vt_edit_t *edit, vt_char_t *chars, u_int num_chars); 88 89 u_int vt_edit_replace(vt_edit_t *edit, int beg_row, vt_char_t *chars, u_int cols, 90 u_int max_cols_per_line); 91 92 int vt_edit_delete_cols(vt_edit_t *edit, u_int delete_cols); 93 94 int vt_edit_clear_cols(vt_edit_t *edit, u_int cols); 95 96 int vt_edit_insert_new_line(vt_edit_t *edit); 97 98 int vt_edit_delete_line(vt_edit_t *edit); 99 100 int vt_edit_clear_line_to_right(vt_edit_t *edit); 101 102 int vt_edit_clear_line_to_left(vt_edit_t *edit); 103 104 int vt_edit_clear_below(vt_edit_t *edit); 105 106 int vt_edit_clear_above(vt_edit_t *edit); 107 108 vt_protect_store_t *vt_edit_save_protected_chars(vt_edit_t *edit, int beg_row, int end_row, 109 int relative); 110 111 void vt_edit_restore_protected_chars(vt_edit_t *edit, vt_protect_store_t *save); 112 113 int vt_edit_set_vmargin(vt_edit_t *edit, int beg, int end); 114 115 int vt_edit_scroll_upward(vt_edit_t *edit, u_int size); 116 117 int vt_edit_scroll_downward(vt_edit_t *edit, u_int size); 118 119 void vt_edit_scroll_leftward(vt_edit_t *edit, u_int size); 120 121 void vt_edit_scroll_rightward(vt_edit_t *edit, u_int size); 122 123 int vt_edit_scroll_leftward_from_cursor(vt_edit_t *edit, u_int size); 124 125 int vt_edit_scroll_rightward_from_cursor(vt_edit_t *edit, u_int size); 126 127 void vt_edit_set_use_hmargin(vt_edit_t *edit, int use); 128 129 int vt_edit_set_hmargin(vt_edit_t *edit, int beg, int end); 130 131 int vt_edit_forward_tabs(vt_edit_t *edit, u_int num); 132 133 int vt_edit_backward_tabs(vt_edit_t *edit, u_int num); 134 135 #define vt_edit_get_tab_size(edit) ((edit)->tab_size) 136 137 void vt_edit_set_tab_size(vt_edit_t *edit, u_int tab_size); 138 139 void vt_edit_set_tab_stop(vt_edit_t *edit); 140 141 #define vt_edit_is_tab_stop(edit, col) ((edit)->tab_stops[(col) / 8] & (1 << ((col) % 8))) 142 143 void vt_edit_clear_tab_stop(vt_edit_t *edit); 144 145 void vt_edit_clear_all_tab_stops(vt_edit_t *edit); 146 147 #define vt_edit_get_num_filled_rows(edit) vt_model_get_num_filled_rows(&(edit)->model) 148 149 #define vt_edit_get_line(edit, row) (vt_model_get_line(&(edit)->model, row)) 150 151 void vt_edit_set_modified_all(vt_edit_t *edit); 152 153 #define vt_edit_get_cols(edit) ((edit)->model.num_cols) 154 155 #define vt_edit_get_rows(edit) ((edit)->model.num_rows) 156 157 int vt_edit_go_forward(vt_edit_t *edit, int flag); 158 159 int vt_edit_go_back(vt_edit_t *edit, int flag); 160 161 int vt_edit_go_upward(vt_edit_t *edit, int flag); 162 163 int vt_edit_go_downward(vt_edit_t *edit, int flag); 164 165 void vt_edit_goto_beg_of_line(vt_edit_t *edit); 166 167 void vt_edit_goto_home(vt_edit_t *edit); 168 169 int vt_edit_goto(vt_edit_t *edit, int col, int row); 170 171 #define vt_edit_set_relative_origin(edit, flag) ((edit)->is_relative_origin = (flag)) 172 173 #define vt_edit_is_relative_origin(edit) ((edit)->is_relative_origin) 174 175 #define vt_edit_set_auto_wrap(edit, flag) ((edit)->is_auto_wrap = (flag)) 176 177 #define vt_edit_is_auto_wrap(edit) ((edit)->is_auto_wrap) 178 179 void vt_edit_set_last_column_flag(vt_edit_t *edit, int flag); 180 181 #define vt_edit_get_last_column_flag(edit) ((edit)->wraparound_ready_line ? 1 : 0) 182 183 #define vt_edit_set_use_bce(edit, use) ((edit)->use_bce = (use)) 184 185 #define vt_edit_is_using_bce(edit) ((edit)->use_bce) 186 187 #define vt_edit_set_bce_fg_color(edit, fg_color) vt_char_set_fg_color(&(edit)->bce_ch, fg_color) 188 189 #define vt_edit_set_bce_bg_color(edit, bg_color) vt_char_set_bg_color(&(edit)->bce_ch, bg_color) 190 191 #define vt_edit_get_bce_ch(edit) (&(edit)->bce_ch) 192 193 #define vt_edit_save_cursor(edit) vt_cursor_save(&(edit)->cursor) 194 195 #define vt_edit_saved_cursor_to_home(edit) vt_saved_cursor_to_home(&(edit)->cursor) 196 197 int vt_edit_restore_cursor(vt_edit_t *edit); 198 199 void vt_edit_fill_area(vt_edit_t *edit, int code, int is_protected, 200 int col, int row, u_int num_cols, u_int num_rows); 201 202 void vt_edit_copy_area(vt_edit_t *src_edit, int src_col, int src_row, u_int num_copy_cols, 203 u_int num_copy_rows, vt_edit_t *dst_edit, int dst_col, int dst_row); 204 205 void vt_edit_erase_area(vt_edit_t *edit, int col, int row, u_int num_cols, u_int num_rows); 206 207 void vt_edit_change_attr_area(vt_edit_t *edit, int col, int row, u_int num_cols, u_int num_rows, 208 void (*func)(vt_char_t *, int, int, int, int, int, int, int), 209 int attr); 210 211 u_int16_t vt_edit_get_checksum(vt_edit_t *edit, int col, int row, u_int num_cols, u_int num_rows); 212 213 void vt_edit_clear_size_attr(vt_edit_t *edit); 214 215 #define vt_edit_set_use_rect_attr_select(edit, use) ((edit)->use_rect_attr_select = (use)) 216 217 #define vt_edit_is_using_rect_attr_select(edit) ((edit)->use_rect_attr_select) 218 219 #define vt_cursor_char_index(edit) ((edit)->cursor.char_index) 220 221 #define vt_cursor_col(edit) ((edit)->cursor.col) 222 223 #define vt_cursor_row(edit) ((edit)->cursor.row) 224 225 int vt_edit_cursor_logical_col(vt_edit_t *edit); 226 227 int vt_edit_cursor_logical_row(vt_edit_t *edit); 228 229 #define vt_edit_is_logging(edit) ((edit)->is_logging) 230 231 #ifdef DEBUG 232 233 void vt_edit_dump(vt_edit_t *edit); 234 235 void vt_edit_dump_updated(vt_edit_t *edit); 236 237 #endif 238 239 #endif 240