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.sm...@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.sm...@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/drawline.c b/src/drawline.c
index 8abe8bfa5..8ec9e5f28 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 22c7e4651..61e515878 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 f853a6968..3fcbb9981 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 */
+/**/
+    222,
 /**/
     221,
 /**/

-- 
-- 
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/E1rpnUK-00AxMN-Jb%40256bit.org.

Raspunde prin e-mail lui