summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDylan Thacker-Smith <dylan.ah.smith@gmail.com>2024-03-28 11:47:32 +0100
committerChristian Brabandt <cb@256bit.org>2024-03-28 11:51:10 +0100
commitfe0a76b2bca12b13982ad66bafadc0d6c1681d00 (patch)
treed2b0dc5fa7ebf7c5514cf4bdc7b0a1f3d2664ba0
parentb6fac4db3647179671d3267a4bcd418e92cd4572 (diff)
patch 9.1.0222: missing 'below' virt text if truncation precedes after/right textv9.1.0222
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>
-rw-r--r--src/drawline.c39
-rw-r--r--src/testdir/test_textprop.vim3
-rw-r--r--src/version.c2
3 files changed, 32 insertions, 12 deletions
diff --git a/src/drawline.c b/src/drawline.c
index 8abe8bfa5f..8ec9e5f280 100644
--- 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;
+ }
+ }
}
}
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index 22c7e4651b..61e5158782 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -3099,6 +3099,9 @@ func Test_props_with_text_truncated_just_before_after()
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
diff --git a/src/version.c b/src/version.c
index f853a6968a..3fcbb99811 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 */
/**/
+ 222,
+/**/
221,
/**/
220,