patch 9.1.0344: Cursor wrong after using setcellwidth() in terminal

Commit: 
https://github.com/vim/vim/commit/e20fa59903525e15cecd680a2f32ece8a5d1bc0c
Author: mikoto2000 <mikoto2...@gmail.com>
Date:   Wed Apr 17 22:06:54 2024 +0200

    patch 9.1.0344: Cursor wrong after using setcellwidth() in terminal
    
    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 <mikoto2...@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>
    Fix CUI `setcellwidths` characters draw behavior to same GUI behavior.

diff --git a/src/mbyte.c b/src/mbyte.c
index 406d1093f..07446ca56 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 7883b3b4c..c57c94c8a 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 71ddbcaab..a8b4559b1 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 000000000..73f441812
--- /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 000000000..2b575f6b3
--- /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 df0abd354..3fd83cf79 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 3c1eae66a..d4f82ba58 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    344,
 /**/
     343,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1rxBgM-00GUGU-Sq%40256bit.org.

Raspunde prin e-mail lui