Mercurial > vim
diff src/libvterm/src/screen.c @ 30876:2d2758ffd959 v9.0.0772
patch 9.0.0772: the libvterm code is outdated
Commit: https://github.com/vim/vim/commit/501e77766cd30d8f4bfeb04a67aff1865b5f5a41
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Oct 16 14:35:46 2022 +0100
patch 9.0.0772: the libvterm code is outdated
Problem: The libvterm code is outdated.
Solution: Include libvterm changes from revision 790 to 801.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 16 Oct 2022 15:45:04 +0200 |
parents | 66618893eb2a |
children | 82336c3b679d |
line wrap: on
line diff
--- a/src/libvterm/src/screen.c +++ b/src/libvterm/src/screen.c @@ -502,7 +502,10 @@ static void resize_buffer(VTermScreen *s int old_cols = screen->cols; ScreenCell *old_buffer = screen->buffers[bufidx]; + VTermLineInfo *old_lineinfo = statefields->lineinfos[bufidx]; + ScreenCell *new_buffer = vterm_allocator_malloc(screen->vt, sizeof(ScreenCell) * new_rows * new_cols); + VTermLineInfo *new_lineinfo = vterm_allocator_malloc(screen->vt, sizeof(new_lineinfo[0]) * new_rows); // Find the final row of old buffer content int old_row = old_rows - 1; @@ -515,6 +518,8 @@ static void resize_buffer(VTermScreen *s for( ; col < new_cols; col++) clearcell(screen, &new_buffer[new_row * new_cols + col]); + new_lineinfo[new_row] = old_lineinfo[old_row]; + old_row--; new_row--; @@ -584,15 +589,21 @@ static void resize_buffer(VTermScreen *s /* Scroll new rows back up to the top and fill in blanks at the bottom */ int moverows = new_rows - new_row - 1; memmove(&new_buffer[0], &new_buffer[(new_row + 1) * new_cols], moverows * new_cols * sizeof(ScreenCell)); + memmove(&new_lineinfo[0], &new_lineinfo[new_row + 1], moverows * sizeof(new_lineinfo[0])); - for(new_row = moverows; new_row < new_rows; new_row++) + for(new_row = moverows; new_row < new_rows; new_row++) { for(col = 0; col < new_cols; col++) clearcell(screen, &new_buffer[new_row * new_cols + col]); + new_lineinfo[new_row] = (VTermLineInfo){ 0 }; + } } vterm_allocator_free(screen->vt, old_buffer); screen->buffers[bufidx] = new_buffer; + vterm_allocator_free(screen->vt, old_lineinfo); + statefields->lineinfos[bufidx] = new_lineinfo; + return; /* REFLOW TODO: @@ -606,6 +617,7 @@ static int resize(int new_rows, int new_ int altscreen_active = (screen->buffers[BUFIDX_ALTSCREEN] && screen->buffer == screen->buffers[BUFIDX_ALTSCREEN]); + int old_rows = screen->rows; int old_cols = screen->cols; if(new_cols > old_cols) { @@ -619,6 +631,17 @@ static int resize(int new_rows, int new_ resize_buffer(screen, 0, new_rows, new_cols, !altscreen_active, fields); if(screen->buffers[BUFIDX_ALTSCREEN]) resize_buffer(screen, 1, new_rows, new_cols, altscreen_active, fields); + else if(new_rows != old_rows) { + /* We don't need a full resize of the altscreen because it isn't enabled + * but we should at least keep the lineinfo the right size */ + vterm_allocator_free(screen->vt, fields->lineinfos[BUFIDX_ALTSCREEN]); + + VTermLineInfo *new_lineinfo = vterm_allocator_malloc(screen->vt, sizeof(new_lineinfo[0]) * new_rows); + for(int row = 0; row < new_rows; row++) + new_lineinfo[row] = (VTermLineInfo){ 0 }; + + fields->lineinfos[BUFIDX_ALTSCREEN] = new_lineinfo; + } screen->buffer = altscreen_active ? screen->buffers[BUFIDX_ALTSCREEN] : screen->buffers[BUFIDX_PRIMARY];