summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-07-29 14:52:43 +0200
committerBram Moolenaar <Bram@vim.org>2017-07-29 14:52:43 +0200
commit696d00f488dc0599692993f226a7dd95a187920d (patch)
treeeffc0a3cb5cff7eac863a1151329dbd72f358243
parentdcbfa33fa169b9358908aafe9e7e54faaef1c0fa (diff)
patch 8.0.0800v8.0.0800
Problem: Terminal window scrollback contents is wrong. Solution: Fix handling of multi-byte characters (Yasuhiro Matsumoto) Handle empty lines correctly. (closes #1891)
-rw-r--r--src/terminal.c40
-rw-r--r--src/version.c2
2 files changed, 24 insertions, 18 deletions
diff --git a/src/terminal.c b/src/terminal.c
index 9e14b4327c..b68081f314 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -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);
}
diff --git a/src/version.c b/src/version.c
index d4926a8d01..a44e5505b9 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 800,
+/**/
799,
/**/
798,