]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0222: missing 'below' virt text if truncation precedes after/right text v9.1.0222
authorDylan Thacker-Smith <dylan.ah.smith@gmail.com>
Thu, 28 Mar 2024 10:47:32 +0000 (11:47 +0100)
committerChristian Brabandt <cb@256bit.org>
Thu, 28 Mar 2024 10:51:10 +0000 (11:51 +0100)
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>
src/drawline.c
src/testdir/test_textprop.vim
src/version.c

index 8abe8bfa5f5552b34c27e2fd8a35bc9ef4c1f148..8ec9e5f2800bf99dd9a8f10d4ff9216cb23cd235 100644 (file)
@@ -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;
+                       }
+                   }
                }
            }
 
index 22c7e4651bf481ebbf99b807e1cc8e12300cbded..61e5158782f800cba9c0f5cf0774c82887221f3b 100644 (file)
@@ -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
 
index f853a6968acdb873a1ee70311a6709fe13310689..3fcbb9981132c2e39cf492d8ffc81097e851b239 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    222,
 /**/
     221,
 /**/