changeset 34682:a36144b38683 v9.1.0222

patch 9.1.0222: missing 'below' virt text if truncation precedes after/right text Commit: https://github.com/vim/vim/commit/fe0a76b2bca12b13982ad66bafadc0d6c1681d00 Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com> Date: Thu Mar 28 11:47:32 2024 +0100 patch 9.1.0222: missing 'below' virt text if truncation precedes after/right text Problem: When a line is truncated just before 'after'/'right' virtual text and the line also has 'below' virtual text, then the 'below' virtual text would not be displayed, depending on the order these text properties were added. Solution: In the loop to make text properties active, skip instead of break for 'after'/'right' virtual text properties that are ignored due to truncation, so following 'below' text properties can still be made active. Similarly, a loop is needed to determine if a text property follows at the end of the screen. (Dylan Thacker-Smith) 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:04 +0100
parents bfb2f74221b9
children 1bfa0faf0969
files src/drawline.c src/testdir/test_textprop.vim src/version.c
diffstat 3 files changed, 32 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -2073,24 +2073,29 @@ win_line(
 		    --bcol;
 # endif
 		// Add any text property that starts in this column.
-		// With 'nowrap' and not in the first screen line only "below"
-		// text prop can show.
 		while (text_prop_next < text_prop_count
 			   && (text_props[text_prop_next].tp_col == MAXCOL
-			      ? ((*ptr == NUL
-				  && (wp->w_p_wrap
-				      || wlv.row == startrow
-				      || (text_props[text_prop_next].tp_flags
-						       & TP_FLAG_ALIGN_BELOW)))
+			      ? (*ptr == NUL
 			       || (bcol == 0
 					&& (text_props[text_prop_next].tp_flags
 						       & TP_FLAG_ALIGN_ABOVE)))
 			      : bcol >= text_props[text_prop_next].tp_col - 1))
 		{
+		    // With 'nowrap' and not in the first screen line only "below"
+		    // text prop can show.
 		    if (text_props[text_prop_next].tp_col == MAXCOL
-			    || bcol <= text_props[text_prop_next].tp_col - 1
+			    ? (wp->w_p_wrap
+				  || wlv.row == startrow
+				  || (text_props[text_prop_next].tp_flags
+					& TP_FLAG_ALIGN_BELOW)
+				  || (bcol == 0
+					&& (text_props[text_prop_next].tp_flags
+						       & TP_FLAG_ALIGN_ABOVE)))
+			    : bcol <= text_props[text_prop_next].tp_col - 1
 					   + text_props[text_prop_next].tp_len)
+		    {
 			text_prop_idxs[text_props_active++] = text_prop_next;
+		    }
 		    ++text_prop_next;
 		}
 
@@ -2321,7 +2326,6 @@ 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)))
 		{
@@ -2329,10 +2333,21 @@ win_line(
 		    // follows after it, we may need to flush the line after
 		    // displaying that character.
 		    // Or when not wrapping and at the rightmost column.
+
 		    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;
+		    // TODO: Store "after"/"right"/"below" text properties in order
+		    //       in the buffer so only `text_props[text_prop_count - 1]`
+		    //       needs to be checked for following "below" virtual text
+		    for (int i = text_prop_next; i < text_prop_count; ++i)
+		    {
+			if (text_props[i].tp_col == MAXCOL
+				&& (!only_below_follows
+				    || (text_props[i].tp_flags & TP_FLAG_ALIGN_BELOW)))
+			{
+			    text_prop_follows = TRUE;
+			    break;
+			}
+		    }
 		}
 	    }
 
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -3099,6 +3099,9 @@ func Test_props_with_text_truncated_just
   call term_sendkeys(buf, ":call AddPropBelow()\<CR>")
   call VerifyScreenDump(buf, 'Test_props_with_text_truncated_just_before_after_2', {})
 
+  call term_sendkeys(buf, ":call AddPropRight()\<CR>:\<Esc>")
+  call VerifyScreenDump(buf, 'Test_props_with_text_truncated_just_before_after_2', {})
+
   call StopVimInTerminal(buf)
 endfunc
 
--- 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 */
 /**/
+    222,
+/**/
     221,
 /**/
     220,