changeset 34680:2fd4ce2a5058 v9.1.0221

patch 9.1.0221: lines following virt text (that fills the window) might be truncated Commit: https://github.com/vim/vim/commit/b6fac4db3647179671d3267a4bcd418e92cd4572 Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com> Date: Thu Mar 28 11:40:41 2024 +0100 patch 9.1.0221: lines following virt text (that fills the window) might be truncated Problem: The if branch to set `text_prop_follows` was both checking if it was at the end of the buffer text line or if it was at the end of the screen line, but the former being true skipped a guard condition in the latter to only consider 'below' virtual text to follow. `text_prop_follows` being improperly set caused it to skip a conditional block to break at the end as well as one to move `ptr` to the end of the text line, while repeated for each following line of the window. Solution: Move the check for whether 'below' virtual text should follow so it is also used when at the end of the buffer text line. (Dylan Thacker-Smith) fixes: #12213 related: #14307 Signed-off-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Thu, 28 Mar 2024 12:00:03 +0100
parents e7f72f0cd2d9
children bfb2f74221b9
files src/drawline.c src/testdir/dumps/Test_props_with_text_truncated_just_before_after_1.dump src/testdir/dumps/Test_props_with_text_truncated_just_before_after_2.dump src/testdir/test_textprop.vim src/version.c
diffstat 5 files changed, 59 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -2323,15 +2323,17 @@ win_line(
 		else if (text_prop_next < text_prop_count
 			   && text_props[text_prop_next].tp_col == MAXCOL
 			   && ((*ptr != NUL && ptr[mb_ptr2len(ptr)] == NUL)
-			       || (!wp->w_p_wrap
-				       && wlv.col == wp->w_width - 1
-				       && (text_props[text_prop_next].tp_flags
-						      & TP_FLAG_ALIGN_BELOW))))
+			       || (!wp->w_p_wrap && wlv.col == wp->w_width - 1)))
+		{
 		    // When at last-but-one character and a text property
 		    // follows after it, we may need to flush the line after
 		    // displaying that character.
 		    // Or when not wrapping and at the rightmost column.
-		    text_prop_follows = TRUE;
+		    int only_below_follows = !wp->w_p_wrap && wlv.col == wp->w_width - 1;
+		    if (!only_below_follows
+			    || (text_props[text_prop_next].tp_flags & TP_FLAG_ALIGN_BELOW))
+			text_prop_follows = TRUE;
+		}
 	    }
 
 	    if (wlv.start_extra_for_textprop)
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_props_with_text_truncated_just_before_after_1.dump
@@ -0,0 +1,8 @@
+|h+0&#ffffff0|e|r|e| |i|s| |t|e|x|t| |l|o|n|g| |e|n|o|u|g|h| |t|o| |f|i|l@1| |t|h|e| |r|o|>+0#4040ff13&
+|s+0#0000000&|e|c|o|n|d| |l|i|n>e| @28
+|~+0#4040ff13&| @38
+|~| @38
+|~| @38
+|~| @38
+|~| @38
+| +0#0000000&@21|2|,|1@1| @9|A|l@1| 
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_props_with_text_truncated_just_before_after_2.dump
@@ -0,0 +1,8 @@
+|h+0&#ffffff0|e|r|e| |i|s| |t|e|x|t| |l|o|n|g| |e|n|o|u|g|h| |t|o| |f|i|l@1| |t|h|e| |r|o|>+0#4040ff13&
+|b+0#ffffff16#ff404010|e|l|o|w| |t|e|x|t| +0#0000000#ffffff0@29
+|s|e|c|o|n|d| |l|i|n>e| @28
+|~+0#4040ff13&| @38
+|~| @38
+|~| @38
+|~| @38
+| +0#0000000&@21|2|,|1@1| @9|A|l@1| 
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -3068,6 +3068,40 @@ func Test_props_with_text_after_below_tr
   call StopVimInTerminal(buf)
 endfunc
 
+func Test_props_with_text_truncated_just_before_after()
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+      vim9script
+      set showbreak=+++
+      set list listchars=extends:>
+      set nowrap
+
+      setline(1, [
+        'here is text long enough to fill the row',
+        'second line',
+      ])
+
+      prop_type_add("test", {"highlight": "Error"})
+      prop_add(1, 0, {type: "test", text: "after text", text_padding_left: 1})
+      def g:AddPropBelow()
+        prop_add(1, 0, {type: "test", text_align: "below", text: "below text"})
+      enddef
+      def g:AddPropRight()
+        prop_add(1, 0, {type: "test", text_align: "right", text: "right text"})
+      enddef
+      normal G$
+  END
+  call writefile(lines, 'XscriptPropsWithTextTruncatedJustBeforeAfter', 'D')
+  let buf = RunVimInTerminal('-S XscriptPropsWithTextTruncatedJustBeforeAfter', #{rows: 8, cols: 40})
+  call VerifyScreenDump(buf, 'Test_props_with_text_truncated_just_before_after_1', {})
+
+  call term_sendkeys(buf, ":call AddPropBelow()\<CR>")
+  call VerifyScreenDump(buf, 'Test_props_with_text_truncated_just_before_after_2', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
 func Test_prop_with_text_below_after_empty()
   CheckRunVimInTerminal
 
--- 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 */
 /**/
+    221,
+/**/
     220,
 /**/
     219,