Patch 8.1.1446
Problem:    Popup window callback not implemented yet.
Solution:   Implement the callback.
Files:      runtime/doc/popup.txt, src/popupwin.c, src/structs.h,
            src/evalfunc.c, src/window.c, src/testdir/test_popupwin.vim


*** ../vim-8.1.1445/runtime/doc/popup.txt       2019-06-01 22:15:10.215177111 
+0200
--- runtime/doc/popup.txt       2019-06-01 22:45:17.811027656 +0200
***************
*** 90,95 ****
--- 90,96 ----
  
  IMPLEMENTATION:
  - Code is in popupwin.c
+ - Fix positioning with border and padding.
  - Why does 'nrformats' leak from the popup window buffer???
  - Make redrawing more efficient and avoid flicker.
      Store popup info in a mask, use the mask in screen_line()
***************
*** 133,142 ****
  <             In case of failure zero is returned.
  
  
! popup_close({id})                                     *popup_close()*
                Close popup {id}.  The window and the associated buffer will
                be deleted.
  
  
  popup_dialog({text}, {options})                               *popup_dialog()*
                {not implemented yet}
--- 134,148 ----
  <             In case of failure zero is returned.
  
  
! popup_close({id} [, {result}])                                *popup_close()*
                Close popup {id}.  The window and the associated buffer will
                be deleted.
  
+               If the popup has a callback it will be called just before the
+               popup window is deleted.  If the optional {result} is present
+               it will be passed as the second argument of the callback.
+               Otherwise zero is passed to the callback.
+ 
  
  popup_dialog({text}, {options})                               *popup_dialog()*
                {not implemented yet}
***************
*** 145,150 ****
--- 151,157 ----
                                \ 'pos': 'center',
                                \ 'zindex': 200,
                                \ 'border': [],
+                               \ 'padding': [],
                                \})
  <             Use {options} to change the properties.
  
***************
*** 166,171 ****
--- 173,179 ----
  
  
  popup_atcursor({text}, {options})                      *popup_atcursor()*
+               {not implemented yet: close when cursor moves}
                Show the {text} above the cursor, and close it when the cursor
                moves.  This works like: >
                        call popup_create({text}, {
***************
*** 394,400 ****
                        |popup-filter|
        callback        a callback to be used when the popup closes, e.g. when
                        using |popup_filter_menu()|, see |popup-callback|.
-                       {not implemented yet}
  
  Depending on the "zindex" the popup goes under or above other popups.  The
  completion menu (|popup-menu|) has zindex 100.  For messages that occur for a
--- 402,407 ----
***************
*** 477,487 ****
  
  POPUP CALLBACK                                                *popup-callback*
  
- {not implemented yet}
  A callback that is invoked when the popup closes.  Used by
! |popup_filter_menu()|.  Invoked with two arguments: the ID of the popup and
! the result, which would usually be an index in the popup lines, or whatever
! the filter wants to pass.
  
  ==============================================================================
  3. Examples                                           *popup-examples*
--- 484,495 ----
  
  POPUP CALLBACK                                                *popup-callback*
  
  A callback that is invoked when the popup closes.  Used by
! |popup_filter_menu()|.
! 
! The callback is invoked with two arguments: the ID of the popup window and the
! result, which could be an index in the popup lines, or whatever was passed as
! the second argument of `popup_close()`.
  
  ==============================================================================
  3. Examples                                           *popup-examples*
*** ../vim-8.1.1445/src/popupwin.c      2019-06-01 22:15:10.211177120 +0200
--- src/popupwin.c      2019-06-01 22:38:42.421014923 +0200
***************
*** 201,206 ****
--- 201,215 ----
        wp->w_p_wrap = nr != 0;
      }
  
+     di = dict_find(dict, (char_u *)"callback", -1);
+     if (di != NULL)
+     {
+       callback_T      callback = get_callback(&di->di_tv);
+ 
+       if (callback.cb_name != NULL)
+           set_callback(&wp->w_close_cb, &callback);
+     }
+ 
      di = dict_find(dict, (char_u *)"filter", -1);
      if (di != NULL)
      {
***************
*** 632,645 ****
  }
  
  /*
   * popup_close({id})
   */
      void
  f_popup_close(typval_T *argvars, typval_T *rettv UNUSED)
  {
      int               id = (int)tv_get_number(argvars);
  
!     popup_close(id);
  }
  
  /*
--- 641,693 ----
  }
  
  /*
+  * Invoke the close callback for window "wp" with value "result".
+  * Careful: The callback may make "wp" invalid!
+  */
+     static void
+ invoke_popup_callback(win_T *wp, typval_T *result)
+ {
+     typval_T  rettv;
+     int               dummy;
+     typval_T  argv[3];
+ 
+     argv[0].v_type = VAR_NUMBER;
+     argv[0].vval.v_number = (varnumber_T)wp->w_id;
+ 
+     if (result != NULL && result->v_type != VAR_UNKNOWN)
+       copy_tv(result, &argv[1]);
+     else
+     {
+       argv[1].v_type = VAR_NUMBER;
+       argv[1].vval.v_number = 0;
+     }
+ 
+     argv[2].v_type = VAR_UNKNOWN;
+ 
+     call_callback(&wp->w_close_cb, -1,
+                           &rettv, 2, argv, NULL, 0L, 0L, &dummy, TRUE, NULL);
+     if (result != NULL)
+       clear_tv(&argv[1]);
+     clear_tv(&rettv);
+ }
+ 
+ /*
   * popup_close({id})
   */
      void
  f_popup_close(typval_T *argvars, typval_T *rettv UNUSED)
  {
      int               id = (int)tv_get_number(argvars);
+     win_T     *wp = find_popup_win(id);
  
!     if (wp != NULL)
!     {
!       if (wp->w_close_cb.cb_name != NULL)
!           // Careful: This may make "wp" invalid.
!           invoke_popup_callback(wp, &argvars[1]);
! 
!       popup_close(id);
!     }
  }
  
  /*
***************
*** 688,693 ****
--- 736,742 ----
  
  /*
   * Close a popup window by Window-id.
+  * Does not invoke the callback.
   */
      void
  popup_close(int id)
*** ../vim-8.1.1445/src/structs.h       2019-06-01 22:15:10.211177120 +0200
--- src/structs.h       2019-06-01 22:36:44.253601570 +0200
***************
*** 2894,2899 ****
--- 2894,2900 ----
      int               w_border_char[8];   // popup border characters
      varnumber_T       w_popup_last_changedtick; // b:changedtick when 
position was
                                          // computed
+     callback_T        w_close_cb;         // popup close callback
      callback_T        w_filter_cb;        // popup filter callback
  # if defined(FEAT_TIMERS)
      timer_T   *w_popup_timer;     // timer for closing popup window
*** ../vim-8.1.1445/src/evalfunc.c      2019-06-01 13:28:30.265829531 +0200
--- src/evalfunc.c      2019-06-01 22:23:58.965206463 +0200
***************
*** 810,816 ****
  #endif
  #ifdef FEAT_TEXT_PROP
      {"popup_atcursor",        2, 2, f_popup_atcursor},
!     {"popup_close",   1, 1, f_popup_close},
      {"popup_create",  2, 2, f_popup_create},
      {"popup_getoptions", 1, 1, f_popup_getoptions},
      {"popup_getpos",  1, 1, f_popup_getpos},
--- 810,816 ----
  #endif
  #ifdef FEAT_TEXT_PROP
      {"popup_atcursor",        2, 2, f_popup_atcursor},
!     {"popup_close",   1, 2, f_popup_close},
      {"popup_create",  2, 2, f_popup_create},
      {"popup_getoptions", 1, 1, f_popup_getoptions},
      {"popup_getpos",  1, 1, f_popup_getpos},
*** ../vim-8.1.1445/src/window.c        2019-06-01 22:15:10.215177111 +0200
--- src/window.c        2019-06-01 22:36:56.873539136 +0200
***************
*** 4845,4850 ****
--- 4845,4851 ----
      remove_winbar(wp);
  #endif
  #ifdef FEAT_TEXT_PROP
+     free_callback(&wp->w_close_cb);
      free_callback(&wp->w_filter_cb);
      for (i = 0; i < 4; ++i)
        VIM_CLEAR(wp->w_border_highlight[i]);
*** ../vim-8.1.1445/src/testdir/test_popupwin.vim       2019-06-01 
22:15:10.215177111 +0200
--- src/testdir/test_popupwin.vim       2019-06-01 22:41:48.592082968 +0200
***************
*** 586,588 ****
--- 586,598 ----
    delfunc MyPopupFilter
    popupclear
  endfunc
+ 
+ func Test_popup_close_callback()
+   func PopupDone(id, result)
+     let g:result = a:result
+   endfunc
+   let winid = popup_create('something', {'callback': 'PopupDone'})
+   redraw
+   call popup_close(winid, 'done')
+   call assert_equal('done', g:result)
+ endfunc
*** ../vim-8.1.1445/src/version.c       2019-06-01 22:15:10.215177111 +0200
--- src/version.c       2019-06-01 22:48:33.361971805 +0200
***************
*** 769,770 ****
--- 769,772 ----
  {   /* Add new patch number below this line */
+ /**/
+     1446,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
82. AT&T names you Customer of the Month for the third consecutive time.

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

Raspunde prin e-mail lui