0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.1.1446: popup window callback not implemented yet

Problem:    Popup window callback not implemented yet.
Solution:   Implement the callback.
This commit is contained in:
Bram Moolenaar
2019-06-01 22:49:29 +02:00
parent 790498b509
commit 9eaac89650
7 changed files with 79 additions and 8 deletions

View File

@@ -201,6 +201,15 @@ apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict, int atcursor)
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)
{
@@ -631,6 +640,37 @@ popup_any_visible(void)
return FALSE;
}
/*
* 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})
*/
@@ -638,8 +678,16 @@ popup_any_visible(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);
popup_close(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,6 +736,7 @@ popup_free(win_T *wp)
/*
* Close a popup window by Window-id.
* Does not invoke the callback.
*/
void
popup_close(int id)