From fae8ed1fc8c06b28528d726e8440dfc66852bca8 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 12 Dec 2017 22:29:30 +0100 Subject: [PATCH] patch 8.0.1388: char not overwritten with ambiguous width char Problem: Char not overwritten with ambiguous width char, if the ambiguous char is single width but we reserve double-width space. Solution: First clear the screen cells. (Ozaki Kiichi, closes #2436) --- src/screen.c | 24 +++++++++++++++++++----- src/version.c | 2 ++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/screen.c b/src/screen.c index a74f750711..090a4b3dd6 100644 --- a/src/screen.c +++ b/src/screen.c @@ -8317,15 +8317,29 @@ screen_char(unsigned off, int row, int col) { char_u buf[MB_MAXBYTES + 1]; - /* Convert UTF-8 character to bytes and write it. */ - - buf[utfc_char2bytes(off, buf)] = NUL; - - out_str(buf); if (utf_ambiguous_width(ScreenLinesUC[off])) + { + if (*p_ambw == 'd' +# ifdef FEAT_GUI + && !gui.in_use +# endif + ) + { + /* Clear the two screen cells. If the character is actually + * single width it won't change the second cell. */ + out_str((char_u *)" "); + term_windgoto(row, col); + } + /* not sure where the cursor is after drawing the ambiguous width + * character */ screen_cur_col = 9999; + } else if (utf_char2cells(ScreenLinesUC[off]) > 1) ++screen_cur_col; + + /* Convert the UTF-8 character to bytes and write it. */ + buf[utfc_char2bytes(off, buf)] = NUL; + out_str(buf); } else #endif diff --git a/src/version.c b/src/version.c index 2f9957af8d..b805fd7c0b 100644 --- a/src/version.c +++ b/src/version.c @@ -771,6 +771,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1388, /**/ 1387, /**/