diff options
Diffstat (limited to 'data/vim/patches/8.1.1446')
-rw-r--r-- | data/vim/patches/8.1.1446 | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1446 b/data/vim/patches/8.1.1446 new file mode 100644 index 000000000..e59f072a4 --- /dev/null +++ b/data/vim/patches/8.1.1446 @@ -0,0 +1,291 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1446 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +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 -- Bram@Moolenaar.net -- 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 /// |