summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-02-08 21:29:48 +0100
committerBram Moolenaar <Bram@vim.org>2021-02-08 21:29:48 +0100
commit4549dad874244fe933b969e4ac0b41923ee70dc3 (patch)
treef8a016a4e385e8b4aa0c5c78faee169b267db343
parentba98fb54aefada4c36390add4c7dd90b93e7e5bb (diff)
patch 8.2.2487: terminal shows garbage after double-wide characterv8.2.2487
Problem: Terminal shows garbage after double-wide character with a combining character. (Kyoichiro Yamada) Solution: Libvterm: do not add the width of the combining character to the glyph width. (closes #7801)
-rw-r--r--src/libvterm/src/state.c3
-rw-r--r--src/testdir/dumps/Test_terminal_combining.dump9
-rw-r--r--src/testdir/test_terminal.vim35
-rw-r--r--src/version.c2
4 files changed, 43 insertions, 6 deletions
diff --git a/src/libvterm/src/state.c b/src/libvterm/src/state.c
index 390aa8dce4..afb188c7e2 100644
--- a/src/libvterm/src/state.c
+++ b/src/libvterm/src/state.c
@@ -384,7 +384,8 @@ static int on_text(const char bytes[], size_t len, void *user)
abort();
}
#endif
- width += this_width;
+ if (i == glyph_starts || this_width > width)
+ width = this_width;
}
chars[glyph_ends - glyph_starts] = 0;
diff --git a/src/testdir/dumps/Test_terminal_combining.dump b/src/testdir/dumps/Test_terminal_combining.dump
new file mode 100644
index 0000000000..390da0a3c3
--- /dev/null
+++ b/src/testdir/dumps/Test_terminal_combining.dump
@@ -0,0 +1,9 @@
+>ポ*0&#ffffff0| +&@72
+|~+0#4040ff13&| @73
+|~| @73
+|!+2#ffffff16#00e0003|/|b|i|n|/|s|h| |[|f|i|n|i|s|h|e|d|]| @37|1|,|1| @11|A|l@1
+| +0#0000000#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1
+| +0&&@74
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 8d47c0886c..90241710ec 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -965,7 +965,7 @@ func Test_terminal_composing_unicode()
call assert_equal("b", l[1].chars)
call assert_equal("c", l[2].chars)
- " multibyte + composing
+ " multibyte + composing: がぎぐげご
let txt = "\u304b\u3099\u304e\u304f\u3099\u3052\u3053\u3099"
call term_sendkeys(buf, "echo " . txt)
call TermWait(buf, 25)
@@ -974,10 +974,15 @@ func Test_terminal_composing_unicode()
call WaitForAssert({-> assert_equal(txt, term_getline(buf, lnum[1] + 1))}, 1000)
let l = term_scrape(buf, lnum[1] + 1)
call assert_equal("\u304b\u3099", l[0].chars)
- call assert_equal("\u304e", l[2].chars)
- call assert_equal("\u304f\u3099", l[3].chars)
- call assert_equal("\u3052", l[5].chars)
- call assert_equal("\u3053\u3099", l[6].chars)
+ call assert_equal(2, l[0].width)
+ call assert_equal("\u304e", l[1].chars)
+ call assert_equal(2, l[1].width)
+ call assert_equal("\u304f\u3099", l[2].chars)
+ call assert_equal(2, l[2].width)
+ call assert_equal("\u3052", l[3].chars)
+ call assert_equal(2, l[3].width)
+ call assert_equal("\u3053\u3099", l[4].chars)
+ call assert_equal(2, l[4].width)
" \u00a0 + composing
let txt = "abc\u00a0\u0308"
@@ -1244,6 +1249,26 @@ func Test_open_term_from_cmd()
call delete('Xopenterm')
endfunc
+func Test_combining_double_width()
+ CheckUnix
+ CheckRunVimInTerminal
+
+ call writefile(["\xe3\x83\x9b\xe3\x82\x9a"], 'Xonedouble')
+ let lines =<< trim END
+ call term_start(['/bin/sh', '-c', 'cat Xonedouble'])
+ END
+ call writefile(lines, 'Xcombining')
+ let buf = RunVimInTerminal('-S Xcombining', #{rows: 9})
+
+ " this opens a window, incsearch should not use the old cursor position
+ call VerifyScreenDump(buf, 'Test_terminal_combining', {})
+ call term_sendkeys(buf, ":q\<CR>")
+
+ call StopVimInTerminal(buf)
+ call delete('Xonedouble')
+ call delete('Xcombining')
+endfunc
+
func Test_terminal_popup_with_cmd()
" this was crashing
let buf = term_start(&shell, #{hidden: v:true})
diff --git a/src/version.c b/src/version.c
index e203038df7..d07c0e3eec 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2487,
+/**/
2486,
/**/
2485,