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];