Patch 8.1.1559
Problem:    Popup window title property not implemented yet.
Solution:   Implement the title property.
Files:      runtime/doc/popup.txt, src/popupwin.c, src/structs.h
            src/window.c, src/testdir/test_popupwin.vim,
            src/testdir/dumps/Test_popupwin_menu_01.dump,
            src/testdir/dumps/Test_popupwin_menu_02.dump,
            src/testdir/dumps/Test_popupwin_title.dump


*** ../vim-8.1.1558/runtime/doc/popup.txt       2019-06-16 19:05:08.710676808 
+0200
--- runtime/doc/popup.txt       2019-06-16 20:00:00.465350232 +0200
***************
*** 112,118 ****
        popup_setoptions({id}, {options})
        hidden option
        tabpage option with number
-       title option
        flip option
        transparent text property
  
--- 112,117 ----
***************
*** 452,459 ****
        title           Text to be displayed above the first item in the
                        popup, on top of any border.  If there is no top
                        border one line of padding is added to put the title
!                       on.
!                       {not implemented yet}
        wrap            TRUE to make the lines wrap (default TRUE).
        drag            TRUE to allow the popup to be dragged with the mouse
                        by grabbing at at the border.  Has no effect if the
--- 451,458 ----
        title           Text to be displayed above the first item in the
                        popup, on top of any border.  If there is no top
                        border one line of padding is added to put the title
!                       on.  You might want to add one or more spaces at the
!                       start and end as padding.
        wrap            TRUE to make the lines wrap (default TRUE).
        drag            TRUE to allow the popup to be dragged with the mouse
                        by grabbing at at the border.  Has no effect if the
*** ../vim-8.1.1558/src/popupwin.c      2019-06-16 19:05:08.710676808 +0200
--- src/popupwin.c      2019-06-16 19:54:52.992744452 +0200
***************
*** 294,299 ****
--- 294,306 ----
        set_string_option_direct_in_win(wp, (char_u *)"wincolor", -1,
                                                   str, OPT_FREE|OPT_LOCAL, 0);
  
+     str = dict_get_string(dict, (char_u *)"title", FALSE);
+     if (str != NULL)
+     {
+       vim_free(wp->w_popup_title);
+       wp->w_popup_title = vim_strsave(str);
+     }
+ 
      wp->w_firstline = dict_get_number(dict, (char_u *)"firstline");
      if (wp->w_firstline < 1)
        wp->w_firstline = 1;
***************
*** 532,537 ****
--- 539,557 ----
  }
  
  /*
+  * Get the padding plus border at the top, adjusted to 1 if there is a title.
+  */
+     static int
+ popup_top_extra(win_T *wp)
+ {
+     int       extra = wp->w_popup_border[0] + wp->w_popup_padding[0];
+ 
+     if (extra == 0 && wp->w_popup_title != NULL && *wp->w_popup_title != NUL)
+       return 1;
+     return extra;
+ }
+ 
+ /*
   * Adjust the position and size of the popup to fit on the screen.
   */
      void
***************
*** 543,549 ****
      int               center_vert = FALSE;
      int               center_hor = FALSE;
      int               allow_adjust_left = !wp->w_popup_fixed;
!     int               top_extra = wp->w_popup_border[0] + 
wp->w_popup_padding[0];
      int               right_extra = wp->w_popup_border[1] + 
wp->w_popup_padding[1];
      int               bot_extra = wp->w_popup_border[2] + 
wp->w_popup_padding[2];
      int               left_extra = wp->w_popup_border[3] + 
wp->w_popup_padding[3];
--- 563,569 ----
      int               center_vert = FALSE;
      int               center_hor = FALSE;
      int               allow_adjust_left = !wp->w_popup_fixed;
!     int               top_extra = popup_top_extra(wp);
      int               right_extra = wp->w_popup_border[1] + 
wp->w_popup_padding[1];
      int               bot_extra = wp->w_popup_border[2] + 
wp->w_popup_padding[2];
      int               left_extra = wp->w_popup_border[3] + 
wp->w_popup_padding[3];
***************
*** 553,558 ****
--- 573,579 ----
      int               org_wincol = wp->w_wincol;
      int               org_width = wp->w_width;
      int               org_height = wp->w_height;
+     int               minwidth;
  
      wp->w_winrow = 0;
      wp->w_wincol = 0;
***************
*** 646,653 ****
            break;
      }
  
!     if (wp->w_minwidth > 0 && wp->w_width < wp->w_minwidth)
!       wp->w_width = wp->w_minwidth;
      if (wp->w_width > maxwidth)
        wp->w_width = maxwidth;
      if (center_hor)
--- 667,683 ----
            break;
      }
  
!     minwidth = wp->w_minwidth;
!     if (wp->w_popup_title != NULL && *wp->w_popup_title != NUL)
!     {
!       int title_len = vim_strsize(wp->w_popup_title) + 2 - extra_width;
! 
!       if (minwidth < title_len)
!           minwidth = title_len;
!     }
! 
!     if (minwidth > 0 && wp->w_width < minwidth)
!       wp->w_width = minwidth;
      if (wp->w_width > maxwidth)
        wp->w_width = maxwidth;
      if (center_hor)
***************
*** 1384,1390 ****
      {
        if (wp == NULL)
            return;  // invalid {id}
!       top_extra = wp->w_popup_border[0] + wp->w_popup_padding[0];
        left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3];
  
        dict = rettv->vval.v_dict;
--- 1414,1420 ----
      {
        if (wp == NULL)
            return;  // invalid {id}
!       top_extra = popup_top_extra(wp);
        left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3];
  
        dict = rettv->vval.v_dict;
***************
*** 1750,1755 ****
--- 1780,1786 ----
      int           left_off;
      int           total_width;
      int           total_height;
+     int           top_padding;
      int           popup_attr;
      int           border_attr[4];
      int           border_char[8];
***************
*** 1770,1776 ****
  
        // adjust w_winrow and w_wincol for border and padding, since
        // win_update() doesn't handle them.
!       top_off = wp->w_popup_padding[0] + wp->w_popup_border[0];
        left_off = wp->w_popup_padding[3] + wp->w_popup_border[3];
        wp->w_winrow += top_off;
        wp->w_wincol += left_off;
--- 1801,1807 ----
  
        // adjust w_winrow and w_wincol for border and padding, since
        // win_update() doesn't handle them.
!       top_off = popup_top_extra(wp);
        left_off = wp->w_popup_padding[3] + wp->w_popup_border[3];
        wp->w_winrow += top_off;
        wp->w_wincol += left_off;
***************
*** 1783,1789 ****
  
        total_width = wp->w_popup_border[3] + wp->w_popup_padding[3]
                + wp->w_width + wp->w_popup_padding[1] + wp->w_popup_border[1];
!       total_height = wp->w_popup_border[0] + wp->w_popup_padding[0]
                + wp->w_height + wp->w_popup_padding[2] + wp->w_popup_border[2];
        popup_attr = get_wcr_attr(wp);
  
--- 1814,1820 ----
  
        total_width = wp->w_popup_border[3] + wp->w_popup_padding[3]
                + wp->w_width + wp->w_popup_padding[1] + wp->w_popup_border[1];
!       total_height = popup_top_extra(wp)
                + wp->w_height + wp->w_popup_padding[2] + wp->w_popup_border[2];
        popup_attr = get_wcr_attr(wp);
  
***************
*** 1816,1821 ****
--- 1847,1853 ----
                border_attr[i] = syn_name2attr(wp->w_border_highlight[i]);
        }
  
+       top_padding = wp->w_popup_padding[0];
        if (wp->w_popup_border[0] > 0)
        {
            // top border
***************
*** 1832,1848 ****
                               wp->w_wincol + total_width - 1, border_attr[1]);
            }
        }
  
!       if (wp->w_popup_padding[0] > 0)
        {
            // top padding
            row = wp->w_winrow + wp->w_popup_border[0];
!           screen_fill(row, row + wp->w_popup_padding[0],
                    wp->w_wincol + wp->w_popup_border[3],
                    wp->w_wincol + total_width - wp->w_popup_border[1],
                                                         ' ', ' ', popup_attr);
        }
  
        for (row = wp->w_winrow + wp->w_popup_border[0];
                row < wp->w_winrow + total_height - wp->w_popup_border[2];
                    ++row)
--- 1864,1887 ----
                               wp->w_wincol + total_width - 1, border_attr[1]);
            }
        }
+       else if (wp->w_popup_padding[0] == 0 && popup_top_extra(wp) > 0)
+           top_padding = 1;
  
!       if (top_padding > 0)
        {
            // top padding
            row = wp->w_winrow + wp->w_popup_border[0];
!           screen_fill(row, row + top_padding,
                    wp->w_wincol + wp->w_popup_border[3],
                    wp->w_wincol + total_width - wp->w_popup_border[1],
                                                         ' ', ' ', popup_attr);
        }
  
+       // Title goes on top of border or padding.
+       if (wp->w_popup_title != NULL)
+           screen_puts(wp->w_popup_title, wp->w_winrow, wp->w_wincol + 1,
+                   wp->w_popup_border[0] > 0 ? border_attr[0] : popup_attr);
+ 
        for (row = wp->w_winrow + wp->w_popup_border[0];
                row < wp->w_winrow + total_height - wp->w_popup_border[2];
                    ++row)
*** ../vim-8.1.1558/src/structs.h       2019-06-15 21:46:25.948960483 +0200
--- src/structs.h       2019-06-16 19:34:15.938611573 +0200
***************
*** 2891,2896 ****
--- 2891,2897 ----
      pos_save_T        w_save_cursor;      /* backup of cursor pos and topline 
*/
  #ifdef FEAT_TEXT_PROP
      int               w_popup_flags;      // POPF_ values
+     char_u    *w_popup_title;
      poppos_T  w_popup_pos;
      int               w_popup_fixed;      // do not shift popup to fit on 
screen
      int               w_zindex;
*** ../vim-8.1.1558/src/window.c        2019-06-16 15:50:42.012557682 +0200
--- src/window.c        2019-06-16 20:07:51.885549555 +0200
***************
*** 4857,4862 ****
--- 4857,4863 ----
      free_callback(&wp->w_filter_cb);
      for (i = 0; i < 4; ++i)
        VIM_CLEAR(wp->w_border_highlight[i]);
+     vim_free(wp->w_popup_title);
  #endif
  
  #ifdef FEAT_SYN_HL
*** ../vim-8.1.1558/src/testdir/test_popupwin.vim       2019-06-16 
19:05:08.714676794 +0200
--- src/testdir/test_popupwin.vim       2019-06-16 20:02:07.664202325 +0200
***************
*** 940,946 ****
    let lines =<< trim END
        call setline(1, range(1, 20))
        hi PopupSelected ctermbg=lightblue
!       call popup_menu(['one', 'two', 'another'], {'callback': 'MenuDone'})
        func MenuDone(id, res)
          echomsg "selected " .. a:res
        endfunc
--- 940,946 ----
    let lines =<< trim END
        call setline(1, range(1, 20))
        hi PopupSelected ctermbg=lightblue
!       call popup_menu(['one', 'two', 'another'], {'callback': 'MenuDone', 
'title': ' make a choice from the list '})
        func MenuDone(id, res)
          echomsg "selected " .. a:res
        endfunc
***************
*** 960,965 ****
--- 960,985 ----
    call delete('XtestPopupMenu')
  endfunc
  
+ func Test_popup_title()
+   if !CanRunVimInTerminal()
+     throw 'Skipped: cannot make screendumps'
+   endif
+ 
+   " Create a popup without title or border, a line of padding will be added to
+   " put the title on.
+   let lines =<< trim END
+       call setline(1, range(1, 20))
+       call popup_create(['one', 'two', 'another'], {'title': 'Title String'})
+   END
+   call writefile(lines, 'XtestPopupTitle')
+   let buf = RunVimInTerminal('-S XtestPopupTitle', {'rows': 10})
+   call VerifyScreenDump(buf, 'Test_popupwin_title', {})
+ 
+   " clean up
+   call StopVimInTerminal(buf)
+   call delete('XtestPopupTitle')
+ endfunc
+ 
  func Test_popup_close_callback()
    func PopupDone(id, result)
      let g:result = a:result
*** ../vim-8.1.1558/src/testdir/dumps/Test_popupwin_menu_01.dump        
2019-06-16 19:05:08.714676794 +0200
--- src/testdir/dumps/Test_popupwin_menu_01.dump        2019-06-16 
20:02:17.944114370 +0200
***************
*** 1,10 ****
  >1+0&#ffffff0| @73
! |2| @30|╔+0#0000001#ffd7ff255|═@8|╗| +0#0000000#ffffff0@31
! |3| @30|║+0#0000001#ffd7ff255| @8|║| +0#0000000#ffffff0@31
! |4| @30|║+0#0000001#ffd7ff255| |o+0#0000000#5fd7ff255|n|e| 
+0#0000001#ffd7ff255@4|║| +0#0000000#ffffff0@31
! |5| @30|║+0#0000001#ffd7ff255| |t|w|o| @4|║| +0#0000000#ffffff0@31
! |6| @30|║+0#0000001#ffd7ff255| |a|n|o|t|h|e|r| |║| +0#0000000#ffffff0@31
! |7| @30|║+0#0000001#ffd7ff255| @8|║| +0#0000000#ffffff0@31
! |8| @30|╚+0#0000001#ffd7ff255|═@8|╝| +0#0000000#ffffff0@31
  |9| @73
  @57|1|,|1| @10|T|o|p| 
--- 1,10 ----
  >1+0&#ffffff0| @73
! |2| @20|╔+0#0000001#ffd7ff255| |m|a|k|e| |a| |c|h|o|i|c|e| |f|r|o|m| |t|h|e| 
|l|i|s|t| |╗| +0#0000000#ffffff0@21
! |3| @20|║+0#0000001#ffd7ff255| @28|║| +0#0000000#ffffff0@21
! |4| @20|║+0#0000001#ffd7ff255| |o+0#0000000#5fd7ff255|n|e| 
+0#0000001#ffd7ff255@24|║| +0#0000000#ffffff0@21
! |5| @20|║+0#0000001#ffd7ff255| |t|w|o| @24|║| +0#0000000#ffffff0@21
! |6| @20|║+0#0000001#ffd7ff255| |a|n|o|t|h|e|r| @20|║| +0#0000000#ffffff0@21
! |7| @20|║+0#0000001#ffd7ff255| @28|║| +0#0000000#ffffff0@21
! |8| @20|╚+0#0000001#ffd7ff255|═@28|╝| +0#0000000#ffffff0@21
  |9| @73
  @57|1|,|1| @10|T|o|p| 
*** ../vim-8.1.1558/src/testdir/dumps/Test_popupwin_menu_02.dump        
2019-06-16 19:05:08.714676794 +0200
--- src/testdir/dumps/Test_popupwin_menu_02.dump        2019-06-16 
20:02:18.992105440 +0200
***************
*** 1,10 ****
  >1+0&#ffffff0| @73
! |2| @30|╔+0#0000001#ffd7ff255|═@8|╗| +0#0000000#ffffff0@31
! |3| @30|║+0#0000001#ffd7ff255| @8|║| +0#0000000#ffffff0@31
! |4| @30|║+0#0000001#ffd7ff255| |o|n|e| @4|║| +0#0000000#ffffff0@31
! |5| @30|║+0#0000001#ffd7ff255| |t|w|o| @4|║| +0#0000000#ffffff0@31
! |6| @30|║+0#0000001#ffd7ff255| |a+0#0000000#5fd7ff255|n|o|t|h|e|r| 
+0#0000001#ffd7ff255|║| +0#0000000#ffffff0@31
! |7| @30|║+0#0000001#ffd7ff255| @8|║| +0#0000000#ffffff0@31
! |8| @30|╚+0#0000001#ffd7ff255|═@8|╝| +0#0000000#ffffff0@31
  |9| @73
  @57|1|,|1| @10|T|o|p| 
--- 1,10 ----
  >1+0&#ffffff0| @73
! |2| @20|╔+0#0000001#ffd7ff255| |m|a|k|e| |a| |c|h|o|i|c|e| |f|r|o|m| |t|h|e| 
|l|i|s|t| |╗| +0#0000000#ffffff0@21
! |3| @20|║+0#0000001#ffd7ff255| @28|║| +0#0000000#ffffff0@21
! |4| @20|║+0#0000001#ffd7ff255| |o|n|e| @24|║| +0#0000000#ffffff0@21
! |5| @20|║+0#0000001#ffd7ff255| |t|w|o| @24|║| +0#0000000#ffffff0@21
! |6| @20|║+0#0000001#ffd7ff255| |a+0#0000000#5fd7ff255|n|o|t|h|e|r| 
+0#0000001#ffd7ff255@20|║| +0#0000000#ffffff0@21
! |7| @20|║+0#0000001#ffd7ff255| @28|║| +0#0000000#ffffff0@21
! |8| @20|╚+0#0000001#ffd7ff255|═@28|╝| +0#0000000#ffffff0@21
  |9| @73
  @57|1|,|1| @10|T|o|p| 
*** ../vim-8.1.1558/src/testdir/dumps/Test_popupwin_title.dump  2019-06-16 
20:06:33.506108857 +0200
--- src/testdir/dumps/Test_popupwin_title.dump  2019-06-16 20:02:24.884055376 
+0200
***************
*** 0 ****
--- 1,10 ----
+ >1+0&#ffffff0| @73
+ |2| @73
+ |3| @73
+ |4| @28| +0#0000001#ffd7ff255|T|i|t|l|e| |S|t|r|i|n|g| | +0#0000000#ffffff0@30
+ |5| @28|o+0#0000001#ffd7ff255|n|e| @10| +0#0000000#ffffff0@30
+ |6| @28|t+0#0000001#ffd7ff255|w|o| @10| +0#0000000#ffffff0@30
+ |7| @28|a+0#0000001#ffd7ff255|n|o|t|h|e|r| @6| +0#0000000#ffffff0@30
+ |8| @73
+ |9| @73
+ @57|1|,|1| @10|T|o|p| 
*** ../vim-8.1.1558/src/version.c       2019-06-16 19:05:08.714676794 +0200
--- src/version.c       2019-06-16 20:06:03.494328962 +0200
***************
*** 779,780 ****
--- 779,782 ----
  {   /* Add new patch number below this line */
+ /**/
+     1559,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
211. Your husband leaves you...taking the computer with him and you
     call him crying, and beg him to bring the computer back.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            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/201906161823.x5GINSCa027015%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui