Mercurial > vim
diff src/popupwin.c @ 16890:5131023c5728 v8.1.1446
patch 8.1.1446: popup window callback not implemented yet
commit https://github.com/vim/vim/commit/9eaac896501bcd6abdd430a90293eae8101df24a
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jun 1 22:49:29 2019 +0200
patch 8.1.1446: popup window callback not implemented yet
Problem: Popup window callback not implemented yet.
Solution: Implement the callback.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 01 Jun 2019 23:00:06 +0200 |
parents | ec61b6b79865 |
children | 60c9ac14a2ec |
line wrap: on
line diff
--- a/src/popupwin.c +++ b/src/popupwin.c @@ -201,6 +201,15 @@ apply_options(win_T *wp, buf_T *buf UNUS 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,14 +641,53 @@ popup_any_visible(void) } /* + * 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); - 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)