summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormikoto2000 <mikoto2000@gmail.com>2024-04-17 22:06:54 +0200
committerChristian Brabandt <cb@256bit.org>2024-04-17 22:06:54 +0200
commite20fa59903525e15cecd680a2f32ece8a5d1bc0c (patch)
tree3d98c187460597c6d76c28b16faab77723425213
parentacdfb8a97995e0f81832207e39564ba795281108 (diff)
patch 9.1.0344: Cursor wrong after using setcellwidth() in terminalv9.1.0344
Problem: Cursor wrong after using setcellwidth() in terminal (mikoto2000) Solution: output additional spaces, so the behaviour matches the GUI (mikoto2000) fixes: #14539 closes: #14540 Signed-off-by: mikoto2000 <mikoto2000@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org> Fix CUI `setcellwidths` characters draw behavior to same GUI behavior.
-rw-r--r--src/mbyte.c14
-rw-r--r--src/proto/mbyte.pro1
-rw-r--r--src/screen.c19
-rw-r--r--src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_1.dump6
-rw-r--r--src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_2.dump6
-rw-r--r--src/testdir/test_utf8.vim24
-rw-r--r--src/version.c2
7 files changed, 69 insertions, 3 deletions
diff --git a/src/mbyte.c b/src/mbyte.c
index 406d1093ff..07446ca561 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -5542,6 +5542,20 @@ string_convert_ext(
return retval;
}
+/*
+ * Return 1 or 2 when "c" is in the cellwidth table.
+ * Return 0 if not.
+ */
+ int
+get_cellwidth(int c UNUSED)
+{
+#ifdef FEAT_EVAL
+ return cw_value(c);
+#else
+ return 0;
+#endif
+}
+
#if defined(FEAT_EVAL) || defined(PROTO)
/*
diff --git a/src/proto/mbyte.pro b/src/proto/mbyte.pro
index 7883b3b4c7..c57c94c8ae 100644
--- a/src/proto/mbyte.pro
+++ b/src/proto/mbyte.pro
@@ -85,6 +85,7 @@ int convert_input(char_u *ptr, int len, int maxlen);
int convert_input_safe(char_u *ptr, int len, int maxlen, char_u **restp, int *restlenp);
char_u *string_convert(vimconv_T *vcp, char_u *ptr, int *lenp);
char_u *string_convert_ext(vimconv_T *vcp, char_u *ptr, int *lenp, int *unconvlenp);
+int get_cellwidth(int c);
void f_setcellwidths(typval_T *argvars, typval_T *rettv);
void f_getcellwidths(typval_T *argvars, typval_T *rettv);
void f_charclass(typval_T *argvars, typval_T *rettv);
diff --git a/src/screen.c b/src/screen.c
index 71ddbcaab2..a8b4559b11 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -1981,7 +1981,24 @@ screen_char(unsigned off, int row, int col)
{
char_u buf[MB_MAXBYTES + 1];
- if (utf_ambiguous_width(ScreenLinesUC[off]))
+ if (get_cellwidth(ScreenLinesUC[off]) > 1)
+ {
+ // If the width is set to 2 with `setcellwidths`
+
+#ifdef FEAT_GUI
+ if (!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);
+ screen_cur_col = 9999;
+#ifdef FEAT_GUI
+ }
+#endif
+ }
+ else if (utf_ambiguous_width(ScreenLinesUC[off]))
{
if (*p_ambw == 'd'
#ifdef FEAT_GUI
diff --git a/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_1.dump b/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_1.dump
new file mode 100644
index 0000000000..73f4418126
--- /dev/null
+++ b/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_1.dump
@@ -0,0 +1,6 @@
+>➜+0&#ffffff0@49
+@10| @39
+|➜@49
+@10| @39
+|~+0#4040ff13&| @48
+| +0#0000000&@31|1|,|1| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_2.dump b/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_2.dump
new file mode 100644
index 0000000000..2b575f6b39
--- /dev/null
+++ b/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_2.dump
@@ -0,0 +1,6 @@
+>➜+0&#ffffff0| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜|
+|➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜|
+|➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| @30
+|➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜|
+|@+0#4040ff13&@2| @46
+| +0#0000000&@31|1|,|1| @10|T|o|p|
diff --git a/src/testdir/test_utf8.vim b/src/testdir/test_utf8.vim
index df0abd354c..3fd83cf79f 100644
--- a/src/testdir/test_utf8.vim
+++ b/src/testdir/test_utf8.vim
@@ -300,6 +300,28 @@ func Test_setcellwidths_dump()
call StopVimInTerminal(buf)
endfunc
+" When `setcellwidth` is used on characters that are not targets of `ambiwidth`.
+func Test_setcellwidths_with_non_ambiwidth_character_dump()
+ CheckRunVimInTerminal
+
+ let lines =<< trim END
+ call setline(1, [repeat("\u279c", 60), repeat("\u279c", 60)])
+ set ambiwidth=single
+ END
+ call writefile(lines, 'XCellwidthsWithNonAmbiwidthCharacter', 'D')
+ let buf = RunVimInTerminal('-S XCellwidthsWithNonAmbiwidthCharacter', {'rows': 6, 'cols': 50})
+ call term_sendkeys(buf, ":call setcellwidths([[0x279c, 0x279c, 1]])\<CR>")
+ call term_sendkeys(buf, ":echo\<CR>")
+ call VerifyScreenDump(buf, 'Test_setcellwidths_with_non_ambiwidth_character_dump_1', {})
+
+ call term_sendkeys(buf, ":call setcellwidths([[0x279c, 0x279c, 2]])\<CR>")
+ call term_sendkeys(buf, ":echo\<CR>")
+ call VerifyScreenDump(buf, 'Test_setcellwidths_with_non_ambiwidth_character_dump_2', {})
+
+ call StopVimInTerminal(buf)
+endfunc
+
+
" For some reason this test causes Test_customlist_completion() to fail on CI,
" so run it as the last test.
func Test_zz_ambiwidth_hl_dump()
@@ -321,7 +343,6 @@ func Test_zz_ambiwidth_hl_dump()
call term_sendkeys(buf, ":echo\<CR>")
call VerifyScreenDump(buf, 'Test_ambiwidth_hl_dump_1', {})
- if 0 " Enable after #14539 is fixed
call term_sendkeys(buf, ":call setcellwidths([[0x2103, 0x2103, 2]])\<CR>")
call term_sendkeys(buf, ":echo\<CR>")
call VerifyScreenDump(buf, 'Test_ambiwidth_hl_dump_2', {})
@@ -329,7 +350,6 @@ func Test_zz_ambiwidth_hl_dump()
call term_sendkeys(buf, ":call setcellwidths([[0x2103, 0x2103, 1]])\<CR>")
call term_sendkeys(buf, ":echo\<CR>")
call VerifyScreenDump(buf, 'Test_ambiwidth_hl_dump_1', {})
- endif
call StopVimInTerminal(buf)
endfunc
diff --git a/src/version.c b/src/version.c
index 3c1eae66a5..d4f82ba586 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 344,
+/**/
343,
/**/
342,