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)
{
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)
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
--- /dev/null
+>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|
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
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 185,
/**/
184,
/**/