]> granicus.if.org Git - vim/commitdiff
patch 9.0.0185: virtual text does not show if text prop at same position v9.0.0185
authorBram Moolenaar <Bram@vim.org>
Wed, 10 Aug 2022 15:00:33 +0000 (16:00 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 10 Aug 2022 15:00:33 +0000 (16:00 +0100)
Problem:    Virtual text does not show if tehre is a text prop at same
            position. (Ben Jackson)
Solution:   Fix the sorting of properties. (closes #10879)

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

index 5d9dcc37e249540ab09457e34f93f737926851e7..2b47648308ed1df27eeade3f30af8fa355a69e89 100644 (file)
@@ -281,6 +281,11 @@ get_sign_display_info(
 static textprop_T      *current_text_props = NULL;
 static buf_T           *current_buf = NULL;
 
+/*
+ * Function passed to qsort() to sort text properties.
+ * Return 1 if "s1" has priority over "s2", -1 if the other way around, zero if
+ * both have the same priority.
+ */
     static int
 text_prop_compare(const void *s1, const void *s2)
 {
@@ -300,7 +305,8 @@ text_prop_compare(const void *s1, const void *s2)
        int flags1 = 0;
        int flags2 = 0;
 
-       // order on 0: after, 1: right, 2: below
+       // both props add text are after the line, order on 0: after (default),
+       // 1: right, 2: below (comes last)
        if (tp1->tp_flags & TP_FLAG_ALIGN_RIGHT)
            flags1 = 1;
        if (tp1->tp_flags & TP_FLAG_ALIGN_BELOW)
@@ -312,17 +318,28 @@ text_prop_compare(const void *s1, const void *s2)
        if (flags1 != flags2)
            return flags1 < flags2 ? 1 : -1;
     }
+
+    // property that inserts text has priority over one that doesn't
+    if ((tp1->tp_id < 0) != (tp2->tp_id < 0))
+       return tp1->tp_id < 0 ? 1 : -1;
+
+    // check highest priority, defined by the type
     pt1 = text_prop_type_by_id(current_buf, tp1->tp_type);
     pt2 = text_prop_type_by_id(current_buf, tp2->tp_type);
-    if (pt1 == pt2)
-       return 0;
-    if (pt1 == NULL)
-       return -1;
-    if (pt2 == NULL)
-       return 1;
-    if (pt1->pt_priority != pt2->pt_priority)
-       return pt1->pt_priority > pt2->pt_priority ? 1 : -1;
-    return col1 == col2 ? 0 : col1 > col2 ? 1 : -1;
+    if (pt1 != pt2)
+    {
+       if (pt1 == NULL)
+           return -1;
+       if (pt2 == NULL)
+           return 1;
+       if (pt1->pt_priority != pt2->pt_priority)
+           return pt1->pt_priority > pt2->pt_priority ? 1 : -1;
+    }
+
+    // same priority, one that starts first wins
+    if (col1 != col2)
+       return col1 < col2 ? 1 : -1;
+    return 0;
 }
 #endif
 
diff --git a/src/testdir/dumps/Test_prop_at_same_pos.dump b/src/testdir/dumps/Test_prop_at_same_pos.dump
new file mode 100644 (file)
index 0000000..95f01fa
--- /dev/null
@@ -0,0 +1,5 @@
+>f+0&#ffffff0|u|n|c|t|i|o|n|(| |o+0#ffffff16#ff404010|n|e|:| |c+0#0000000#ffff4012|a|l@1|,+0&#ffffff0| |t+0#00e0e07&|w|o|:| |a+0#0000000#ffff4012|r|g|u|m|e|n|t|,+0&#ffffff0| |t+0&#ffd7ff255|h|r|e@1|:| |h+0&#ffff4012|e|r|e| +0&#ffffff0|)| @25
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|,|1| @10|A|l@1| 
index 8533af3cd25c1bafb8d1ffa76a55f62c64d8626d..29cd59968270c96159d054c02d949f72a6c4db1b 100644 (file)
@@ -1334,6 +1334,33 @@ func Test_textprop_nowrap_scrolled()
   call delete('XtestNowrap')
 endfunc
 
+func Test_textprop_text_priority()
+  CheckScreendump
+
+  let lines =<< trim END
+      call setline(1, "function( call, argument, here )")
+
+      call prop_type_add('one', #{highlight: 'Error'})
+      call prop_type_add('two', #{highlight: 'Function'})
+      call prop_type_add('three', #{highlight: 'DiffChange'})
+      call prop_type_add('arg', #{highlight: 'Search'})
+
+      call prop_add(1, 27, #{type: 'arg', length: len('here')})
+      call prop_add(1, 27, #{type: 'three', text: 'three: '})
+      call prop_add(1, 11, #{type: 'one', text: 'one: '})
+      call prop_add(1, 11, #{type: 'arg', length: len('call')})
+      call prop_add(1, 17, #{type: 'two', text: 'two: '})
+      call prop_add(1, 17, #{type: 'arg', length: len('argument')})
+  END
+  call writefile(lines, 'XtestPropPrio')
+  let buf = RunVimInTerminal('-S XtestPropPrio', {'rows': 5})
+  call VerifyScreenDump(buf, 'Test_prop_at_same_pos', {})
+
+  " clean up
+  call StopVimInTerminal(buf)
+  call delete('XtestPropPrio')
+endfunc
+
 func Test_textprop_with_syntax()
   CheckScreendump
 
index 27503b5951dfeea52c51353895753dfadd5931ea..eb9566cc23f8bce0293e960e92a71e59233051ef 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    185,
 /**/
     184,
 /**/