diff src/drawline.c @ 29690:1a9b3c96ed08 v9.0.0185

patch 9.0.0185: virtual text does not show if text prop at same position Commit: https://github.com/vim/vim/commit/952c9b02f8a7c2386b66ed643eef0acd35e842ae Author: Bram Moolenaar <Bram@vim.org> Date: Wed Aug 10 16:00:33 2022 +0100 patch 9.0.0185: virtual text does not show if text prop at same position 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)
author Bram Moolenaar <Bram@vim.org>
date Wed, 10 Aug 2022 17:15:02 +0200
parents 1455814702ad
children 042f357b455d
line wrap: on
line diff
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -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 
 	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 
 	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