diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-07-29 14:52:43 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-07-29 14:52:43 +0200 |
commit | 696d00f488dc0599692993f226a7dd95a187920d (patch) | |
tree | effc0a3cb5cff7eac863a1151329dbd72f358243 | |
parent | dcbfa33fa169b9358908aafe9e7e54faaef1c0fa (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.c | 40 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |