]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1828: cursor wrong with virt text before double-width char v9.0.1828
authorzeertzjq <zeertzjq@outlook.com>
Thu, 31 Aug 2023 16:07:30 +0000 (18:07 +0200)
committerChristian Brabandt <cb@256bit.org>
Thu, 31 Aug 2023 16:07:48 +0000 (18:07 +0200)
Problem:  Wrong cursor position with virtual text before double-width
          char at window edge.
Solution: Check for double-width char before adding virtual text size.

closes: #12977

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
src/charset.c
src/testdir/dumps/Test_prop_inserts_text_before_double_width_wrap_1.dump [new file with mode: 0644]
src/testdir/test_textprop.vim
src/version.c

index 3cba7a5e0628259c8ffc0429ac6ab8aea0fe8593..3495a0ee179075942cb500b89c2188220d36d69a 100644 (file)
@@ -1159,6 +1159,9 @@ win_lbr_chartabsize(
     size = win_chartabsize(wp, s, vcol);
     if (*s == NUL && !has_lcs_eol)
        size = 0;  // NUL is not displayed
+# ifdef FEAT_LINEBREAK
+    int is_doublewidth = has_mbyte && size == 2 && MB_BYTE2LEN(*s) > 1;
+# endif
 
 # ifdef FEAT_PROP_POPUP
     if (cts->cts_has_prop_with_text)
@@ -1242,8 +1245,7 @@ win_lbr_chartabsize(
 # endif
 
 # ifdef FEAT_LINEBREAK
-    if (has_mbyte && size == 2 && MB_BYTE2LEN(*s) > 1
-                                  && wp->w_p_wrap && in_win_border(wp, vcol))
+    if (is_doublewidth && wp->w_p_wrap && in_win_border(wp, vcol + size - 2))
     {
        ++size;         // Count the ">" in the last column.
        mb_added = 1;
diff --git a/src/testdir/dumps/Test_prop_inserts_text_before_double_width_wrap_1.dump b/src/testdir/dumps/Test_prop_inserts_text_before_double_width_wrap_1.dump
new file mode 100644 (file)
index 0000000..6bf28c3
--- /dev/null
@@ -0,0 +1,3 @@
+|a+0&#ffffff0@39|b+0#e000e06&@8|>+0#4040ff13&
+|口*0#0000000&|1+&|2|3|4>5| @42
+@32|1|,|4|8|-|5|7| @6|A|l@1| 
index 030955b802c5024f8fd1f6955e858537f0e9163c..c0069125f0223acdc6d3bf721e8e1f3d4ad4ce2b 100644 (file)
@@ -2810,6 +2810,22 @@ func Test_prop_inserts_text_before_linebreak()
   call StopVimInTerminal(buf)
 endfunc
 
+func Test_prop_inserts_text_before_double_width_wrap()
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+    call setline(1, repeat('a', 40) .. '口' .. '12345')
+    call prop_type_add('theprop', #{highlight: 'Special'})
+    call prop_add(1, 41, #{type: 'theprop', text: repeat('b', 9)})
+    normal! $
+  END
+  call writefile(lines, 'XscriptPropsBeforeDoubleWidthWrap', 'D')
+  let buf = RunVimInTerminal('-S XscriptPropsBeforeDoubleWidthWrap', #{rows: 3, cols: 50})
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_before_double_width_wrap_1', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
 func Test_prop_inserts_text_lcs_extends()
   CheckRunVimInTerminal
 
index ea94b20a749a95dcca8841bb147db301e47fe00f..1ab29e80012817700a85e30ebc785c4fd2bf6703 100644 (file)
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1828,
 /**/
     1827,
 /**/