]> granicus.if.org Git - vim/commitdiff
patch 9.0.0995: padding before virtual text is highlighted v9.0.0995
authorBram Moolenaar <Bram@vim.org>
Fri, 2 Dec 2022 21:50:14 +0000 (21:50 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 2 Dec 2022 21:50:14 +0000 (21:50 +0000)
Problem:    Padding before virtual text below is highlighted when 'number' and
            'nowrap' are set.
Solution:   Save and restore n_attr_skip. (closes #11643)

src/drawline.c
src/testdir/dumps/Test_prop_below_after_empty_3.dump [new file with mode: 0644]
src/testdir/test_textprop.vim
src/version.c

index e2849a1ff8ac1f29001a1cdd78f57f38c2cc971f..bde5ec8247a4a35cae2fe2754754c5de67120013 100644 (file)
@@ -141,6 +141,7 @@ typedef struct {
     char_u     *p_extra_free;  // p_extra buffer that needs to be freed
     int                extra_attr;     // attributes for p_extra, should be combined
                                // with win_attr if needed
+    int                n_attr_skip;    // chars to skip before using extra_attr
     int                c_extra;        // extra chars, all the same
     int                c_final;        // final char, mandatory if set
     int                extra_for_textprop; // wlv.n_extra set for textprop
@@ -149,6 +150,7 @@ typedef struct {
     int                saved_n_extra;
     char_u     *saved_p_extra;
     int                saved_extra_attr;
+    int                saved_n_attr_skip;
     int                saved_extra_for_textprop;
     int                saved_c_extra;
     int                saved_c_final;
@@ -652,13 +654,10 @@ text_prop_position(
     int            strsize = vim_strsize(*p_extra);
     int            cells = wrap ? strsize : textprop_size_after_trunc(wp,
                             tp->tp_flags, before, padding, *p_extra, &n_used);
-    int            cont_on_next_line = below && col_with_padding > win_col_off(wp)
-                                                             && !wp->w_p_wrap;
 
     if (wrap || right || above || below || padding > 0 || n_used < *n_extra)
     {
        int         col_off = win_col_off(wp) - win_col_off2(wp);
-       int         skip_add = 0;
 
        if (above)
        {
@@ -690,14 +689,10 @@ text_prop_position(
                        before = 0;
                    else
                        n_used = *n_extra;
-                   skip_add = col_off;
                }
                else
                    before = 0;
            }
-           else if (below && before > 0)
-               // include 'number' column et al.
-               skip_add = col_off;
        }
 
        // With 'nowrap' add one to show the "extends" character if needed (it
@@ -707,8 +702,6 @@ text_prop_position(
                && wp->w_lcs_chars.ext != NUL
                && wp->w_p_list)
            ++n_used;
-       if (!wp->w_p_wrap && below && padding > 0)
-           skip_add = col_off;
 
        // add 1 for NUL, 2 for when '…' is used
        if (n_attr != NULL)
@@ -763,10 +756,9 @@ text_prop_position(
                if (above)
                    *n_attr -= padding + after;
 
-               // Add "skip_add" when starting a new line or wrapping,
-               // n_attr_skip will then be decremented in the number column.
-               *n_attr_skip = before + padding
-                           + (cont_on_next_line || before > 0 ? skip_add : 0);
+               // n_attr_skip will not be decremented before draw_state is
+               // WL_LINE
+               *n_attr_skip = before + padding;
            }
        }
     }
@@ -946,6 +938,7 @@ win_line_start(win_T *wp UNUSED, winlinevars_T *wlv, int save_extra)
        wlv->saved_n_extra = wlv->n_extra;
        wlv->saved_p_extra = wlv->p_extra;
        wlv->saved_extra_attr = wlv->extra_attr;
+       wlv->saved_n_attr_skip = wlv->n_attr_skip;
        wlv->saved_extra_for_textprop = wlv->extra_for_textprop;
        wlv->saved_c_extra = wlv->c_extra;
        wlv->saved_c_final = wlv->c_final;
@@ -959,7 +952,10 @@ win_line_start(win_T *wp UNUSED, winlinevars_T *wlv, int save_extra)
        else
 #endif
            wlv->saved_char_attr = 0;
+
+       // these are not used until restored in win_line_continue()
        wlv->n_extra = 0;
+       wlv->n_attr_skip = 0;
     }
 }
 
@@ -978,6 +974,7 @@ win_line_continue(winlinevars_T *wlv)
        wlv->c_final = wlv->saved_c_final;
        wlv->p_extra = wlv->saved_p_extra;
        wlv->extra_attr = wlv->saved_extra_attr;
+       wlv->n_attr_skip = wlv->saved_n_attr_skip;
        wlv->extra_for_textprop = wlv->saved_extra_for_textprop;
        wlv->char_attr = wlv->saved_char_attr;
     }
@@ -1021,7 +1018,6 @@ win_line(
                                        // prec until it's been used
 
     int                n_attr = 0;         // chars with special attr
-    int                n_attr_skip = 0;    // chars to skip bef. using wlv.extra_attr
     int                saved_attr2 = 0;    // char_attr saved for n_attr
     int                n_attr3 = 0;        // chars with overruling special attr
     int                saved_attr3 = 0;    // char_attr saved for n_attr3
@@ -2063,7 +2059,7 @@ win_line(
                                                    wlv.vcol,
                                                    wlv.col,
                                                    &wlv.n_extra, &wlv.p_extra,
-                                                   &n_attr, &n_attr_skip);
+                                                   &n_attr, &wlv.n_attr_skip);
                                if (wlv.p_extra != prev_p_extra)
                                {
                                    // wlv.p_extra was allocated
@@ -2105,9 +2101,9 @@ win_line(
                            {
                                wlv.n_extra -= skip_cells;
                                wlv.p_extra += skip_cells;
-                               n_attr_skip -= skip_cells;
-                               if (n_attr_skip < 0)
-                                   n_attr_skip = 0;
+                               wlv.n_attr_skip -= skip_cells;
+                               if (wlv.n_attr_skip < 0)
+                                   wlv.n_attr_skip = 0;
                                skip_cells = 0;
                            }
                            else
@@ -2116,7 +2112,7 @@ win_line(
                                // it and advance to the next one
                                skip_cells -= wlv.n_extra;
                                wlv.n_extra = 0;
-                               n_attr_skip = 0;
+                               wlv.n_attr_skip = 0;
                                bail_out = TRUE;
                            }
                        }
@@ -3337,8 +3333,8 @@ win_line(
 
        // Use "wlv.extra_attr", but don't override visual selection
        // highlighting, unless text property overrides.
-       // Don't use "wlv.extra_attr" until n_attr_skip is zero.
-       if (n_attr_skip == 0 && n_attr > 0
+       // Don't use "wlv.extra_attr" until wlv.n_attr_skip is zero.
+       if (wlv.n_attr_skip == 0 && n_attr > 0
                && wlv.draw_state == WL_LINE
                && (!attr_pri
 #ifdef FEAT_PROP_POPUP
@@ -3828,10 +3824,10 @@ win_line(
 
        // restore attributes after last 'listchars' or 'number' char
        if (n_attr > 0 && wlv.draw_state == WL_LINE
-                                         && n_attr_skip == 0 && --n_attr == 0)
+                                     && wlv.n_attr_skip == 0 && --n_attr == 0)
            wlv.char_attr = saved_attr2;
-       if (n_attr_skip > 0)
-           --n_attr_skip;
+       if (wlv.n_attr_skip > 0)
+           --wlv.n_attr_skip;
 
        // At end of screen line and there is more to come: Display the line
        // so far.  If there is no more to display it is caught above.
diff --git a/src/testdir/dumps/Test_prop_below_after_empty_3.dump b/src/testdir/dumps/Test_prop_below_after_empty_3.dump
new file mode 100644 (file)
index 0000000..8658af0
--- /dev/null
@@ -0,0 +1,8 @@
+| +0#af5f00255#ffffff0@1|1| >v+0#0000000&|i|m|9|s|c|r|i|p|t| @45
+| +0#af5f00255&@1|2| | +0#0000000&@55
+| +0#af5f00255&@3| +0#0000000&|T+0#ffffff16#e000002|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|p|s| |o|v|e|r| |t|h|e| |l|a|z|y| |d|o|g| +0#0000000#ffffff0@11
+| +0#af5f00255&@1|3| |t+0#0000000&|h|r|e@1| @50
+| +0#af5f00255&@1|4| | +0#0000000&@55
+| +0#af5f00255&@3|T+0#0000000#ffd7ff255|h|e| |s|l|o|w| |f|o|x| |b|u|m|p|s| |i|n|t|o| |t|h|e| |l|a|z|y| |d|o|g| +0&#ffffff0@19
+|~+0#4040ff13&| @58
+|:+0#0000000&|s|e|t| |n|o|w|r|a|p| @30|1|,|1| @10|A|l@1| 
index 1d4370331ad69a863a899ace3313c7ba0e61a632..6493aef5c9bb2ef6b66b6ebccd3a4cabacfd9ec6 100644 (file)
@@ -2747,6 +2747,9 @@ func Test_prop_with_text_below_after_empty()
   call term_sendkeys(buf, ":set number\<CR>")
   call VerifyScreenDump(buf, 'Test_prop_below_after_empty_2', {}) 
 
+  call term_sendkeys(buf, ":set nowrap\<CR>")
+  call VerifyScreenDump(buf, 'Test_prop_below_after_empty_3', {}) 
+
   call StopVimInTerminal(buf)
 endfunc
 
index 6b4f1035b3abd9aeb0dbcf452081df58de1775bb..444e9bfd19d1b439fd062fc13ffa07dc92f1dbd1 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    995,
 /**/
     994,
 /**/