9#define UNICODE_SPACE 0x20
10#define UNICODE_LINEFEED 0x0a
95 for(
int row = 0; row <
rows; row++) {
96 for(
int col = 0; col <
cols; col++) {
189 for(
int col = 1; col <
info->width; col++)
194 .end_row = pos.
row+1,
195 .start_col = pos.
col,
196 .end_col = pos.
col+
info->width,
225 for(
int row = 0; row < src.
start_row; row++)
232 int init_row, test_row, inc_row;
244 for(
int row = init_row; row != test_row; row += inc_row)
500 while(col >= 0 && buffer[row *
cols + col].chars[0] == 0)
505#define REFLOW (screen->reflow)
518 int old_row = old_rows - 1;
519 int new_row = new_rows - 1;
525 fprintf(stderr,
"Resizing from %dx%d to %dx%d; cursor was at (%d,%d)\n",
526 old_cols, old_rows, new_cols, new_rows, old_cursor.
col, old_cursor.
row);
532 int final_blank_row = new_rows;
534 while(old_row >= 0) {
535 int old_row_end = old_row;
537 while(
REFLOW && old_lineinfo && old_row >= 0 && old_lineinfo[old_row].continuation)
539 int old_row_start = old_row;
542 for(
int row = old_row_start; row <= old_row_end; row++) {
543 if(
REFLOW && row < (old_rows - 1) && old_lineinfo[row + 1].continuation)
549 if(final_blank_row == (new_row + 1) &&
width == 0)
550 final_blank_row = new_row;
553 ?
width ? (
width + new_cols - 1) / new_cols : 1
556 int new_row_end = new_row;
557 int new_row_start = new_row - new_height + 1;
559 old_row = old_row_start;
562 int spare_rows = new_rows - final_blank_row;
564 if(new_row_start < 0 &&
566 (!active || new_cursor.
row == -1 || (new_cursor.
row - new_row_start) < new_rows))
571 int downwards = -new_row_start;
572 if(downwards > spare_rows)
573 downwards = spare_rows;
574 int rowcount = new_rows - downwards;
577 fprintf(stderr,
" scroll %d rows +%d downwards\n", rowcount, downwards);
580 memmove(&new_buffer[downwards * new_cols], &new_buffer[0], rowcount * new_cols *
sizeof(
ScreenCell));
581 memmove(&new_lineinfo[downwards], &new_lineinfo[0], rowcount *
sizeof(new_lineinfo[0]));
583 new_row += downwards;
584 new_row_start += downwards;
585 new_row_end += downwards;
587 if(new_cursor.
row >= 0)
588 new_cursor.
row += downwards;
590 final_blank_row += downwards;
594 fprintf(stderr,
" rows [%d..%d] <- [%d..%d] width=%d\n",
595 new_row_start, new_row_end, old_row_start, old_row_end,
width);
598 if(new_row_start < 0) {
599 if(old_row_start <= old_cursor.
row && old_cursor.
row < old_row_end) {
601 new_cursor.
col = old_cursor.
col;
602 if(new_cursor.
col >= new_cols)
603 new_cursor.
col = new_cols-1;
608 for(new_row = new_row_start, old_row = old_row_start; new_row <= new_row_end; new_row++) {
609 int count =
width >= new_cols ? new_cols :
width;
616 new_buffer[new_row * new_cols + new_col] = old_buffer[old_row * old_cols + old_col];
618 if(old_cursor.
row == old_row && old_cursor.
col == old_col)
619 new_cursor.
row = new_row, new_cursor.
col = new_col;
622 if(old_col == old_cols) {
636 if(old_cursor.
row == old_row && old_cursor.
col >= old_col) {
637 new_cursor.
row = new_row, new_cursor.
col = (old_cursor.
col - old_col + new_col);
638 if(new_cursor.
col >= new_cols)
639 new_cursor.
col = new_cols-1;
642 while(new_col < new_cols) {
647 new_lineinfo[new_row].
continuation = (new_row > new_row_start);
650 old_row = old_row_start - 1;
651 new_row = new_row_start - 1;
654 if(old_cursor.
row <= old_row) {
657 new_cursor.
row = 0, new_cursor.
col = old_cursor.
col;
658 if(new_cursor.
col >= new_cols)
659 new_cursor.
col = new_cols-1;
663 if(active && (new_cursor.
row == -1 || new_cursor.
col == -1)) {
664 fprintf(stderr,
"screen_resize failed to update cursor position\n");
671 for(
int row = 0; row <= old_row; row++)
674 statefields->
pos.
row -= (old_row + 1);
679 while(new_row >= 0) {
708 if(src->
width == 2 && pos.
col < (new_cols-1))
709 (dst + 1)->chars[0] = (
uint32_t) -1;
711 for( ; pos.
col < new_cols; pos.
col++)
721 int moverows = new_rows - new_row - 1;
722 memmove(&new_buffer[0], &new_buffer[(new_row + 1) * new_cols], moverows * new_cols *
sizeof(
ScreenCell));
723 memmove(&new_lineinfo[0], &new_lineinfo[new_row + 1], moverows *
sizeof(new_lineinfo[0]));
725 new_cursor.
row -= (new_row + 1);
727 for(new_row = moverows; new_row < new_rows; new_row++) {
728 for(
int col = 0; col < new_cols; col++)
738 statefields->
lineinfos[bufidx] = new_lineinfo;
741 statefields->
pos = new_cursor;
755 if(new_cols > old_cols) {
766 else if(new_rows != old_rows) {
772 for(
int row = 0; row < new_rows; row++)
783 if(new_cols <= old_cols) {
917 size_t thislen = utf8_seqlen(c); \
918 if(buffer && outpos + thislen <= len) \
919 outpos += fill_utf8((c), (char *)buffer + outpos); \
924 if(buffer && outpos + 1 <= len) \
925 ((uint32_t*)buffer)[outpos++] = (c); \
934 if(cell->
chars[0] == 0)
979 if(!intcell->
chars[i])
1014 if(cell->
chars[0] != 0)
1037#undef vterm_screen_set_reflow
1142 for(col = pos.
col - 1; col >= extent->
start_col; col--)
1147 for(col = pos.
col + 1; col < extent->
end_col; col++)
1162 for(
int row = 0; row <=
screen->
rows - 1; row++)
1163 for(
int col = 0; col <=
screen->
cols - 1; col++) {
static VTermScreen * screen
static VTermState * state
static VTermStateFallbacks fallbacks
void * memmove(void *dest, const void *source, size_t size)
uint16_t size
Size of the loaded file.
static int rect_equal(VTermRect *a, VTermRect *b)
static void rect_clip(VTermRect *dst, VTermRect *bounds)
static void rect_expand(VTermRect *dst, VTermRect *src)
static int rect_contains(VTermRect *big, VTermRect *small)
static int rect_intersects(VTermRect *a, VTermRect *b)
static ScreenCell * getcell(const VTermScreen *screen, int row, int col)
static int scrollrect(VTermRect rect, int downward, int rightward, void *user)
static VTermScreen * screen_new(VTerm *vt)
void vterm_screen_enable_reflow(VTermScreen *screen, bool reflow)
void vterm_screen_flush_damage(VTermScreen *screen)
unsigned int global_reverse
static int attrs_differ(VTermAttrMask attrs, ScreenCell *a, ScreenCell *b)
static void reset_default_colours(VTermScreen *screen, ScreenCell *buffer)
void vterm_screen_set_default_colors(VTermScreen *screen, const VTermColor *default_fg, const VTermColor *default_bg)
static int moverect_user(VTermRect dest, VTermRect src, void *user)
void * vterm_screen_get_cbdata(VTermScreen *screen)
VTermScreenCell * sb_buffer
void vterm_screen_reset(VTermScreen *screen, int hard)
static void resize_buffer(VTermScreen *screen, int bufidx, int new_rows, int new_cols, bool active, VTermStateFields *statefields)
static int moverect_internal(VTermRect dest, VTermRect src, void *user)
size_t vterm_screen_get_chars(const VTermScreen *screen, uint32_t *chars, size_t len, const VTermRect rect)
void vterm_screen_convert_color_to_rgb(const VTermScreen *screen, VTermColor *col)
static ScreenCell * alloc_buffer(VTermScreen *screen, int rows, int cols)
static int sb_clear(void *user)
void vterm_screen_set_unrecognised_fallbacks(VTermScreen *screen, const VTermStateFallbacks *fallbacks, void *user)
INTERNAL void vterm_screen_free(VTermScreen *screen)
static int erase(VTermRect rect, int selective, void *user)
static size_t _get_chars(const VTermScreen *screen, const int utf8, void *buffer, size_t len, const VTermRect rect)
static void damagescreen(VTermScreen *screen)
int vterm_screen_is_eol(const VTermScreen *screen, VTermPos pos)
static void sb_pushline_from_row(VTermScreen *screen, int row)
static void clearcell(const VTermScreen *screen, ScreenCell *cell)
static int movecursor(VTermPos pos, VTermPos oldpos, int visible, void *user)
int vterm_screen_get_cell(const VTermScreen *screen, VTermPos pos, VTermScreenCell *cell)
static int setlineinfo(int row, const VTermLineInfo *newinfo, const VTermLineInfo *oldinfo, void *user)
int pending_scroll_downward
unsigned int protected_cell
uint32_t chars[VTERM_MAX_CHARS_PER_CELL]
static int bell(void *user)
size_t vterm_screen_get_text(const VTermScreen *screen, char *str, size_t len, const VTermRect rect)
void vterm_screen_set_callbacks(VTermScreen *screen, const VTermScreenCallbacks *callbacks, void *user)
static VTermStateCallbacks state_cbs
VTermDamageSize damage_merge
static int erase_internal(VTermRect rect, int selective, void *user)
static void damagerect(VTermScreen *screen, VTermRect rect)
static int settermprop(VTermProp prop, VTermValue *val, void *user)
VTermScreen * vterm_obtain_screen(VTerm *vt)
void vterm_screen_enable_altscreen(VTermScreen *screen, int altscreen)
static int line_popcount(ScreenCell *buffer, int row, int rows, int cols)
static int putglyph(VTermGlyphInfo *info, VTermPos pos, void *user)
static int erase_user(VTermRect rect, int selective, void *user)
static int resize(int new_rows, int new_cols, VTermStateFields *fields, void *user)
int pending_scroll_rightward
int vterm_screen_get_attrs_extent(const VTermScreen *screen, VTermRect *extent, VTermPos pos, VTermAttrMask attrs)
const VTermScreenCallbacks * callbacks
void * vterm_screen_get_unrecognised_fbdata(VTermScreen *screen)
static int setpenattr(VTermAttr attr, VTermValue *val, void *user)
VTermRect pending_scrollrect
void vterm_screen_set_damage_merge(VTermScreen *screen, VTermDamageSize size)
int(* moverect)(VTermRect dest, VTermRect src, void *user)
int(* damage)(VTermRect rect, void *user)
int(* movecursor)(VTermPos pos, VTermPos oldpos, int visible, void *user)
int(* sb_popline)(int cols, VTermScreenCell *cells, void *user)
int(* resize)(int rows, int cols, void *user)
int(* settermprop)(VTermProp prop, VTermValue *val, void *user)
int(* sb_pushline)(int cols, const VTermScreenCell *cells, void *user)
int(* sb_clear)(void *user)
int(* putglyph)(VTermGlyphInfo *info, VTermPos pos, void *user)
INTERNAL void * vterm_allocator_malloc(VTerm *vt, size_t size)
INTERNAL void vterm_allocator_free(VTerm *vt, void *ptr)
#define VTERM_MAX_CHARS_PER_CELL
static void vterm_rect_move(VTermRect *rect, int row_delta, int col_delta)
void vterm_state_set_callbacks(VTermState *state, const VTermStateCallbacks *callbacks, void *user)
@ VTERM_ATTR_UNDERLINE_MASK
@ VTERM_ATTR_CONCEAL_MASK
@ VTERM_ATTR_FOREGROUND_MASK
@ VTERM_ATTR_BASELINE_MASK
@ VTERM_ATTR_REVERSE_MASK
@ VTERM_ATTR_BACKGROUND_MASK
VTermLineInfo * lineinfos[2]
unsigned int doubleheight
void * vterm_state_get_unrecognised_fbdata(VTermState *state)
void vterm_state_reset(VTermState *state, int hard)
uint32_t chars[VTERM_MAX_CHARS_PER_CELL]
#define VTERM_COLOR_IS_DEFAULT_FG(col)
void vterm_scroll_rect(VTermRect rect, int downward, int rightward, int(*moverect)(VTermRect src, VTermRect dest, void *user), int(*eraserect)(VTermRect rect, int selective, void *user), void *user)
unsigned int continuation
void vterm_state_convert_color_to_rgb(const VTermState *state, VTermColor *col)
void vterm_state_set_default_colors(VTermState *state, const VTermColor *default_fg, const VTermColor *default_bg)
const VTermLineInfo * vterm_state_get_lineinfo(const VTermState *state, int row)
VTermScreenCellAttrs attrs
void vterm_get_size(const VTerm *vt, int *rowsp, int *colsp)
VTermState * vterm_obtain_state(VTerm *vt)
#define VTERM_COLOR_IS_DEFAULT_BG(col)
void vterm_state_set_unrecognised_fallbacks(VTermState *state, const VTermStateFallbacks *fallbacks, void *user)
#define vterm_screen_set_reflow
int vterm_color_is_equal(const VTermColor *a, const VTermColor *b)