mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -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:
@@ -90,6 +90,7 @@ Probably 2. is the best choice.
|
|||||||
|
|
||||||
IMPLEMENTATION:
|
IMPLEMENTATION:
|
||||||
- Code is in popupwin.c
|
- Code is in popupwin.c
|
||||||
|
- Fix positioning with border and padding.
|
||||||
- Why does 'nrformats' leak from the popup window buffer???
|
- Why does 'nrformats' leak from the popup window buffer???
|
||||||
- Make redrawing more efficient and avoid flicker.
|
- Make redrawing more efficient and avoid flicker.
|
||||||
Store popup info in a mask, use the mask in screen_line()
|
Store popup info in a mask, use the mask in screen_line()
|
||||||
@@ -133,10 +134,15 @@ popup_create({text}, {options}) *popup_create()*
|
|||||||
< In case of failure zero is returned.
|
< In case of failure zero is returned.
|
||||||
|
|
||||||
|
|
||||||
popup_close({id}) *popup_close()*
|
popup_close({id} [, {result}]) *popup_close()*
|
||||||
Close popup {id}. The window and the associated buffer will
|
Close popup {id}. The window and the associated buffer will
|
||||||
be deleted.
|
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()*
|
popup_dialog({text}, {options}) *popup_dialog()*
|
||||||
{not implemented yet}
|
{not implemented yet}
|
||||||
@@ -145,6 +151,7 @@ popup_dialog({text}, {options}) *popup_dialog()*
|
|||||||
\ 'pos': 'center',
|
\ 'pos': 'center',
|
||||||
\ 'zindex': 200,
|
\ 'zindex': 200,
|
||||||
\ 'border': [],
|
\ 'border': [],
|
||||||
|
\ 'padding': [],
|
||||||
\})
|
\})
|
||||||
< Use {options} to change the properties.
|
< Use {options} to change the properties.
|
||||||
|
|
||||||
@@ -166,6 +173,7 @@ popup_notification({text}, {options}) *popup_notification()*
|
|||||||
|
|
||||||
|
|
||||||
popup_atcursor({text}, {options}) *popup_atcursor()*
|
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
|
Show the {text} above the cursor, and close it when the cursor
|
||||||
moves. This works like: >
|
moves. This works like: >
|
||||||
call popup_create({text}, {
|
call popup_create({text}, {
|
||||||
@@ -394,7 +402,6 @@ The second argument of |popup_create()| is a dictionary with options:
|
|||||||
|popup-filter|
|
|popup-filter|
|
||||||
callback a callback to be used when the popup closes, e.g. when
|
callback a callback to be used when the popup closes, e.g. when
|
||||||
using |popup_filter_menu()|, see |popup-callback|.
|
using |popup_filter_menu()|, see |popup-callback|.
|
||||||
{not implemented yet}
|
|
||||||
|
|
||||||
Depending on the "zindex" the popup goes under or above other popups. The
|
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
|
completion menu (|popup-menu|) has zindex 100. For messages that occur for a
|
||||||
@@ -477,11 +484,12 @@ Vim recognizes the Esc key. If you do use Esc, it is reecommended to set the
|
|||||||
|
|
||||||
POPUP CALLBACK *popup-callback*
|
POPUP CALLBACK *popup-callback*
|
||||||
|
|
||||||
{not implemented yet}
|
|
||||||
A callback that is invoked when the popup closes. Used by
|
A callback that is invoked when the popup closes. Used by
|
||||||
|popup_filter_menu()|. Invoked with two arguments: the ID of the popup and
|
|popup_filter_menu()|.
|
||||||
the result, which would usually be an index in the popup lines, or whatever
|
|
||||||
the filter wants to pass.
|
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*
|
3. Examples *popup-examples*
|
||||||
|
@@ -810,7 +810,7 @@ static struct fst
|
|||||||
#endif
|
#endif
|
||||||
#ifdef FEAT_TEXT_PROP
|
#ifdef FEAT_TEXT_PROP
|
||||||
{"popup_atcursor", 2, 2, f_popup_atcursor},
|
{"popup_atcursor", 2, 2, f_popup_atcursor},
|
||||||
{"popup_close", 1, 1, f_popup_close},
|
{"popup_close", 1, 2, f_popup_close},
|
||||||
{"popup_create", 2, 2, f_popup_create},
|
{"popup_create", 2, 2, f_popup_create},
|
||||||
{"popup_getoptions", 1, 1, f_popup_getoptions},
|
{"popup_getoptions", 1, 1, f_popup_getoptions},
|
||||||
{"popup_getpos", 1, 1, f_popup_getpos},
|
{"popup_getpos", 1, 1, f_popup_getpos},
|
||||||
|
@@ -201,6 +201,15 @@ apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict, int atcursor)
|
|||||||
wp->w_p_wrap = nr != 0;
|
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);
|
di = dict_find(dict, (char_u *)"filter", -1);
|
||||||
if (di != NULL)
|
if (di != NULL)
|
||||||
{
|
{
|
||||||
@@ -631,6 +640,37 @@ popup_any_visible(void)
|
|||||||
return FALSE;
|
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})
|
* popup_close({id})
|
||||||
*/
|
*/
|
||||||
@@ -638,8 +678,16 @@ popup_any_visible(void)
|
|||||||
f_popup_close(typval_T *argvars, typval_T *rettv UNUSED)
|
f_popup_close(typval_T *argvars, typval_T *rettv UNUSED)
|
||||||
{
|
{
|
||||||
int id = (int)tv_get_number(argvars);
|
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.
|
* Close a popup window by Window-id.
|
||||||
|
* Does not invoke the callback.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
popup_close(int id)
|
popup_close(int id)
|
||||||
|
@@ -2894,6 +2894,7 @@ struct window_S
|
|||||||
int w_border_char[8]; // popup border characters
|
int w_border_char[8]; // popup border characters
|
||||||
varnumber_T w_popup_last_changedtick; // b:changedtick when position was
|
varnumber_T w_popup_last_changedtick; // b:changedtick when position was
|
||||||
// computed
|
// computed
|
||||||
|
callback_T w_close_cb; // popup close callback
|
||||||
callback_T w_filter_cb; // popup filter callback
|
callback_T w_filter_cb; // popup filter callback
|
||||||
# if defined(FEAT_TIMERS)
|
# if defined(FEAT_TIMERS)
|
||||||
timer_T *w_popup_timer; // timer for closing popup window
|
timer_T *w_popup_timer; // timer for closing popup window
|
||||||
|
@@ -586,3 +586,13 @@ func Test_popup_filter()
|
|||||||
delfunc MyPopupFilter
|
delfunc MyPopupFilter
|
||||||
popupclear
|
popupclear
|
||||||
endfunc
|
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
|
||||||
|
@@ -767,6 +767,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1446,
|
||||||
/**/
|
/**/
|
||||||
1445,
|
1445,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -4845,6 +4845,7 @@ win_free(
|
|||||||
remove_winbar(wp);
|
remove_winbar(wp);
|
||||||
#endif
|
#endif
|
||||||
#ifdef FEAT_TEXT_PROP
|
#ifdef FEAT_TEXT_PROP
|
||||||
|
free_callback(&wp->w_close_cb);
|
||||||
free_callback(&wp->w_filter_cb);
|
free_callback(&wp->w_filter_cb);
|
||||||
for (i = 0; i < 4; ++i)
|
for (i = 0; i < 4; ++i)
|
||||||
VIM_CLEAR(wp->w_border_highlight[i]);
|
VIM_CLEAR(wp->w_border_highlight[i]);
|
||||||
|
Reference in New Issue
Block a user