To: vim_dev@googlegroups.com Subject: Patch 9.0.0185 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0185 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) Files: src/drawline.c, src/testdir/test_textprop.vim, src/testdir/dumps/Test_prop_at_same_pos.dump *** ../vim-9.0.0184/src/drawline.c 2022-08-10 13:39:16.978344665 +0100 --- src/drawline.c 2022-08-10 15:42:26.430244767 +0100 *************** *** 281,286 **** --- 281,291 ---- 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,306 **** int flags1 = 0; int flags2 = 0; ! // order on 0: after, 1: right, 2: below if (tp1->tp_flags & TP_FLAG_ALIGN_RIGHT) flags1 = 1; if (tp1->tp_flags & TP_FLAG_ALIGN_BELOW) --- 305,312 ---- int flags1 = 0; int flags2 = 0; ! // 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,328 **** if (flags1 != flags2) return flags1 < flags2 ? 1 : -1; } 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; } #endif --- 318,345 ---- 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) ! { ! 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 *** ../vim-9.0.0184/src/testdir/test_textprop.vim 2022-08-10 13:39:16.978344665 +0100 --- src/testdir/test_textprop.vim 2022-08-10 15:57:55.513905289 +0100 *************** *** 1334,1339 **** --- 1334,1366 ---- 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 *** ../vim-9.0.0184/src/testdir/dumps/Test_prop_at_same_pos.dump 2022-08-10 15:59:12.597726712 +0100 --- src/testdir/dumps/Test_prop_at_same_pos.dump 2022-08-10 15:58:01.061891881 +0100 *************** *** 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| *** ../vim-9.0.0184/src/version.c 2022-08-10 13:39:16.978344665 +0100 --- src/version.c 2022-08-10 15:44:33.285597997 +0100 *************** *** 737,738 **** --- 737,740 ---- { /* Add new patch number below this line */ + /**/ + 185, /**/ -- Facepalm reply #3: "I had a great time in Manhattan" "I thought you were going to New York?" /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///