Patch 8.1.1429
Problem:    "pos" option of popup window not supported yet.
Solution:   Implement the option. Rename popup_getposition() to
            popup_getpos().
Files:      src/structs.h, src/popupwin.c, src/proto/popupwin.pro,
            runtime/doc/popup.txt


*** ../vim-8.1.1428/src/structs.h       2019-05-30 00:11:48.704086357 +0200
--- src/structs.h       2019-05-30 19:48:48.436658475 +0200
***************
*** 1982,1987 ****
--- 1982,1996 ----
  //  # define CRYPT_NOT_INPLACE 1
  #endif
  
+ #ifdef FEAT_TEXT_PROP
+ typedef enum {
+     POPPOS_BOTLEFT,
+     POPPOS_TOPLEFT,
+     POPPOS_BOTRIGHT,
+     POPPOS_TOPRIGHT,
+     POPPOS_CENTER
+ } poppos_T;
+ #endif
  
  /*
   * These are items normally related to a buffer.  But when using ":ownsyntax"
***************
*** 2873,2879 ****
      int               w_vsep_width;       /* Number of separator columns (0 
or 1). */
      pos_save_T        w_save_cursor;      /* backup of cursor pos and topline 
*/
  #ifdef FEAT_TEXT_PROP
!     int               w_popup_flags;      // PFL_ values
      int               w_zindex;
      int               w_minheight;        // "minheight" for popup window
      int               w_minwidth;         // "minwidth" for popup window
--- 2882,2889 ----
      int               w_vsep_width;       /* Number of separator columns (0 
or 1). */
      pos_save_T        w_save_cursor;      /* backup of cursor pos and topline 
*/
  #ifdef FEAT_TEXT_PROP
!     int               w_popup_flags;      // POPF_ values
!     poppos_T  w_popup_pos;
      int               w_zindex;
      int               w_minheight;        // "minheight" for popup window
      int               w_minwidth;         // "minwidth" for popup window
*** ../vim-8.1.1428/src/popupwin.c      2019-05-30 19:24:57.615269014 +0200
--- src/popupwin.c      2019-05-30 21:18:23.603081264 +0200
***************
*** 15,26 ****
  
  #ifdef FEAT_TEXT_PROP
  
  /*
   * Get option value for"key", which is "line" or "col".
   * Handles "cursor+N" and "cursor-N".
   */
      static int
! popup_options_pos(dict_T *dict, char_u *key)
  {
      dictitem_T        *di;
      char_u    *val;
--- 15,39 ----
  
  #ifdef FEAT_TEXT_PROP
  
+ typedef struct {
+     char      *pp_name;
+     poppos_T  pp_val;
+ } poppos_entry_T;
+ 
+ static poppos_entry_T poppos_entries[] = {
+     {"botleft", POPPOS_BOTLEFT},
+     {"topleft", POPPOS_TOPLEFT},
+     {"botright", POPPOS_BOTRIGHT},
+     {"topright", POPPOS_TOPRIGHT},
+     {"center", POPPOS_CENTER}
+ };
+ 
  /*
   * Get option value for"key", which is "line" or "col".
   * Handles "cursor+N" and "cursor-N".
   */
      static int
! popup_options_one(dict_T *dict, char_u *key)
  {
      dictitem_T        *di;
      char_u    *val;
***************
*** 58,63 ****
--- 71,106 ----
      return n;
  }
  
+     static void
+ get_pos_options(win_T *wp, dict_T *dict)
+ {
+     char_u    *str;
+     int               nr;
+ 
+     nr = popup_options_one(dict, (char_u *)"line");
+     if (nr > 0)
+       wp->w_wantline = nr;
+     nr = popup_options_one(dict, (char_u *)"col");
+     if (nr > 0)
+       wp->w_wantcol = nr;
+ 
+     str = dict_get_string(dict, (char_u *)"pos", FALSE);
+     if (str != NULL)
+     {
+       for (nr = 0;
+               nr < (int)(sizeof(poppos_entries) / sizeof(poppos_entry_T));
+                                                                         ++nr)
+           if (STRCMP(str, poppos_entries[nr].pp_name) == 0)
+           {
+               wp->w_popup_pos = poppos_entries[nr].pp_val;
+               nr = -1;
+               break;
+           }
+       if (nr != -1)
+           semsg(_(e_invarg2), str);
+     }
+ }
+ 
  /*
   * Go through the options in "dict" and apply them to buffer "buf" displayed 
in
   * popup window "wp".
***************
*** 66,72 ****
--- 109,117 ----
      static void
  apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict, int atcursor)
  {
+ #if defined(FEAT_TIMERS)
      int           nr;
+ #endif
      char_u  *str;
  
      wp->w_minwidth = dict_get_number(dict, (char_u *)"minwidth");
***************
*** 76,92 ****
  
      if (atcursor)
      {
        setcursor_mayforce(TRUE);
        wp->w_wantline = screen_screenrow();
        wp->w_wantcol = screen_screencol() + 1;
      }
  
!     nr = popup_options_pos(dict, (char_u *)"line");
!     if (nr > 0)
!       wp->w_wantline = nr;
!     nr = popup_options_pos(dict, (char_u *)"col");
!     if (nr > 0)
!       wp->w_wantcol = nr;
  
      wp->w_zindex = dict_get_number(dict, (char_u *)"zindex");
  
--- 121,138 ----
  
      if (atcursor)
      {
+       wp->w_popup_pos = POPPOS_BOTLEFT;
        setcursor_mayforce(TRUE);
        wp->w_wantline = screen_screenrow();
+       if (wp->w_wantline == 0)  // cursor in first line
+       {
+           wp->w_wantline = 2;
+           wp->w_popup_pos = POPPOS_TOPLEFT;
+       }
        wp->w_wantcol = screen_screencol() + 1;
      }
  
!     get_pos_options(wp, dict);
  
      wp->w_zindex = dict_get_number(dict, (char_u *)"zindex");
  
***************
*** 212,235 ****
      linenr_T  lnum;
      int               wrapped = 0;
      int               maxwidth;
  
!     // TODO: Compute the size and position properly.
!     if (wp->w_wantline > 0)
!       wp->w_winrow = wp->w_wantline - 1;
      else
!       // TODO: better default
!       wp->w_winrow = Rows > 5 ? Rows / 2 - 2 : 0;
!     if (wp->w_winrow >= Rows)
!       wp->w_winrow = Rows - 1;
  
!     if (wp->w_wantcol > 0)
!       wp->w_wincol = wp->w_wantcol - 1;
!     else
!       // TODO: better default
!       wp->w_wincol = Columns > 20 ? Columns / 2 - 10 : 0;
!     if (wp->w_wincol >= Columns - 3)
!       wp->w_wincol = Columns - 3;
  
      maxwidth = Columns - wp->w_wincol;
      if (wp->w_maxwidth > 0 && maxwidth > wp->w_maxwidth)
        maxwidth = wp->w_maxwidth;
--- 258,299 ----
      linenr_T  lnum;
      int               wrapped = 0;
      int               maxwidth;
+     int               center_vert = FALSE;
+     int               center_hor = FALSE;
  
!     wp->w_winrow = 0;
!     wp->w_wincol = 0;
!     if (wp->w_popup_pos == POPPOS_CENTER)
!     {
!       // center after computing the size
!       center_vert = TRUE;
!       center_hor = TRUE;
!     }
      else
!     {
!       if (wp->w_wantline == 0)
!           center_vert = TRUE;
!       else if (wp->w_popup_pos == POPPOS_TOPLEFT
!               || wp->w_popup_pos == POPPOS_TOPRIGHT)
!       {
!           wp->w_winrow = wp->w_wantline - 1;
!           if (wp->w_winrow >= Rows)
!               wp->w_winrow = Rows - 1;
!       }
  
!       if (wp->w_wantcol == 0)
!           center_hor = TRUE;
!       else if (wp->w_popup_pos == POPPOS_TOPLEFT
!               || wp->w_popup_pos == POPPOS_BOTLEFT)
!       {
!           wp->w_wincol = wp->w_wantcol - 1;
!           if (wp->w_wincol >= Columns - 3)
!               wp->w_wincol = Columns - 3;
!       }
!     }
  
+     // When centering or right aligned, use maximum width.
+     // When left aligned use the space available.
      maxwidth = Columns - wp->w_wincol;
      if (wp->w_maxwidth > 0 && maxwidth > wp->w_maxwidth)
        maxwidth = wp->w_maxwidth;
***************
*** 255,260 ****
--- 319,334 ----
        wp->w_width = wp->w_minwidth;
      if (wp->w_width > maxwidth)
        wp->w_width = maxwidth;
+     if (center_hor)
+       wp->w_wincol = (Columns - wp->w_width) / 2;
+     else if (wp->w_popup_pos == POPPOS_BOTRIGHT
+           || wp->w_popup_pos == POPPOS_TOPRIGHT)
+     {
+       // Right aligned: move to the right if needed.
+       // No truncation, because that would change the height.
+       if (wp->w_width < wp->w_wantcol)
+           wp->w_wincol = wp->w_wantcol - wp->w_width;
+     }
  
      if (wp->w_height <= 1)
        wp->w_height = wp->w_buffer->b_ml.ml_line_count + wrapped;
***************
*** 265,270 ****
--- 339,357 ----
      if (wp->w_height > Rows - wp->w_winrow)
        wp->w_height = Rows - wp->w_winrow;
  
+     if (center_vert)
+       wp->w_winrow = (Rows - wp->w_height) / 2;
+     else if (wp->w_popup_pos == POPPOS_BOTRIGHT
+           || wp->w_popup_pos == POPPOS_BOTLEFT)
+     {
+       if (wp->w_height <= wp->w_wantline)
+           // bottom aligned: may move down
+           wp->w_winrow = wp->w_wantline - wp->w_height;
+       else
+           // not enough space, make top aligned
+           wp->w_winrow = wp->w_wantline + 1;
+     }
+ 
      wp->w_popup_last_changedtick = CHANGEDTICK(wp->w_buffer);
  }
  
***************
*** 304,310 ****
      if (wp == NULL)
        return;
      rettv->vval.v_number = wp->w_id;
!     wp->w_p_wrap = TRUE;  // 'wrap' is default on
  
      buf = buflist_new(NULL, NULL, (linenr_T)0, BLN_NEW|BLN_LISTED|BLN_DUMMY);
      if (buf == NULL)
--- 391,397 ----
      if (wp == NULL)
        return;
      rettv->vval.v_number = wp->w_id;
!     wp->w_popup_pos = POPPOS_TOPLEFT;
  
      buf = buflist_new(NULL, NULL, (linenr_T)0, BLN_NEW|BLN_LISTED|BLN_DUMMY);
      if (buf == NULL)
***************
*** 322,327 ****
--- 409,416 ----
      buf->b_p_swf = FALSE;   // no swap file
      buf->b_p_bl = FALSE;    // unlisted buffer
      buf->b_locked = TRUE;
+     wp->w_p_wrap = TRUE;  // 'wrap' is default on
+ 
      // Avoid that 'buftype' is reset when this buffer is entered.
      buf->b_p_initialized = TRUE;
  
***************
*** 578,588 ****
        wp->w_maxwidth = nr;
      if ((nr = dict_get_number(d, (char_u *)"maxheight")) > 0)
        wp->w_maxheight = nr;
!     if ((nr = dict_get_number(d, (char_u *)"line")) > 0)
!       wp->w_wantline = nr;
!     if ((nr = dict_get_number(d, (char_u *)"col")) > 0)
!       wp->w_wantcol = nr;
!     // TODO: "pos"
  
      if (wp->w_winrow + wp->w_height >= cmdline_row)
        clear_cmdline = TRUE;
--- 667,673 ----
        wp->w_maxwidth = nr;
      if ((nr = dict_get_number(d, (char_u *)"maxheight")) > 0)
        wp->w_maxheight = nr;
!     get_pos_options(wp, d);
  
      if (wp->w_winrow + wp->w_height >= cmdline_row)
        clear_cmdline = TRUE;
***************
*** 591,600 ****
  }
  
  /*
!  * popup_getposition({id})
   */
      void
! f_popup_getposition(typval_T *argvars, typval_T *rettv)
  {
      dict_T    *dict;
      int               id = (int)tv_get_number(argvars);
--- 676,685 ----
  }
  
  /*
!  * popup_getpos({id})
   */
      void
! f_popup_getpos(typval_T *argvars, typval_T *rettv)
  {
      dict_T    *dict;
      int               id = (int)tv_get_number(argvars);
***************
*** 623,628 ****
--- 708,714 ----
      dict_T    *dict;
      int               id = (int)tv_get_number(argvars);
      win_T     *wp = find_popup_win(id);
+     int               i;
  
      if (rettv_dict_alloc(rettv) == OK)
      {
***************
*** 637,642 ****
--- 723,738 ----
        dict_add_number(dict, "maxheight", wp->w_maxheight);
        dict_add_number(dict, "maxwidth", wp->w_maxwidth);
        dict_add_number(dict, "zindex", wp->w_zindex);
+ 
+       for (i = 0; i < (int)(sizeof(poppos_entries) / sizeof(poppos_entry_T));
+                                                                          ++i)
+           if (wp->w_popup_pos == poppos_entries[i].pp_val)
+           {
+               dict_add_string(dict, "pos",
+                                         (char_u *)poppos_entries[i].pp_name);
+               break;
+           }
+ 
  # if defined(FEAT_TIMERS)
        dict_add_number(dict, "time", wp->w_popup_timer != NULL
                                 ?  (long)wp->w_popup_timer->tr_interval : 0L);
*** ../vim-8.1.1428/src/proto/popupwin.pro      2019-05-30 19:24:57.615269014 
+0200
--- src/proto/popupwin.pro      2019-05-30 21:19:20.050800869 +0200
***************
*** 1,16 ****
  /* popupwin.c */
! int popup_any_visible(void);
! void close_all_popups(void);
! void ex_popupclear(exarg_T *eap);
  void f_popup_atcursor(typval_T *argvars, typval_T *rettv);
  void f_popup_close(typval_T *argvars, typval_T *rettv);
- void f_popup_create(typval_T *argvars, typval_T *rettv);
- void f_popup_getoptions(typval_T *argvars, typval_T *rettv);
- void f_popup_getposition(typval_T *argvars, typval_T *rettv);
  void f_popup_hide(typval_T *argvars, typval_T *rettv);
- void f_popup_move(typval_T *argvars, typval_T *rettv);
  void f_popup_show(typval_T *argvars, typval_T *rettv);
- void popup_adjust_position(win_T *wp);
  void popup_close(int id);
  void popup_close_tabpage(tabpage_T *tp, int id);
  /* vim: set ft=c : */
--- 1,16 ----
  /* popupwin.c */
! void popup_adjust_position(win_T *wp);
! void f_popup_create(typval_T *argvars, typval_T *rettv);
  void f_popup_atcursor(typval_T *argvars, typval_T *rettv);
+ int popup_any_visible(void);
  void f_popup_close(typval_T *argvars, typval_T *rettv);
  void f_popup_hide(typval_T *argvars, typval_T *rettv);
  void f_popup_show(typval_T *argvars, typval_T *rettv);
  void popup_close(int id);
  void popup_close_tabpage(tabpage_T *tp, int id);
+ void close_all_popups(void);
+ void ex_popupclear(exarg_T *eap);
+ void f_popup_move(typval_T *argvars, typval_T *rettv);
+ void f_popup_getpos(typval_T *argvars, typval_T *rettv);
+ void f_popup_getoptions(typval_T *argvars, typval_T *rettv);
  /* vim: set ft=c : */
*** ../vim-8.1.1428/runtime/doc/popup.txt       2019-05-30 19:24:57.615269014 
+0200
--- runtime/doc/popup.txt       2019-05-30 21:17:46.191262945 +0200
***************
*** 232,238 ****
  
  popup_getoptions({id})                                        
*popup_getoptions()*
                Return the {options} for popup {id} in a Dict.
!               A zero value means the option was not set.
  
                The "highlight" entry is omitted, use the 'wincolor' option
                for that: >
--- 232,239 ----
  
  popup_getoptions({id})                                        
*popup_getoptions()*
                Return the {options} for popup {id} in a Dict.
!               A zero value means the option was not set.  For "zindex" the
!               default value is returned, not zero.
  
                The "highlight" entry is omitted, use the 'wincolor' option
                for that: >
***************
*** 240,246 ****
  
  <             If popup window {id} is not found an empty Dict is returned.
  
! popup_getposition({id})                                       
*popup_getposition()*
                Return the position and size of popup {id}.  Returns a Dict
                with these entries:
                    col         screen column of the popup, one-based
--- 241,247 ----
  
  <             If popup window {id} is not found an empty Dict is returned.
  
! popup_getpos({id})                                    *popup_getpos()*
                Return the position and size of popup {id}.  Returns a Dict
                with these entries:
                    col         screen column of the popup, one-based
***************
*** 303,321 ****
                        |popup-props|.
  
  The second argument of |popup_create()| is a dictionary with options:
!       line            screen line where to position the popup; can use
!                       "cursor", "cursor+1" or "cursor-1" to use the line of
!                       the cursor and add or subtract a number of lines;
!                       default is "cursor-1".
!       col             screen column where to position the popup; can use
!                       "cursor" to use the column of the cursor, "cursor+99"
!                       and "cursor-99" to add or subtract a number of
!                       columns; default is "cursor"
        pos             "topleft", "topright", "botleft" or "botright":
                        defines what corner of the popup "line" and "col" are
                        used for.  When not set "topleft" is used.
                        Alternatively "center" can be used to position the
!                       popup in the center of the Vim window.
                        {not implemented yet}
        flip            when TRUE (the default) and the position is relative
                        to the cursor, flip to below or above the cursor to
--- 304,325 ----
                        |popup-props|.
  
  The second argument of |popup_create()| is a dictionary with options:
!       line            screen line where to position the popup; can use a
!                       number or "cursor", "cursor+1" or "cursor-1" to use
!                       the line of the cursor and add or subtract a number of
!                       lines; if omitted the popup is vertically centered,
!                       otherwise "pos" is used.
!       col             screen column where to position the popup; can use a
!                       number or "cursor" to use the column of the cursor,
!                       "cursor+99" and "cursor-99" to add or subtract a
!                       number of columns; if omitted the popup is
!                       horizontally centered, otherwise "pos" is used
        pos             "topleft", "topright", "botleft" or "botright":
                        defines what corner of the popup "line" and "col" are
                        used for.  When not set "topleft" is used.
                        Alternatively "center" can be used to position the
!                       popup in the center of the Vim window, in which case
!                       "line" and "col" are ignored.
                        {not implemented yet}
        flip            when TRUE (the default) and the position is relative
                        to the cursor, flip to below or above the cursor to
*** ../vim-8.1.1428/src/version.c       2019-05-30 19:24:57.615269014 +0200
--- src/version.c       2019-05-30 21:22:31.477803848 +0200
***************
*** 769,770 ****
--- 769,772 ----
  {   /* Add new patch number below this line */
+ /**/
+     1429,
  /**/

-- 
ERROR 047: Keyboard not found.  Press RETURN to continue.

 /// 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/201905301924.x4UJOi77010753%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui