mirror of
https://github.com/vim/vim.git
synced 2025-10-01 04:54:07 -04:00
patch 8.1.1574: tabpage option not yet implemented for popup window
Problem: Tabpage option not yet implemented for popup window. Solution: Implement tabpage option, also for popup_getoptions().
This commit is contained in:
@@ -88,12 +88,17 @@ that it is in.
|
|||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- Why does 'nrformats' leak from the popup window buffer???
|
- Why does 'nrformats' leak from the popup window buffer???
|
||||||
|
- When the lines do not fit show a scrollbar (like in the popup menu).
|
||||||
|
Use the mouse wheel for scrolling.
|
||||||
- Disable commands, feedkeys(), CTRL-W, etc. in a popup window.
|
- Disable commands, feedkeys(), CTRL-W, etc. in a popup window.
|
||||||
Use ERROR_IF_POPUP_WINDOW for more commands.
|
Use ERROR_IF_POPUP_WINDOW for more commands.
|
||||||
- Add 'balloonpopup': instead of showing text, let the callback open a popup
|
- Add 'balloonpopup': instead of showing text, let the callback open a popup
|
||||||
window and return the window ID. The popup will then be closed when the
|
window and return the window ID. The popup will then be closed when the
|
||||||
mouse moves, except when it moves inside the popup.
|
mouse moves, except when it moves inside the popup.
|
||||||
- For the "moved" property also include mouse movement?
|
- For the "moved" property also include mouse movement?
|
||||||
|
- Can the buffer be re-used, to avoid using up lots of buffer numbers?
|
||||||
|
- Have an option to attach the popup to a text position, like text properties
|
||||||
|
do. (#4560)
|
||||||
- Make redrawing more efficient and avoid flicker:
|
- Make redrawing more efficient and avoid flicker:
|
||||||
- put popup menu also put in popup_mask?
|
- put popup menu also put in popup_mask?
|
||||||
- Invoke filter with character before mapping?
|
- Invoke filter with character before mapping?
|
||||||
@@ -102,17 +107,12 @@ TODO:
|
|||||||
if wrapping inserts indent
|
if wrapping inserts indent
|
||||||
- When drawing on top half a double-wide character, display ">" or "<" in the
|
- When drawing on top half a double-wide character, display ">" or "<" in the
|
||||||
incomplete cell.
|
incomplete cell.
|
||||||
- Can the buffer be re-used, to avoid using up lots of buffer numbers?
|
|
||||||
- Use a popup window for the "info" item of completion instead of using a
|
- Use a popup window for the "info" item of completion instead of using a
|
||||||
preview window. Ideas in issue #4544.
|
preview window. Ideas in issue #4544.
|
||||||
How to add highlighting?
|
How to add highlighting?
|
||||||
- When the lines do not fit show a scrollbar (like in the popup menu).
|
|
||||||
Use the mouse wheel for scrolling.
|
|
||||||
- Implement:
|
- Implement:
|
||||||
tabpage option with number
|
|
||||||
flip option
|
flip option
|
||||||
transparent text property
|
transparent area, to minimize covering text. Define rectangles?
|
||||||
|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
2. Functions *popup-functions*
|
2. Functions *popup-functions*
|
||||||
@@ -123,7 +123,7 @@ Creating a popup window:
|
|||||||
|popup_create()| centered in the screen
|
|popup_create()| centered in the screen
|
||||||
|popup_atcursor()| just above the cursor position, closes when
|
|popup_atcursor()| just above the cursor position, closes when
|
||||||
the cursor moves away
|
the cursor moves away
|
||||||
|popup_notifiation()| show a notification for three seconds
|
|popup_notification()| show a notification for three seconds
|
||||||
|popup_dialog()| centered with padding and border
|
|popup_dialog()| centered with padding and border
|
||||||
|popup_menu()| prompt for selecting an item from a list
|
|popup_menu()| prompt for selecting an item from a list
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ popup_atcursor({text}, {options}) *popup_atcursor()*
|
|||||||
|
|
||||||
*popup_clear()*
|
*popup_clear()*
|
||||||
popup_clear() Emergency solution to a misbehaving plugin: close all popup
|
popup_clear() Emergency solution to a misbehaving plugin: close all popup
|
||||||
windows.
|
windows for the current tab and global popups.
|
||||||
|
|
||||||
|
|
||||||
popup_close({id} [, {result}]) *popup_close()*
|
popup_close({id} [, {result}]) *popup_close()*
|
||||||
@@ -230,6 +230,9 @@ popup_filter_menu({id}, {key}) *popup_filter_menu()*
|
|||||||
the second argument. The first entry has index one.
|
the second argument. The first entry has index one.
|
||||||
Cancelling the menu invokes the callback with -1.
|
Cancelling the menu invokes the callback with -1.
|
||||||
|
|
||||||
|
To add shortcut keys, see the example here:
|
||||||
|
|popup_menu-shortcut-example|
|
||||||
|
|
||||||
|
|
||||||
popup_filter_yesno({id}, {key}) *popup_filter_yesno()*
|
popup_filter_yesno({id}, {key}) *popup_filter_yesno()*
|
||||||
Filter that can be used for a popup. It handles only the keys
|
Filter that can be used for a popup. It handles only the keys
|
||||||
@@ -238,6 +241,7 @@ popup_filter_yesno({id}, {key}) *popup_filter_yesno()*
|
|||||||
as the second argument. Pressing Esc and 'x' works like
|
as the second argument. Pressing Esc and 'x' works like
|
||||||
pressing 'n'. CTRL-C invokes the callback with -1. Other
|
pressing 'n'. CTRL-C invokes the callback with -1. Other
|
||||||
keys are ignored.
|
keys are ignored.
|
||||||
|
See the example here: |popup_dialog-example|
|
||||||
|
|
||||||
|
|
||||||
popup_getoptions({id}) *popup_getoptions()*
|
popup_getoptions({id}) *popup_getoptions()*
|
||||||
@@ -253,6 +257,10 @@ popup_getoptions({id}) *popup_getoptions()*
|
|||||||
|
|
||||||
"borderhighlight" is not included when all values are empty.
|
"borderhighlight" is not included when all values are empty.
|
||||||
|
|
||||||
|
"tabpage" will be -1 for a global popup, zero for a popup on
|
||||||
|
the current tabpage and a positive number for a popup on
|
||||||
|
another tabpage.
|
||||||
|
|
||||||
If popup window {id} is not found an empty Dict is returned.
|
If popup window {id} is not found an empty Dict is returned.
|
||||||
|
|
||||||
|
|
||||||
@@ -390,7 +398,7 @@ manipulation is restricted:
|
|||||||
- 'bufhidden' is "hide"
|
- 'bufhidden' is "hide"
|
||||||
- 'buflisted' is off
|
- 'buflisted' is off
|
||||||
- 'undolevels' is -1: no undo at all
|
- 'undolevels' is -1: no undo at all
|
||||||
- all other buffer-local and window_local options are set to their Vim default
|
- all other buffer-local and window-local options are set to their Vim default
|
||||||
value.
|
value.
|
||||||
|
|
||||||
It is possible to change the specifically mentioned options, but anything
|
It is possible to change the specifically mentioned options, but anything
|
||||||
@@ -474,8 +482,8 @@ The second argument of |popup_create()| is a dictionary with options:
|
|||||||
When 0 (the default): display the popup on the current
|
When 0 (the default): display the popup on the current
|
||||||
tab page.
|
tab page.
|
||||||
Otherwise the number of the tab page the popup is
|
Otherwise the number of the tab page the popup is
|
||||||
displayed on; when invalid the current tab page is used.
|
displayed on; when invalid the popup is not created
|
||||||
{only -1 and 0 are implemented}
|
and an error is given. *E996*
|
||||||
title Text to be displayed above the first item in the
|
title Text to be displayed above the first item in the
|
||||||
popup, on top of any border. If there is no top
|
popup, on top of any border. If there is no top
|
||||||
border one line of padding is added to put the title
|
border one line of padding is added to put the title
|
||||||
@@ -515,8 +523,8 @@ The second argument of |popup_create()| is a dictionary with options:
|
|||||||
When the list has two characters the first is used for
|
When the list has two characters the first is used for
|
||||||
the border lines, the second for the corners.
|
the border lines, the second for the corners.
|
||||||
By default a double line is used all around when
|
By default a double line is used all around when
|
||||||
'encoding' is "utf-8", otherwise ASCII characters are
|
'encoding' is "utf-8" and 'ambiwidth' is "single,
|
||||||
used.
|
otherwise ASCII characters are used.
|
||||||
zindex Priority for the popup, default 50. Minimum value is
|
zindex Priority for the popup, default 50. Minimum value is
|
||||||
1, maximum value is 32000.
|
1, maximum value is 32000.
|
||||||
time Time in milliseconds after which the popup will close.
|
time Time in milliseconds after which the popup will close.
|
||||||
@@ -628,7 +636,7 @@ pressed, the number -1 is passed to the callback.
|
|||||||
3. Examples *popup-examples*
|
3. Examples *popup-examples*
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
|
*popup_dialog-example*
|
||||||
Prompt the user to press y/Y or n/N: >
|
Prompt the user to press y/Y or n/N: >
|
||||||
|
|
||||||
func MyDialogHandler(id, result)
|
func MyDialogHandler(id, result)
|
||||||
@@ -637,10 +645,37 @@ Prompt the user to press y/Y or n/N: >
|
|||||||
endif
|
endif
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
call popup_create(['Continue? y/n'], {
|
call popup_dialog('Continue? y/n', {
|
||||||
\ 'filter': 'popup_filter_yesno',
|
\ 'filter': 'popup_filter_yesno',
|
||||||
\ 'callback': 'MyDialogHandler',
|
\ 'callback': 'MyDialogHandler',
|
||||||
\ })
|
\ })
|
||||||
<
|
<
|
||||||
|
*popup_menu-shortcut-example*
|
||||||
|
Extend popup_filter_menu() with shortcut keys: >
|
||||||
|
|
||||||
|
call popup_menu('Save', 'Cancel', 'Discard'], {
|
||||||
|
\ 'filter': 'MyMenuFilter',
|
||||||
|
\ 'callback': 'MyMenuHandler',
|
||||||
|
\ })
|
||||||
|
|
||||||
|
func MyMenuFilter(id, key)
|
||||||
|
" Handle shortcuts
|
||||||
|
if a:key == 'S'
|
||||||
|
call popup_close(a:id, 1)
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
if a:key == 'C'
|
||||||
|
call popup_close(a:id, 2)
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
if a:key == 'D'
|
||||||
|
call popup_close(a:id, 3)
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
" No shortcut, pass to generic filter
|
||||||
|
return popup_filter_menu(a:id, a:key)
|
||||||
|
endfunc
|
||||||
|
<
|
||||||
|
|
||||||
vim:tw=78:ts=8:noet:ft=help:norl:
|
vim:tw=78:ts=8:noet:ft=help:norl:
|
||||||
|
@@ -828,6 +828,8 @@ popup_set_buffer_text(buf_T *buf, typval_T text)
|
|||||||
popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
|
popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
|
||||||
{
|
{
|
||||||
win_T *wp;
|
win_T *wp;
|
||||||
|
tabpage_T *tp = NULL;
|
||||||
|
int tabnr;
|
||||||
buf_T *buf;
|
buf_T *buf;
|
||||||
dict_T *d;
|
dict_T *d;
|
||||||
int nr;
|
int nr;
|
||||||
@@ -847,6 +849,22 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
|
|||||||
}
|
}
|
||||||
d = argvars[1].vval.v_dict;
|
d = argvars[1].vval.v_dict;
|
||||||
|
|
||||||
|
if (dict_find(d, (char_u *)"tabpage", -1) != NULL)
|
||||||
|
tabnr = (int)dict_get_number(d, (char_u *)"tabpage");
|
||||||
|
else if (type == TYPE_NOTIFICATION)
|
||||||
|
tabnr = -1; // notifications are global by default
|
||||||
|
else
|
||||||
|
tabnr = 0;
|
||||||
|
if (tabnr > 0)
|
||||||
|
{
|
||||||
|
tp = find_tabpage(tabnr);
|
||||||
|
if (tp == NULL)
|
||||||
|
{
|
||||||
|
semsg(_("E996: Tabpage not found: %d"), tabnr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create the window and buffer.
|
// Create the window and buffer.
|
||||||
wp = win_alloc_popup_win();
|
wp = win_alloc_popup_win();
|
||||||
if (wp == NULL)
|
if (wp == NULL)
|
||||||
@@ -875,20 +893,19 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
|
|||||||
// Avoid that 'buftype' is reset when this buffer is entered.
|
// Avoid that 'buftype' is reset when this buffer is entered.
|
||||||
buf->b_p_initialized = TRUE;
|
buf->b_p_initialized = TRUE;
|
||||||
|
|
||||||
if (dict_find(d, (char_u *)"tabpage", -1) != NULL)
|
if (tp != NULL)
|
||||||
nr = (int)dict_get_number(d, (char_u *)"tabpage");
|
{
|
||||||
else if (type == TYPE_NOTIFICATION)
|
// popup on specified tab page
|
||||||
nr = -1; // notifications are global by default
|
wp->w_next = tp->tp_first_popupwin;
|
||||||
else
|
tp->tp_first_popupwin = wp;
|
||||||
nr = 0;
|
}
|
||||||
|
else if (tabnr == 0)
|
||||||
if (nr == 0)
|
|
||||||
{
|
{
|
||||||
// popup on current tab page
|
// popup on current tab page
|
||||||
wp->w_next = curtab->tp_first_popupwin;
|
wp->w_next = curtab->tp_first_popupwin;
|
||||||
curtab->tp_first_popupwin = wp;
|
curtab->tp_first_popupwin = wp;
|
||||||
}
|
}
|
||||||
else if (nr < 0)
|
else // (tabnr < 0)
|
||||||
{
|
{
|
||||||
win_T *prev = first_popupwin;
|
win_T *prev = first_popupwin;
|
||||||
|
|
||||||
@@ -903,9 +920,6 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
|
|||||||
prev->w_next = wp;
|
prev->w_next = wp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
// TODO: find tab page "nr"
|
|
||||||
emsg("Not implemented yet");
|
|
||||||
|
|
||||||
popup_set_buffer_text(buf, argvars[0]);
|
popup_set_buffer_text(buf, argvars[0]);
|
||||||
|
|
||||||
@@ -1592,6 +1606,7 @@ f_popup_getoptions(typval_T *argvars, typval_T *rettv)
|
|||||||
dict_T *dict;
|
dict_T *dict;
|
||||||
int id = (int)tv_get_number(argvars);
|
int id = (int)tv_get_number(argvars);
|
||||||
win_T *wp = find_popup_win(id);
|
win_T *wp = find_popup_win(id);
|
||||||
|
tabpage_T *tp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (rettv_dict_alloc(rettv) == OK)
|
if (rettv_dict_alloc(rettv) == OK)
|
||||||
@@ -1614,6 +1629,25 @@ f_popup_getoptions(typval_T *argvars, typval_T *rettv)
|
|||||||
dict_add_number(dict, "drag", wp->w_popup_drag);
|
dict_add_number(dict, "drag", wp->w_popup_drag);
|
||||||
dict_add_string(dict, "highlight", wp->w_p_wcr);
|
dict_add_string(dict, "highlight", wp->w_p_wcr);
|
||||||
|
|
||||||
|
// find the tabpage that holds this popup
|
||||||
|
i = 1;
|
||||||
|
FOR_ALL_TABPAGES(tp)
|
||||||
|
{
|
||||||
|
win_T *p;
|
||||||
|
|
||||||
|
for (p = tp->tp_first_popupwin; p != NULL; p = wp->w_next)
|
||||||
|
if (p->w_id == id)
|
||||||
|
break;
|
||||||
|
if (p != NULL)
|
||||||
|
break;
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
if (tp == NULL)
|
||||||
|
i = -1; // must be global
|
||||||
|
else if (tp == curtab)
|
||||||
|
i = 0;
|
||||||
|
dict_add_number(dict, "tabpage", i);
|
||||||
|
|
||||||
get_padding_border(dict, wp->w_popup_padding, "padding");
|
get_padding_border(dict, wp->w_popup_padding, "padding");
|
||||||
get_padding_border(dict, wp->w_popup_border, "border");
|
get_padding_border(dict, wp->w_popup_border, "border");
|
||||||
get_borderhighlight(dict, wp);
|
get_borderhighlight(dict, wp);
|
||||||
|
@@ -398,8 +398,10 @@ func Test_popup_in_tab()
|
|||||||
let winid = popup_create("text", {})
|
let winid = popup_create("text", {})
|
||||||
let bufnr = winbufnr(winid)
|
let bufnr = winbufnr(winid)
|
||||||
call assert_equal(1, popup_getpos(winid).visible)
|
call assert_equal(1, popup_getpos(winid).visible)
|
||||||
|
call assert_equal(0, popup_getoptions(winid).tabpage)
|
||||||
tabnew
|
tabnew
|
||||||
call assert_equal(0, popup_getpos(winid).visible)
|
call assert_equal(0, popup_getpos(winid).visible)
|
||||||
|
call assert_equal(1, popup_getoptions(winid).tabpage)
|
||||||
quit
|
quit
|
||||||
call assert_equal(1, popup_getpos(winid).visible)
|
call assert_equal(1, popup_getpos(winid).visible)
|
||||||
|
|
||||||
@@ -411,11 +413,23 @@ func Test_popup_in_tab()
|
|||||||
" global popup is visible in any tab
|
" global popup is visible in any tab
|
||||||
let winid = popup_create("text", {'tabpage': -1})
|
let winid = popup_create("text", {'tabpage': -1})
|
||||||
call assert_equal(1, popup_getpos(winid).visible)
|
call assert_equal(1, popup_getpos(winid).visible)
|
||||||
|
call assert_equal(-1, popup_getoptions(winid).tabpage)
|
||||||
tabnew
|
tabnew
|
||||||
call assert_equal(1, popup_getpos(winid).visible)
|
call assert_equal(1, popup_getpos(winid).visible)
|
||||||
|
call assert_equal(-1, popup_getoptions(winid).tabpage)
|
||||||
quit
|
quit
|
||||||
call assert_equal(1, popup_getpos(winid).visible)
|
call assert_equal(1, popup_getpos(winid).visible)
|
||||||
call popup_clear()
|
call popup_clear()
|
||||||
|
|
||||||
|
" create popup in other tab
|
||||||
|
tabnew
|
||||||
|
let winid = popup_create("text", {'tabpage': 1})
|
||||||
|
call assert_equal(0, popup_getpos(winid).visible)
|
||||||
|
call assert_equal(1, popup_getoptions(winid).tabpage)
|
||||||
|
quit
|
||||||
|
call assert_equal(1, popup_getpos(winid).visible)
|
||||||
|
call assert_equal(0, popup_getoptions(winid).tabpage)
|
||||||
|
call popup_clear()
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_popup_valid_arguments()
|
func Test_popup_valid_arguments()
|
||||||
|
@@ -777,6 +777,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 */
|
||||||
|
/**/
|
||||||
|
1574,
|
||||||
/**/
|
/**/
|
||||||
1573,
|
1573,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user