]> granicus.if.org Git - vim/commitdiff
patch 8.0.0800 v8.0.0800
authorBram Moolenaar <Bram@vim.org>
Sat, 29 Jul 2017 12:52:43 +0000 (14:52 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 29 Jul 2017 12:52:43 +0000 (14:52 +0200)
Problem:    Terminal window scrollback contents is wrong.
Solution:   Fix handling of multi-byte characters (Yasuhiro Matsumoto) Handle
            empty lines correctly. (closes #1891)

src/terminal.c
src/version.c

index 9e14b4327ca2ce069e74dab6c00537c2793e2516..b68081f314aadbaf87c25198141463d94c02134d 100644 (file)
@@ -765,26 +765,26 @@ handle_pushline(int cols, const VTermScreenCell *cells, void *user)
     /* TODO: put the text in the buffer. */
     if (ga_grow(&term->tl_scrollback, 1) == OK)
     {
-       VTermScreenCell *p;
-       int len;
-       int i;
+       VTermScreenCell *p = NULL;
+       int             len = 0;
+       int             i;
+       sb_line_T       *line;
 
        /* do not store empty cells at the end */
        for (i = 0; i < cols; ++i)
            if (cells[i].chars[0] != 0)
                len = i + 1;
 
-       p = (VTermScreenCell *)alloc((int)sizeof(VTermScreenCell) * len);
+       if (len > 0)
+           p = (VTermScreenCell *)alloc((int)sizeof(VTermScreenCell) * len);
        if (p != NULL)
-       {
-           sb_line_T *line = (sb_line_T *)term->tl_scrollback.ga_data
-                                                 + term->tl_scrollback.ga_len;
-
            mch_memmove(p, cells, sizeof(VTermScreenCell) * len);
-           line->sb_cols = len;
-           line->sb_cells = p;
-           ++term->tl_scrollback.ga_len;
-       }
+
+       line = (sb_line_T *)term->tl_scrollback.ga_data
+                                                 + term->tl_scrollback.ga_len;
+       line->sb_cols = len;
+       line->sb_cells = p;
+       ++term->tl_scrollback.ga_len;
     }
     return 0; /* ignored */
 }
@@ -818,7 +818,9 @@ move_scrollback_to_buffer(term_T *term)
                                                       && cell.chars[0] != NUL)
                len = pos.col + 1;
 
-       if (len > 0)
+       if (len == 0)
+           ++lines_skipped;
+       else
        {
            while (lines_skipped > 0)
            {
@@ -865,13 +867,15 @@ move_scrollback_to_buffer(term_T *term)
 
        ga.ga_len = 0;
        for (col = 0; col < line->sb_cols; ++col)
-           for (i = 0; (c = line->sb_cells[col].chars[i]) != 0 || i == 0; ++i)
-           {
-               if (ga_grow(&ga, MB_MAXBYTES) == FAIL)
-                   goto failed;
+       {
+           if (ga_grow(&ga, MB_MAXBYTES) == FAIL)
+               goto failed;
+           for (i = 0; (c = line->sb_cells[col].chars[i]) > 0 || i == 0; ++i)
                ga.ga_len += mb_char2bytes(c == NUL ? ' ' : c,
                                             (char_u *)ga.ga_data + ga.ga_len);
-           }
+       }
+       if (ga_grow(&ga, 1) == FAIL)
+           goto failed;
        *((char_u *)ga.ga_data + ga.ga_len) = NUL;
        ml_append_buf(term->tl_buffer, lnum, ga.ga_data, ga.ga_len + 1, FALSE);
     }
index d4926a8d0106ed93dd63eed0d646023a3efc3bd8..a44e5505b9971715089ec26067584d295cce4b3a 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    800,
 /**/
     799,
 /**/