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 -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220810151047.A67ED1C4F15%40moolenaar.net.

Raspunde prin e-mail lui