Lines Matching refs:state
14 static void putglyph(VTermState *state, const uint32_t chars[], int width, VTermPos pos) in putglyph() argument
19 .protected_cell = state->protected_cell, in putglyph()
20 .dwl = state->lineinfo[pos.row].doublewidth, in putglyph()
21 .dhl = state->lineinfo[pos.row].doubleheight, in putglyph()
24 if(state->callbacks && state->callbacks->putglyph) in putglyph()
25 if((*state->callbacks->putglyph)(&info, pos, state->cbdata)) in putglyph()
31 static void updatecursor(VTermState *state, VTermPos *oldpos, int cancel_phantom) in updatecursor() argument
33 if(state->pos.col == oldpos->col && state->pos.row == oldpos->row) in updatecursor()
37 state->at_phantom = 0; in updatecursor()
39 if(state->callbacks && state->callbacks->movecursor) in updatecursor()
40 …if((*state->callbacks->movecursor)(state->pos, *oldpos, state->mode.cursor_visible, state->cbdata)) in updatecursor()
44 static void erase(VTermState *state, VTermRect rect, int selective) in erase() argument
46 if(state->callbacks && state->callbacks->erase) in erase()
47 if((*state->callbacks->erase)(rect, selective, state->cbdata)) in erase()
53 VTermState *state = vterm_allocator_malloc(vt, sizeof(VTermState)); in vterm_state_new() local
55 state->vt = vt; in vterm_state_new()
57 state->rows = vt->rows; in vterm_state_new()
58 state->cols = vt->cols; in vterm_state_new()
60 state->mouse_col = 0; in vterm_state_new()
61 state->mouse_row = 0; in vterm_state_new()
62 state->mouse_buttons = 0; in vterm_state_new()
64 state->mouse_protocol = MOUSE_X10; in vterm_state_new()
66 state->callbacks = NULL; in vterm_state_new()
67 state->cbdata = NULL; in vterm_state_new()
69 vterm_state_newpen(state); in vterm_state_new()
71 state->bold_is_highbright = 0; in vterm_state_new()
73 return state; in vterm_state_new()
76 INTERNAL void vterm_state_free(VTermState *state) in vterm_state_free() argument
78 vterm_allocator_free(state->vt, state->tabstops); in vterm_state_free()
79 vterm_allocator_free(state->vt, state->lineinfo); in vterm_state_free()
80 vterm_allocator_free(state->vt, state->combine_chars); in vterm_state_free()
81 vterm_allocator_free(state->vt, state); in vterm_state_free()
84 static void scroll(VTermState *state, VTermRect rect, int downward, int rightward) in scroll() argument
102 if(rect.start_col == 0 && rect.end_col == state->cols && rightward == 0) { in scroll()
106 memmove(state->lineinfo + rect.start_row, in scroll()
107 state->lineinfo + rect.start_row + downward, in scroll()
108 height * sizeof(state->lineinfo[0])); in scroll()
110 memmove(state->lineinfo + rect.start_row - downward, in scroll()
111 state->lineinfo + rect.start_row, in scroll()
112 height * sizeof(state->lineinfo[0])); in scroll()
115 if(state->callbacks && state->callbacks->scrollrect) in scroll()
116 if((*state->callbacks->scrollrect)(rect, downward, rightward, state->cbdata)) in scroll()
119 if(state->callbacks) in scroll()
121 state->callbacks->moverect, state->callbacks->erase, state->cbdata); in scroll()
124 static void linefeed(VTermState *state) in linefeed() argument
126 if(state->pos.row == SCROLLREGION_BOTTOM(state) - 1) { in linefeed()
128 .start_row = state->scrollregion_top, in linefeed()
129 .end_row = SCROLLREGION_BOTTOM(state), in linefeed()
130 .start_col = SCROLLREGION_LEFT(state), in linefeed()
131 .end_col = SCROLLREGION_RIGHT(state), in linefeed()
134 scroll(state, rect, 1, 0); in linefeed()
136 else if(state->pos.row < state->rows-1) in linefeed()
137 state->pos.row++; in linefeed()
140 static void grow_combine_buffer(VTermState *state) in grow_combine_buffer() argument
142 size_t new_size = state->combine_chars_size * 2; in grow_combine_buffer()
143 uint32_t *new_chars = vterm_allocator_malloc(state->vt, new_size * sizeof(new_chars[0])); in grow_combine_buffer()
145 memcpy(new_chars, state->combine_chars, state->combine_chars_size * sizeof(new_chars[0])); in grow_combine_buffer()
147 vterm_allocator_free(state->vt, state->combine_chars); in grow_combine_buffer()
149 state->combine_chars = new_chars; in grow_combine_buffer()
150 state->combine_chars_size = new_size; in grow_combine_buffer()
153 static void set_col_tabstop(VTermState *state, int col) in set_col_tabstop() argument
156 state->tabstops[col >> 3] |= mask; in set_col_tabstop()
159 static void clear_col_tabstop(VTermState *state, int col) in clear_col_tabstop() argument
162 state->tabstops[col >> 3] &= ~mask; in clear_col_tabstop()
165 static int is_col_tabstop(VTermState *state, int col) in is_col_tabstop() argument
168 return state->tabstops[col >> 3] & mask; in is_col_tabstop()
171 static int is_cursor_in_scrollregion(const VTermState *state) in is_cursor_in_scrollregion() argument
173 if(state->pos.row < state->scrollregion_top || in is_cursor_in_scrollregion()
174 state->pos.row >= SCROLLREGION_BOTTOM(state)) in is_cursor_in_scrollregion()
176 if(state->pos.col < SCROLLREGION_LEFT(state) || in is_cursor_in_scrollregion()
177 state->pos.col >= SCROLLREGION_RIGHT(state)) in is_cursor_in_scrollregion()
183 static void tab(VTermState *state, int count, int direction) in tab() argument
187 if(state->pos.col >= THISROWWIDTH(state)-1) in tab()
190 state->pos.col++; in tab()
193 if(state->pos.col < 1) in tab()
196 state->pos.col--; in tab()
199 if(is_col_tabstop(state, state->pos.col)) in tab()
214 static void set_lineinfo(VTermState *state, int row, int force, int dwl, int dhl) in set_lineinfo() argument
216 VTermLineInfo info = state->lineinfo[row]; in set_lineinfo()
231 if((state->callbacks && in set_lineinfo()
232 state->callbacks->setlineinfo && in set_lineinfo()
233 (*state->callbacks->setlineinfo)(row, &info, state->lineinfo + row, state->cbdata)) in set_lineinfo()
235 state->lineinfo[row] = info; in set_lineinfo()
240 VTermState *state = user; in on_text() local
242 VTermPos oldpos = state->pos; in on_text()
250 state->gsingle_set ? &state->encoding[state->gsingle_set] : in on_text()
251 !(bytes[eaten] & 0x80) ? &state->encoding[state->gl_set] : in on_text()
252 state->vt->mode.utf8 ? &state->encoding_utf8 : in on_text()
253 &state->encoding[state->gr_set]; in on_text()
256 codepoints, &npoints, state->gsingle_set ? 1 : len, in on_text()
265 if(state->gsingle_set && npoints) in on_text()
266 state->gsingle_set = 0; in on_text()
274 …if(state->pos.row == state->combine_pos.row && state->pos.col == state->combine_pos.col + state->c… in on_text()
278 for(printpos = 0; state->combine_chars[printpos]; printpos++) in on_text()
279 printf("U+%04x ", state->combine_chars[printpos]); in on_text()
285 while(state->combine_chars[saved_i]) in on_text()
290 if(saved_i >= state->combine_chars_size) in on_text()
291 grow_combine_buffer(state); in on_text()
292 state->combine_chars[saved_i++] = codepoints[i++]; in on_text()
294 if(saved_i >= state->combine_chars_size) in on_text()
295 grow_combine_buffer(state); in on_text()
296 state->combine_chars[saved_i] = 0; in on_text()
299 for(; state->combine_chars[printpos]; printpos++) in on_text()
300 printf("U+%04x ", state->combine_chars[printpos]); in on_text()
305 putglyph(state, state->combine_chars, state->combine_width, state->combine_pos); in on_text()
347 if(state->at_phantom || state->pos.col + width > THISROWWIDTH(state)) { in on_text()
348 linefeed(state); in on_text()
349 state->pos.col = 0; in on_text()
350 state->at_phantom = 0; in on_text()
353 if(state->mode.insert) { in on_text()
359 .start_row = state->pos.row, in on_text()
360 .end_row = state->pos.row + 1, in on_text()
361 .start_col = state->pos.col, in on_text()
362 .end_col = THISROWWIDTH(state), in on_text()
364 scroll(state, rect, 0, -1); in on_text()
367 putglyph(state, chars, width, state->pos); in on_text()
374 if(save_i >= state->combine_chars_size) in on_text()
375 grow_combine_buffer(state); in on_text()
376 state->combine_chars[save_i] = chars[save_i]; in on_text()
378 if(save_i >= state->combine_chars_size) in on_text()
379 grow_combine_buffer(state); in on_text()
380 state->combine_chars[save_i] = 0; in on_text()
381 state->combine_width = width; in on_text()
382 state->combine_pos = state->pos; in on_text()
385 if(state->pos.col + width >= THISROWWIDTH(state)) { in on_text()
386 if(state->mode.autowrap) in on_text()
387 state->at_phantom = 1; in on_text()
390 state->pos.col += width; in on_text()
394 updatecursor(state, &oldpos, 0); in on_text()
397 if(state->pos.row < 0 || state->pos.row >= state->rows || in on_text()
398 state->pos.col < 0 || state->pos.col >= state->cols) { in on_text()
400 state->pos.row, state->pos.col); in on_text()
410 VTermState *state = user; in on_control() local
412 VTermPos oldpos = state->pos; in on_control()
416 if(state->callbacks && state->callbacks->bell) in on_control()
417 (*state->callbacks->bell)(state->cbdata); in on_control()
421 if(state->pos.col > 0) in on_control()
422 state->pos.col--; in on_control()
426 tab(state, 1, +1); in on_control()
432 linefeed(state); in on_control()
433 if(state->mode.newline) in on_control()
434 state->pos.col = 0; in on_control()
438 state->pos.col = 0; in on_control()
442 state->gl_set = 1; in on_control()
446 state->gl_set = 0; in on_control()
450 linefeed(state); in on_control()
454 linefeed(state); in on_control()
455 state->pos.col = 0; in on_control()
459 set_col_tabstop(state, state->pos.col); in on_control()
463 if(state->pos.row == state->scrollregion_top) { in on_control()
465 .start_row = state->scrollregion_top, in on_control()
466 .end_row = SCROLLREGION_BOTTOM(state), in on_control()
467 .start_col = SCROLLREGION_LEFT(state), in on_control()
468 .end_col = SCROLLREGION_RIGHT(state), in on_control()
471 scroll(state, rect, -1, 0); in on_control()
473 else if(state->pos.row > 0) in on_control()
474 state->pos.row--; in on_control()
478 state->gsingle_set = 2; in on_control()
482 state->gsingle_set = 3; in on_control()
486 if(state->fallbacks && state->fallbacks->control) in on_control()
487 if((*state->fallbacks->control)(control, state->fbdata)) in on_control()
493 updatecursor(state, &oldpos, 1); in on_control()
496 if(state->pos.row < 0 || state->pos.row >= state->rows || in on_control()
497 state->pos.col < 0 || state->pos.col >= state->cols) { in on_control()
499 control, state->pos.row, state->pos.col); in on_control()
507 static int settermprop_bool(VTermState *state, VTermProp prop, int v) in settermprop_bool() argument
510 return vterm_state_set_termprop(state, prop, &val); in settermprop_bool()
513 static int settermprop_int(VTermState *state, VTermProp prop, int v) in settermprop_int() argument
516 return vterm_state_set_termprop(state, prop, &val); in settermprop_int()
519 static int settermprop_string(VTermState *state, VTermProp prop, const char *str, size_t len) in settermprop_string() argument
526 return vterm_state_set_termprop(state, prop, &val); in settermprop_string()
529 static void savecursor(VTermState *state, int save) in savecursor() argument
532 state->saved.pos = state->pos; in savecursor()
533 state->saved.mode.cursor_visible = state->mode.cursor_visible; in savecursor()
534 state->saved.mode.cursor_blink = state->mode.cursor_blink; in savecursor()
535 state->saved.mode.cursor_shape = state->mode.cursor_shape; in savecursor()
537 vterm_state_savepen(state, 1); in savecursor()
540 VTermPos oldpos = state->pos; in savecursor()
542 state->pos = state->saved.pos; in savecursor()
544 settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, state->saved.mode.cursor_visible); in savecursor()
545 settermprop_bool(state, VTERM_PROP_CURSORBLINK, state->saved.mode.cursor_blink); in savecursor()
546 settermprop_int (state, VTERM_PROP_CURSORSHAPE, state->saved.mode.cursor_shape); in savecursor()
548 vterm_state_savepen(state, 0); in savecursor()
550 updatecursor(state, &oldpos, 1); in savecursor()
556 VTermState *state = user; in on_escape() local
568 state->vt->mode.ctrl8bit = 0; in on_escape()
572 state->vt->mode.ctrl8bit = 1; in on_escape()
586 if(state->mode.leftrightmargin) in on_escape()
588 set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_TOP); in on_escape()
592 if(state->mode.leftrightmargin) in on_escape()
594 set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_BOTTOM); in on_escape()
598 if(state->mode.leftrightmargin) in on_escape()
600 set_lineinfo(state, state->pos.row, NO_FORCE, DWL_OFF, DHL_OFF); in on_escape()
604 if(state->mode.leftrightmargin) in on_escape()
606 set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_OFF); in on_escape()
613 for(pos.row = 0; pos.row < state->rows; pos.row++) in on_escape()
614 for(pos.col = 0; pos.col < ROWWIDTH(state, pos.row); pos.col++) in on_escape()
615 putglyph(state, E, 1, pos); in on_escape()
633 state->encoding[setnum].enc = newenc; in on_escape()
636 (*newenc->init)(newenc, state->encoding[setnum].data); in on_escape()
643 savecursor(state, 1); in on_escape()
647 savecursor(state, 0); in on_escape()
654 state->mode.keypad = 1; in on_escape()
658 state->mode.keypad = 0; in on_escape()
663 VTermPos oldpos = state->pos; in on_escape()
664 vterm_state_reset(state, 1); in on_escape()
665 if(state->callbacks && state->callbacks->movecursor) in on_escape()
666 … (*state->callbacks->movecursor)(state->pos, oldpos, state->mode.cursor_visible, state->cbdata); in on_escape()
671 state->gl_set = 2; in on_escape()
675 state->gl_set = 3; in on_escape()
679 state->gr_set = 1; in on_escape()
683 state->gr_set = 2; in on_escape()
687 state->gr_set = 3; in on_escape()
695 static void set_mode(VTermState *state, int num, int val) in set_mode() argument
699 state->mode.insert = val; in set_mode()
703 state->mode.newline = val; in set_mode()
712 static void set_dec_mode(VTermState *state, int num, int val) in set_dec_mode() argument
716 state->mode.cursor = val; in set_dec_mode()
720 settermprop_bool(state, VTERM_PROP_REVERSE, val); in set_dec_mode()
725 VTermPos oldpos = state->pos; in set_dec_mode()
726 state->mode.origin = val; in set_dec_mode()
727 state->pos.row = state->mode.origin ? state->scrollregion_top : 0; in set_dec_mode()
728 state->pos.col = state->mode.origin ? SCROLLREGION_LEFT(state) : 0; in set_dec_mode()
729 updatecursor(state, &oldpos, 1); in set_dec_mode()
734 state->mode.autowrap = val; in set_dec_mode()
738 settermprop_bool(state, VTERM_PROP_CURSORBLINK, val); in set_dec_mode()
742 settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, val); in set_dec_mode()
747 state->mode.leftrightmargin = val; in set_dec_mode()
750 for(int row = 0; row < state->rows; row++) in set_dec_mode()
751 set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF); in set_dec_mode()
759 settermprop_int(state, VTERM_PROP_MOUSE, in set_dec_mode()
767 state->mode.report_focus = val; in set_dec_mode()
771 state->mouse_protocol = val ? MOUSE_UTF8 : MOUSE_X10; in set_dec_mode()
775 state->mouse_protocol = val ? MOUSE_SGR : MOUSE_X10; in set_dec_mode()
779 state->mouse_protocol = val ? MOUSE_RXVT : MOUSE_X10; in set_dec_mode()
783 settermprop_bool(state, VTERM_PROP_ALTSCREEN, val); in set_dec_mode()
787 savecursor(state, val); in set_dec_mode()
791 settermprop_bool(state, VTERM_PROP_ALTSCREEN, val); in set_dec_mode()
792 savecursor(state, val); in set_dec_mode()
796 state->mode.bracketpaste = val; in set_dec_mode()
805 static void request_dec_mode(VTermState *state, int num) in request_dec_mode() argument
811 reply = state->mode.cursor; in request_dec_mode()
815 reply = state->mode.screen; in request_dec_mode()
819 reply = state->mode.origin; in request_dec_mode()
823 reply = state->mode.autowrap; in request_dec_mode()
827 reply = state->mode.cursor_blink; in request_dec_mode()
831 reply = state->mode.cursor_visible; in request_dec_mode()
835 reply = state->mode.leftrightmargin; in request_dec_mode()
839 reply = state->mouse_flags == MOUSE_WANT_CLICK; in request_dec_mode()
843 reply = state->mouse_flags == (MOUSE_WANT_CLICK|MOUSE_WANT_DRAG); in request_dec_mode()
847 reply = state->mouse_flags == (MOUSE_WANT_CLICK|MOUSE_WANT_MOVE); in request_dec_mode()
851 reply = state->mode.report_focus; in request_dec_mode()
855 reply = state->mouse_protocol == MOUSE_UTF8; in request_dec_mode()
859 reply = state->mouse_protocol == MOUSE_SGR; in request_dec_mode()
863 reply = state->mouse_protocol == MOUSE_RXVT; in request_dec_mode()
867 reply = state->mode.alt_screen; in request_dec_mode()
871 reply = state->mode.bracketpaste; in request_dec_mode()
875 vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?%d;%d$y", num, 0); in request_dec_mode()
879 vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?%d;%d$y", num, reply ? 1 : 2); in request_dec_mode()
884 VTermState *state = user; in on_csi() local
919 VTermPos oldpos = state->pos; in on_csi()
937 if(!is_cursor_in_scrollregion(state)) in on_csi()
940 rect.start_row = state->pos.row; in on_csi()
941 rect.end_row = state->pos.row + 1; in on_csi()
942 rect.start_col = state->pos.col; in on_csi()
943 if(state->mode.leftrightmargin) in on_csi()
944 rect.end_col = SCROLLREGION_RIGHT(state); in on_csi()
946 rect.end_col = THISROWWIDTH(state); in on_csi()
948 scroll(state, rect, 0, -count); in on_csi()
954 state->pos.row -= count; in on_csi()
955 state->at_phantom = 0; in on_csi()
960 state->pos.row += count; in on_csi()
961 state->at_phantom = 0; in on_csi()
966 state->pos.col += count; in on_csi()
967 state->at_phantom = 0; in on_csi()
972 state->pos.col -= count; in on_csi()
973 state->at_phantom = 0; in on_csi()
978 state->pos.col = 0; in on_csi()
979 state->pos.row += count; in on_csi()
980 state->at_phantom = 0; in on_csi()
985 state->pos.col = 0; in on_csi()
986 state->pos.row -= count; in on_csi()
987 state->at_phantom = 0; in on_csi()
992 state->pos.col = val-1; in on_csi()
993 state->at_phantom = 0; in on_csi()
1000 state->pos.row = row-1; in on_csi()
1001 state->pos.col = col-1; in on_csi()
1002 if(state->mode.origin) { in on_csi()
1003 state->pos.row += state->scrollregion_top; in on_csi()
1004 state->pos.col += SCROLLREGION_LEFT(state); in on_csi()
1006 state->at_phantom = 0; in on_csi()
1011 tab(state, count, +1); in on_csi()
1020 rect.start_row = state->pos.row; rect.end_row = state->pos.row + 1; in on_csi()
1021 rect.start_col = state->pos.col; rect.end_col = state->cols; in on_csi()
1023 erase(state, rect, selective); in on_csi()
1025 rect.start_row = state->pos.row + 1; rect.end_row = state->rows; in on_csi()
1028 set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF); in on_csi()
1030 erase(state, rect, selective); in on_csi()
1034 rect.start_row = 0; rect.end_row = state->pos.row; in on_csi()
1035 rect.start_col = 0; rect.end_col = state->cols; in on_csi()
1037 set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF); in on_csi()
1039 erase(state, rect, selective); in on_csi()
1041 rect.start_row = state->pos.row; rect.end_row = state->pos.row + 1; in on_csi()
1042 rect.end_col = state->pos.col + 1; in on_csi()
1044 erase(state, rect, selective); in on_csi()
1048 rect.start_row = 0; rect.end_row = state->rows; in on_csi()
1049 rect.start_col = 0; rect.end_col = state->cols; in on_csi()
1051 set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF); in on_csi()
1052 erase(state, rect, selective); in on_csi()
1060 rect.start_row = state->pos.row; in on_csi()
1061 rect.end_row = state->pos.row + 1; in on_csi()
1066 rect.start_col = state->pos.col; rect.end_col = THISROWWIDTH(state); break; in on_csi()
1068 rect.start_col = 0; rect.end_col = state->pos.col + 1; break; in on_csi()
1070 rect.start_col = 0; rect.end_col = THISROWWIDTH(state); break; in on_csi()
1076 erase(state, rect, selective); in on_csi()
1083 if(!is_cursor_in_scrollregion(state)) in on_csi()
1086 rect.start_row = state->pos.row; in on_csi()
1087 rect.end_row = SCROLLREGION_BOTTOM(state); in on_csi()
1088 rect.start_col = SCROLLREGION_LEFT(state); in on_csi()
1089 rect.end_col = SCROLLREGION_RIGHT(state); in on_csi()
1091 scroll(state, rect, -count, 0); in on_csi()
1098 if(!is_cursor_in_scrollregion(state)) in on_csi()
1101 rect.start_row = state->pos.row; in on_csi()
1102 rect.end_row = SCROLLREGION_BOTTOM(state); in on_csi()
1103 rect.start_col = SCROLLREGION_LEFT(state); in on_csi()
1104 rect.end_col = SCROLLREGION_RIGHT(state); in on_csi()
1106 scroll(state, rect, count, 0); in on_csi()
1113 if(!is_cursor_in_scrollregion(state)) in on_csi()
1116 rect.start_row = state->pos.row; in on_csi()
1117 rect.end_row = state->pos.row + 1; in on_csi()
1118 rect.start_col = state->pos.col; in on_csi()
1119 if(state->mode.leftrightmargin) in on_csi()
1120 rect.end_col = SCROLLREGION_RIGHT(state); in on_csi()
1122 rect.end_col = THISROWWIDTH(state); in on_csi()
1124 scroll(state, rect, 0, count); in on_csi()
1131 rect.start_row = state->scrollregion_top; in on_csi()
1132 rect.end_row = SCROLLREGION_BOTTOM(state); in on_csi()
1133 rect.start_col = SCROLLREGION_LEFT(state); in on_csi()
1134 rect.end_col = SCROLLREGION_RIGHT(state); in on_csi()
1136 scroll(state, rect, count, 0); in on_csi()
1143 rect.start_row = state->scrollregion_top; in on_csi()
1144 rect.end_row = SCROLLREGION_BOTTOM(state); in on_csi()
1145 rect.start_col = SCROLLREGION_LEFT(state); in on_csi()
1146 rect.end_col = SCROLLREGION_RIGHT(state); in on_csi()
1148 scroll(state, rect, -count, 0); in on_csi()
1155 rect.start_row = state->pos.row; in on_csi()
1156 rect.end_row = state->pos.row + 1; in on_csi()
1157 rect.start_col = state->pos.col; in on_csi()
1158 rect.end_col = state->pos.col + count; in on_csi()
1159 UBOUND(rect.end_col, THISROWWIDTH(state)); in on_csi()
1161 erase(state, rect, 0); in on_csi()
1166 tab(state, count, -1); in on_csi()
1171 state->pos.col = col-1; in on_csi()
1172 state->at_phantom = 0; in on_csi()
1177 state->pos.col += count; in on_csi()
1178 state->at_phantom = 0; in on_csi()
1182 const int row_width = THISROWWIDTH(state); in on_csi()
1184 col = state->pos.col + count; in on_csi()
1186 while (state->pos.col < col) { in on_csi()
1187 putglyph(state, state->combine_chars, state->combine_width, state->pos); in on_csi()
1188 state->pos.col += state->combine_width; in on_csi()
1190 if (state->pos.col + state->combine_width >= row_width) { in on_csi()
1191 if (state->mode.autowrap) { in on_csi()
1192 state->at_phantom = 1; in on_csi()
1203 vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?1;2c"); in on_csi()
1207 vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, ">%d;%d;%dc", 0, 100, 0); in on_csi()
1212 state->pos.row = row-1; in on_csi()
1213 if(state->mode.origin) in on_csi()
1214 state->pos.row += state->scrollregion_top; in on_csi()
1215 state->at_phantom = 0; in on_csi()
1220 state->pos.row += count; in on_csi()
1221 state->at_phantom = 0; in on_csi()
1228 state->pos.row = row-1; in on_csi()
1229 state->pos.col = col-1; in on_csi()
1230 if(state->mode.origin) { in on_csi()
1231 state->pos.row += state->scrollregion_top; in on_csi()
1232 state->pos.col += SCROLLREGION_LEFT(state); in on_csi()
1234 state->at_phantom = 0; in on_csi()
1242 clear_col_tabstop(state, state->pos.col); in on_csi()
1246 for(col = 0; col < state->cols; col++) in on_csi()
1247 clear_col_tabstop(state, col); in on_csi()
1261 set_mode(state, CSI_ARG(args[0]), 1); in on_csi()
1266 set_dec_mode(state, CSI_ARG(args[0]), 1); in on_csi()
1271 state->pos.col -= count; in on_csi()
1272 state->at_phantom = 0; in on_csi()
1277 state->pos.row -= count; in on_csi()
1278 state->at_phantom = 0; in on_csi()
1283 set_mode(state, CSI_ARG(args[0]), 0); in on_csi()
1288 set_dec_mode(state, CSI_ARG(args[0]), 0); in on_csi()
1292 vterm_state_setpen(state, args, argcount); in on_csi()
1307 vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s0n", qmark); in on_csi()
1310 …vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s%d;%dR", qmark, state->pos.row + 1, state->po… in on_csi()
1318 vterm_state_reset(state, 0); in on_csi()
1322 request_dec_mode(state, CSI_ARG(args[0])); in on_csi()
1330 settermprop_bool(state, VTERM_PROP_CURSORBLINK, 1); in on_csi()
1331 settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_BLOCK); in on_csi()
1334 settermprop_bool(state, VTERM_PROP_CURSORBLINK, 0); in on_csi()
1335 settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_BLOCK); in on_csi()
1338 settermprop_bool(state, VTERM_PROP_CURSORBLINK, 1); in on_csi()
1339 settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_UNDERLINE); in on_csi()
1342 settermprop_bool(state, VTERM_PROP_CURSORBLINK, 0); in on_csi()
1343 settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_UNDERLINE); in on_csi()
1346 settermprop_bool(state, VTERM_PROP_CURSORBLINK, 1); in on_csi()
1347 settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_BAR_LEFT); in on_csi()
1350 settermprop_bool(state, VTERM_PROP_CURSORBLINK, 0); in on_csi()
1351 settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_BAR_LEFT); in on_csi()
1362 state->protected_cell = 0; in on_csi()
1365 state->protected_cell = 1; in on_csi()
1372 state->scrollregion_top = CSI_ARG_OR(args[0], 1) - 1; in on_csi()
1373 … state->scrollregion_bottom = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? -1 : CSI_ARG(args[1]); in on_csi()
1374 LBOUND(state->scrollregion_top, 0); in on_csi()
1375 UBOUND(state->scrollregion_top, state->rows); in on_csi()
1376 LBOUND(state->scrollregion_bottom, -1); in on_csi()
1377 if(state->scrollregion_top == 0 && state->scrollregion_bottom == state->rows) in on_csi()
1378 state->scrollregion_bottom = -1; in on_csi()
1380 UBOUND(state->scrollregion_bottom, state->rows); in on_csi()
1382 if(SCROLLREGION_BOTTOM(state) <= state->scrollregion_top) { in on_csi()
1384 state->scrollregion_top = 0; in on_csi()
1385 state->scrollregion_bottom = -1; in on_csi()
1392 state->scrollregion_left = CSI_ARG_OR(args[0], 1) - 1; in on_csi()
1393 state->scrollregion_right = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? -1 : CSI_ARG(args[1]); in on_csi()
1394 LBOUND(state->scrollregion_left, 0); in on_csi()
1395 UBOUND(state->scrollregion_left, state->cols); in on_csi()
1396 LBOUND(state->scrollregion_right, -1); in on_csi()
1397 if(state->scrollregion_left == 0 && state->scrollregion_right == state->cols) in on_csi()
1398 state->scrollregion_right = -1; in on_csi()
1400 UBOUND(state->scrollregion_right, state->cols); in on_csi()
1402 if(state->scrollregion_right > -1 && in on_csi()
1403 state->scrollregion_right <= state->scrollregion_left) { in on_csi()
1405 state->scrollregion_left = 0; in on_csi()
1406 state->scrollregion_right = -1; in on_csi()
1414 if(!is_cursor_in_scrollregion(state)) in on_csi()
1417 rect.start_row = state->scrollregion_top; in on_csi()
1418 rect.end_row = SCROLLREGION_BOTTOM(state); in on_csi()
1419 rect.start_col = state->pos.col; in on_csi()
1420 rect.end_col = SCROLLREGION_RIGHT(state); in on_csi()
1422 scroll(state, rect, 0, -count); in on_csi()
1429 if(!is_cursor_in_scrollregion(state)) in on_csi()
1432 rect.start_row = state->scrollregion_top; in on_csi()
1433 rect.end_row = SCROLLREGION_BOTTOM(state); in on_csi()
1434 rect.start_col = state->pos.col; in on_csi()
1435 rect.end_col = SCROLLREGION_RIGHT(state); in on_csi()
1437 scroll(state, rect, 0, count); in on_csi()
1442 if(state->fallbacks && state->fallbacks->csi) in on_csi()
1443 if((*state->fallbacks->csi)(leader, args, argcount, intermed, command, state->fbdata)) in on_csi()
1449 if(state->mode.origin) { in on_csi()
1450 LBOUND(state->pos.row, state->scrollregion_top); in on_csi()
1451 UBOUND(state->pos.row, SCROLLREGION_BOTTOM(state)-1); in on_csi()
1452 LBOUND(state->pos.col, SCROLLREGION_LEFT(state)); in on_csi()
1453 UBOUND(state->pos.col, SCROLLREGION_RIGHT(state)-1); in on_csi()
1456 LBOUND(state->pos.row, 0); in on_csi()
1457 UBOUND(state->pos.row, state->rows-1); in on_csi()
1458 LBOUND(state->pos.col, 0); in on_csi()
1459 UBOUND(state->pos.col, THISROWWIDTH(state)-1); in on_csi()
1462 updatecursor(state, &oldpos, cancel_phantom); in on_csi()
1465 if(state->pos.row < 0 || state->pos.row >= state->rows || in on_csi()
1466 state->pos.col < 0 || state->pos.col >= state->cols) { in on_csi()
1468 command, state->pos.row, state->pos.col); in on_csi()
1472 if(SCROLLREGION_BOTTOM(state) <= state->scrollregion_top) { in on_csi()
1474 command, SCROLLREGION_BOTTOM(state), state->scrollregion_top); in on_csi()
1478 if(SCROLLREGION_RIGHT(state) <= SCROLLREGION_LEFT(state)) { in on_csi()
1480 command, SCROLLREGION_RIGHT(state), SCROLLREGION_LEFT(state)); in on_csi()
1490 VTermState *state = user; in on_osc() local
1496 settermprop_string(state, VTERM_PROP_ICONNAME, command + 2, cmdlen - 2); in on_osc()
1497 settermprop_string(state, VTERM_PROP_TITLE, command + 2, cmdlen - 2); in on_osc()
1501 settermprop_string(state, VTERM_PROP_ICONNAME, command + 2, cmdlen - 2); in on_osc()
1505 settermprop_string(state, VTERM_PROP_TITLE, command + 2, cmdlen - 2); in on_osc()
1508 else if(state->fallbacks && state->fallbacks->osc) in on_osc()
1509 if((*state->fallbacks->osc)(command, cmdlen, state->fbdata)) in on_osc()
1515 static void request_status_string(VTermState *state, const char *command, size_t cmdlen) in request_status_string() argument
1522 int argc = vterm_state_getpen(state, args, sizeof(args)/sizeof(args[0])); in request_status_string()
1523 vterm_push_output_sprintf_ctrl(state->vt, C1_DCS, "1$r"); in request_status_string()
1525 vterm_push_output_sprintf(state->vt, in request_status_string()
1530 vterm_push_output_sprintf(state->vt, "m"); in request_status_string()
1531 vterm_push_output_sprintf_ctrl(state->vt, C1_ST, ""); in request_status_string()
1535 …vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%dr", state->scrollregion_top+1, SCROLLREGION_BOTT… in request_status_string()
1538 …vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%ds", SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIG… in request_status_string()
1545 switch(state->mode.cursor_shape) { in request_status_string()
1550 if(state->mode.cursor_blink) in request_status_string()
1552 vterm_push_output_sprintf_dcs(state->vt, "1$r%d q", reply); in request_status_string()
1556 vterm_push_output_sprintf_dcs(state->vt, "1$r%d\"q", state->protected_cell ? 1 : 2); in request_status_string()
1561 vterm_push_output_sprintf_dcs(state->vt, "0$r%.s", (int)cmdlen, command); in request_status_string()
1566 VTermState *state = user; in on_dcs() local
1569 request_status_string(state, command+2, cmdlen-2); in on_dcs()
1572 else if(state->fallbacks && state->fallbacks->dcs) in on_dcs()
1573 if((*state->fallbacks->dcs)(command, cmdlen, state->fbdata)) in on_dcs()
1581 VTermState *state = user; in on_resize() local
1582 VTermPos oldpos = state->pos; in on_resize()
1584 if(cols != state->cols) { in on_resize()
1585 unsigned char *newtabstops = vterm_allocator_malloc(state->vt, (cols + 7) / 8); in on_resize()
1589 for(col = 0; col < state->cols && col < cols; col++) { in on_resize()
1591 if(state->tabstops[col >> 3] & mask) in on_resize()
1605 vterm_allocator_free(state->vt, state->tabstops); in on_resize()
1606 state->tabstops = newtabstops; in on_resize()
1609 if(rows != state->rows) { in on_resize()
1610 VTermLineInfo *newlineinfo = vterm_allocator_malloc(state->vt, rows * sizeof(VTermLineInfo)); in on_resize()
1613 for(row = 0; row < state->rows && row < rows; row++) { in on_resize()
1614 newlineinfo[row] = state->lineinfo[row]; in on_resize()
1623 vterm_allocator_free(state->vt, state->lineinfo); in on_resize()
1624 state->lineinfo = newlineinfo; in on_resize()
1627 state->rows = rows; in on_resize()
1628 state->cols = cols; in on_resize()
1630 if(state->scrollregion_bottom > -1) in on_resize()
1631 UBOUND(state->scrollregion_bottom, state->rows); in on_resize()
1632 if(state->scrollregion_right > -1) in on_resize()
1633 UBOUND(state->scrollregion_right, state->cols); in on_resize()
1637 if(state->callbacks && state->callbacks->resize) in on_resize()
1638 (*state->callbacks->resize)(rows, cols, &delta, state->cbdata); in on_resize()
1640 if(state->at_phantom && state->pos.col < cols-1) { in on_resize()
1641 state->at_phantom = 0; in on_resize()
1642 state->pos.col++; in on_resize()
1645 state->pos.row += delta.row; in on_resize()
1646 state->pos.col += delta.col; in on_resize()
1648 if(state->pos.row >= rows) in on_resize()
1649 state->pos.row = rows - 1; in on_resize()
1650 if(state->pos.col >= cols) in on_resize()
1651 state->pos.col = cols - 1; in on_resize()
1653 updatecursor(state, &oldpos, 1); in on_resize()
1670 if(vt->state) in vterm_obtain_state()
1671 return vt->state; in vterm_obtain_state()
1673 VTermState *state = vterm_state_new(vt); in vterm_obtain_state() local
1674 vt->state = state; in vterm_obtain_state()
1676 state->combine_chars_size = 16; in vterm_obtain_state()
1677 …state->combine_chars = vterm_allocator_malloc(state->vt, state->combine_chars_size * sizeof(state-… in vterm_obtain_state()
1679 state->tabstops = vterm_allocator_malloc(state->vt, (state->cols + 7) / 8); in vterm_obtain_state()
1681 state->lineinfo = vterm_allocator_malloc(state->vt, state->rows * sizeof(VTermLineInfo)); in vterm_obtain_state()
1683 state->encoding_utf8.enc = vterm_lookup_encoding(ENC_UTF8, 'u'); in vterm_obtain_state()
1684 if(*state->encoding_utf8.enc->init) in vterm_obtain_state()
1685 (*state->encoding_utf8.enc->init)(state->encoding_utf8.enc, state->encoding_utf8.data); in vterm_obtain_state()
1687 vterm_parser_set_callbacks(vt, &parser_callbacks, state); in vterm_obtain_state()
1689 return state; in vterm_obtain_state()
1692 void vterm_state_reset(VTermState *state, int hard) in vterm_state_reset() argument
1694 state->scrollregion_top = 0; in vterm_state_reset()
1695 state->scrollregion_bottom = -1; in vterm_state_reset()
1696 state->scrollregion_left = 0; in vterm_state_reset()
1697 state->scrollregion_right = -1; in vterm_state_reset()
1699 state->mode.keypad = 0; in vterm_state_reset()
1700 state->mode.cursor = 0; in vterm_state_reset()
1701 state->mode.autowrap = 1; in vterm_state_reset()
1702 state->mode.insert = 0; in vterm_state_reset()
1703 state->mode.newline = 0; in vterm_state_reset()
1704 state->mode.alt_screen = 0; in vterm_state_reset()
1705 state->mode.origin = 0; in vterm_state_reset()
1706 state->mode.leftrightmargin = 0; in vterm_state_reset()
1707 state->mode.bracketpaste = 0; in vterm_state_reset()
1708 state->mode.report_focus = 0; in vterm_state_reset()
1710 state->vt->mode.ctrl8bit = 0; in vterm_state_reset()
1712 for(int col = 0; col < state->cols; col++) in vterm_state_reset()
1714 set_col_tabstop(state, col); in vterm_state_reset()
1716 clear_col_tabstop(state, col); in vterm_state_reset()
1718 for(int row = 0; row < state->rows; row++) in vterm_state_reset()
1719 set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF); in vterm_state_reset()
1721 if(state->callbacks && state->callbacks->initpen) in vterm_state_reset()
1722 (*state->callbacks->initpen)(state->cbdata); in vterm_state_reset()
1724 vterm_state_resetpen(state); in vterm_state_reset()
1726 VTermEncoding *default_enc = state->vt->mode.utf8 ? in vterm_state_reset()
1731 state->encoding[i].enc = default_enc; in vterm_state_reset()
1733 (*default_enc->init)(default_enc, state->encoding[i].data); in vterm_state_reset()
1736 state->gl_set = 0; in vterm_state_reset()
1737 state->gr_set = 1; in vterm_state_reset()
1738 state->gsingle_set = 0; in vterm_state_reset()
1740 state->protected_cell = 0; in vterm_state_reset()
1743 settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, 1); in vterm_state_reset()
1744 settermprop_bool(state, VTERM_PROP_CURSORBLINK, 1); in vterm_state_reset()
1745 settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_BLOCK); in vterm_state_reset()
1748 state->pos.row = 0; in vterm_state_reset()
1749 state->pos.col = 0; in vterm_state_reset()
1750 state->at_phantom = 0; in vterm_state_reset()
1752 VTermRect rect = { 0, state->rows, 0, state->cols }; in vterm_state_reset()
1753 erase(state, rect, 0); in vterm_state_reset()
1757 void vterm_state_get_cursorpos(const VTermState *state, VTermPos *cursorpos) in vterm_state_get_cursorpos() argument
1759 *cursorpos = state->pos; in vterm_state_get_cursorpos()
1762 void vterm_state_set_callbacks(VTermState *state, const VTermStateCallbacks *callbacks, void *user) in vterm_state_set_callbacks() argument
1765 state->callbacks = callbacks; in vterm_state_set_callbacks()
1766 state->cbdata = user; in vterm_state_set_callbacks()
1768 if(state->callbacks && state->callbacks->initpen) in vterm_state_set_callbacks()
1769 (*state->callbacks->initpen)(state->cbdata); in vterm_state_set_callbacks()
1772 state->callbacks = NULL; in vterm_state_set_callbacks()
1773 state->cbdata = NULL; in vterm_state_set_callbacks()
1777 void *vterm_state_get_cbdata(VTermState *state) in vterm_state_get_cbdata() argument
1779 return state->cbdata; in vterm_state_get_cbdata()
1782 void vterm_state_set_unrecognised_fallbacks(VTermState *state, const VTermParserCallbacks *fallback… in vterm_state_set_unrecognised_fallbacks() argument
1785 state->fallbacks = fallbacks; in vterm_state_set_unrecognised_fallbacks()
1786 state->fbdata = user; in vterm_state_set_unrecognised_fallbacks()
1789 state->fallbacks = NULL; in vterm_state_set_unrecognised_fallbacks()
1790 state->fbdata = NULL; in vterm_state_set_unrecognised_fallbacks()
1794 void *vterm_state_get_unrecognised_fbdata(VTermState *state) in vterm_state_get_unrecognised_fbdata() argument
1796 return state->fbdata; in vterm_state_get_unrecognised_fbdata()
1799 int vterm_state_set_termprop(VTermState *state, VTermProp prop, VTermValue *val) in vterm_state_set_termprop() argument
1803 if(state->callbacks && state->callbacks->settermprop) in vterm_state_set_termprop()
1804 if(!(*state->callbacks->settermprop)(prop, val, state->cbdata)) in vterm_state_set_termprop()
1813 state->mode.cursor_visible = val->boolean; in vterm_state_set_termprop()
1816 state->mode.cursor_blink = val->boolean; in vterm_state_set_termprop()
1819 state->mode.cursor_shape = val->number; in vterm_state_set_termprop()
1822 state->mode.screen = val->boolean; in vterm_state_set_termprop()
1825 state->mode.alt_screen = val->boolean; in vterm_state_set_termprop()
1826 if(state->mode.alt_screen) { in vterm_state_set_termprop()
1830 .end_row = state->rows, in vterm_state_set_termprop()
1831 .end_col = state->cols, in vterm_state_set_termprop()
1833 erase(state, rect, 0); in vterm_state_set_termprop()
1837 state->mouse_flags = 0; in vterm_state_set_termprop()
1839 state->mouse_flags |= MOUSE_WANT_CLICK; in vterm_state_set_termprop()
1841 state->mouse_flags |= MOUSE_WANT_DRAG; in vterm_state_set_termprop()
1843 state->mouse_flags |= MOUSE_WANT_MOVE; in vterm_state_set_termprop()
1853 void vterm_state_focus_in(VTermState *state) in vterm_state_focus_in() argument
1855 if(state->mode.report_focus) in vterm_state_focus_in()
1856 vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "I"); in vterm_state_focus_in()
1859 void vterm_state_focus_out(VTermState *state) in vterm_state_focus_out() argument
1861 if(state->mode.report_focus) in vterm_state_focus_out()
1862 vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "O"); in vterm_state_focus_out()
1865 const VTermLineInfo *vterm_state_get_lineinfo(const VTermState *state, int row) in vterm_state_get_lineinfo() argument
1867 return state->lineinfo + row; in vterm_state_get_lineinfo()