forked from aniani/vim
patch 8.1.2273: wrong default when "pos" is changed with popup_atcursor()
Problem: Wrong default when "pos" is changed with popup_atcursor(). Solution: Adjust the default line and col when "pos" is not the default value. (#5151)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
*popup.txt* For Vim version 8.1. Last change: 2019 Nov 03
|
*popup.txt* For Vim version 8.1. Last change: 2019 Nov 09
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -186,6 +186,8 @@ popup_atcursor({what}, {options}) *popup_atcursor()*
|
|||||||
\ moved: 'WORD',
|
\ moved: 'WORD',
|
||||||
\ })
|
\ })
|
||||||
< Use {options} to change the properties.
|
< Use {options} to change the properties.
|
||||||
|
If "pos" is passed as "topleft" then the default for "line"
|
||||||
|
becomes "cursor+1".
|
||||||
|
|
||||||
Can also be used as a |method|: >
|
Can also be used as a |method|: >
|
||||||
GetText()->popup_atcursor({})
|
GetText()->popup_atcursor({})
|
||||||
@@ -362,7 +364,8 @@ popup_getpos({id}) *popup_getpos()*
|
|||||||
core_height height of the text box in screen cells
|
core_height height of the text box in screen cells
|
||||||
firstline line of the buffer at top (1 unless scrolled)
|
firstline line of the buffer at top (1 unless scrolled)
|
||||||
(not the value of the "firstline" property)
|
(not the value of the "firstline" property)
|
||||||
lastline line of the buffer at the bottom
|
lastline line of the buffer at the bottom (updated when
|
||||||
|
the popup is redrawn)
|
||||||
scrollbar non-zero if a scrollbar is displayed
|
scrollbar non-zero if a scrollbar is displayed
|
||||||
visible one if the popup is displayed, zero if hidden
|
visible one if the popup is displayed, zero if hidden
|
||||||
Note that these are the actual screen positions. They differ
|
Note that these are the actual screen positions. They differ
|
||||||
@@ -566,6 +569,11 @@ The second argument of |popup_create()| is a dictionary with options:
|
|||||||
Alternatively "center" can be used to position the
|
Alternatively "center" can be used to position the
|
||||||
popup in the center of the Vim window, in which case
|
popup in the center of the Vim window, in which case
|
||||||
"line" and "col" are ignored.
|
"line" and "col" are ignored.
|
||||||
|
posinvert When FALSE the value of "pos" is always used. When
|
||||||
|
TRUE (the default) and the popup does not fit
|
||||||
|
vertically and there is more space on the other side
|
||||||
|
then the popup is placed on the other side of the
|
||||||
|
position indicated by "line".
|
||||||
textprop When present the popup is positioned next to a text
|
textprop When present the popup is positioned next to a text
|
||||||
property with this name and will move when the text
|
property with this name and will move when the text
|
||||||
property moves. Use an empty string to remove. See
|
property moves. Use an empty string to remove. See
|
||||||
@@ -686,6 +694,8 @@ The second argument of |popup_create()| is a dictionary with options:
|
|||||||
- [{lnum}, {start}, {end}]: if the cursor moved away
|
- [{lnum}, {start}, {end}]: if the cursor moved away
|
||||||
from line {lnum}, before column {start} or after
|
from line {lnum}, before column {start} or after
|
||||||
{end}
|
{end}
|
||||||
|
- [0, 0, 0] do not close the popup when the cursor
|
||||||
|
moves
|
||||||
The popup also closes if the cursor moves to another
|
The popup also closes if the cursor moves to another
|
||||||
line or to another window.
|
line or to another window.
|
||||||
mousemoved Like "moved" but referring to the mouse pointer
|
mousemoved Like "moved" but referring to the mouse pointer
|
||||||
@@ -852,9 +862,9 @@ Some recommended key actions:
|
|||||||
cursor keys select another entry
|
cursor keys select another entry
|
||||||
Tab accept current suggestion
|
Tab accept current suggestion
|
||||||
|
|
||||||
A mouse click arrives as <LeftMouse>. The coordinates are in
|
A mouse click arrives as <LeftMouse>. The coordinates are in |v:mouse_col|
|
||||||
v:mouse_popup_col and v:mouse_popup_row. The top-left screen cell of the
|
and |v:mouse_lnum|. The top-left screen cell of the popup is col 1, row 1
|
||||||
popup is col 1, row 1 (not counting the border).
|
(not counting the border).
|
||||||
|
|
||||||
Vim provides standard filters |popup_filter_menu()| and
|
Vim provides standard filters |popup_filter_menu()| and
|
||||||
|popup_filter_yesno()|.
|
|popup_filter_yesno()|.
|
||||||
|
@@ -4960,7 +4960,7 @@ prepare_tagpreview(
|
|||||||
{
|
{
|
||||||
wp = popup_find_preview_window();
|
wp = popup_find_preview_window();
|
||||||
if (wp != NULL)
|
if (wp != NULL)
|
||||||
popup_set_wantpos_cursor(wp, wp->w_minwidth);
|
popup_set_wantpos_cursor(wp, wp->w_minwidth, NULL);
|
||||||
}
|
}
|
||||||
else if (use_popup != USEPOPUP_NONE)
|
else if (use_popup != USEPOPUP_NONE)
|
||||||
{
|
{
|
||||||
|
@@ -390,6 +390,25 @@ popup_add_timeout(win_T *wp, int time)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static poppos_T
|
||||||
|
get_pos_entry(dict_T *d, int give_error)
|
||||||
|
{
|
||||||
|
char_u *str = dict_get_string(d, (char_u *)"pos", FALSE);
|
||||||
|
int nr;
|
||||||
|
|
||||||
|
if (str == NULL)
|
||||||
|
return POPPOS_NONE;
|
||||||
|
|
||||||
|
for (nr = 0; nr < (int)(sizeof(poppos_entries) / sizeof(poppos_entry_T));
|
||||||
|
++nr)
|
||||||
|
if (STRCMP(str, poppos_entries[nr].pp_name) == 0)
|
||||||
|
return poppos_entries[nr].pp_val;
|
||||||
|
|
||||||
|
if (give_error)
|
||||||
|
semsg(_(e_invarg2), str);
|
||||||
|
return POPPOS_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shared between popup_create() and f_popup_move().
|
* Shared between popup_create() and f_popup_move().
|
||||||
*/
|
*/
|
||||||
@@ -420,20 +439,11 @@ apply_move_options(win_T *wp, dict_T *d)
|
|||||||
if (di != NULL)
|
if (di != NULL)
|
||||||
wp->w_popup_fixed = dict_get_number(d, (char_u *)"fixed") != 0;
|
wp->w_popup_fixed = dict_get_number(d, (char_u *)"fixed") != 0;
|
||||||
|
|
||||||
str = dict_get_string(d, (char_u *)"pos", FALSE);
|
|
||||||
if (str != NULL)
|
|
||||||
{
|
{
|
||||||
for (nr = 0;
|
poppos_T ppt = get_pos_entry(d, TRUE);
|
||||||
nr < (int)(sizeof(poppos_entries) / sizeof(poppos_entry_T));
|
|
||||||
++nr)
|
if (ppt != POPPOS_NONE)
|
||||||
if (STRCMP(str, poppos_entries[nr].pp_name) == 0)
|
wp->w_popup_pos = ppt;
|
||||||
{
|
|
||||||
wp->w_popup_pos = poppos_entries[nr].pp_val;
|
|
||||||
nr = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (nr != -1)
|
|
||||||
semsg(_(e_invarg2), str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
str = dict_get_string(d, (char_u *)"textprop", FALSE);
|
str = dict_get_string(d, (char_u *)"textprop", FALSE);
|
||||||
@@ -512,6 +522,8 @@ handle_moved_argument(win_T *wp, dictitem_T *di, int mousemoved)
|
|||||||
else
|
else
|
||||||
wp->w_popup_lnum = nr;
|
wp->w_popup_lnum = nr;
|
||||||
li = li->li_next;
|
li = li->li_next;
|
||||||
|
if (nr == 0)
|
||||||
|
wp->w_popup_curwin = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mincol = tv_get_number(&li->li_tv);
|
mincol = tv_get_number(&li->li_tv);
|
||||||
@@ -1634,14 +1646,27 @@ parse_completepopup(win_T *wp)
|
|||||||
* Keep at least "width" columns from the right of the screen.
|
* Keep at least "width" columns from the right of the screen.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
popup_set_wantpos_cursor(win_T *wp, int width)
|
popup_set_wantpos_cursor(win_T *wp, int width, dict_T *d)
|
||||||
{
|
{
|
||||||
|
poppos_T ppt = POPPOS_NONE;
|
||||||
|
|
||||||
|
if (d != NULL)
|
||||||
|
ppt = get_pos_entry(d, FALSE);
|
||||||
|
|
||||||
setcursor_mayforce(TRUE);
|
setcursor_mayforce(TRUE);
|
||||||
wp->w_wantline = curwin->w_winrow + curwin->w_wrow;
|
if (ppt == POPPOS_TOPRIGHT || ppt == POPPOS_TOPLEFT)
|
||||||
if (wp->w_wantline == 0) // cursor in first line
|
|
||||||
{
|
{
|
||||||
wp->w_wantline = 2;
|
wp->w_wantline = curwin->w_winrow + curwin->w_wrow + 2;
|
||||||
wp->w_popup_pos = POPPOS_TOPLEFT;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wp->w_wantline = curwin->w_winrow + curwin->w_wrow;
|
||||||
|
if (wp->w_wantline == 0) // cursor in first line
|
||||||
|
{
|
||||||
|
wp->w_wantline = 2;
|
||||||
|
wp->w_popup_pos = ppt == POPPOS_BOTRIGHT
|
||||||
|
? POPPOS_TOPRIGHT : POPPOS_TOPLEFT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wp->w_wantcol = curwin->w_wincol + curwin->w_wcol + 1;
|
wp->w_wantcol = curwin->w_wincol + curwin->w_wcol + 1;
|
||||||
@@ -1651,6 +1676,7 @@ popup_set_wantpos_cursor(win_T *wp, int width)
|
|||||||
if (wp->w_wantcol < 1)
|
if (wp->w_wantcol < 1)
|
||||||
wp->w_wantcol = 1;
|
wp->w_wantcol = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
popup_adjust_position(wp);
|
popup_adjust_position(wp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1834,7 +1860,7 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
|
|||||||
}
|
}
|
||||||
if (type == TYPE_ATCURSOR)
|
if (type == TYPE_ATCURSOR)
|
||||||
{
|
{
|
||||||
popup_set_wantpos_cursor(wp, 0);
|
popup_set_wantpos_cursor(wp, 0, d);
|
||||||
set_moved_values(wp);
|
set_moved_values(wp);
|
||||||
set_moved_columns(wp, FIND_STRING);
|
set_moved_columns(wp, FIND_STRING);
|
||||||
}
|
}
|
||||||
@@ -1935,7 +1961,7 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
|
|||||||
for (i = 0; i < 4; ++i)
|
for (i = 0; i < 4; ++i)
|
||||||
wp->w_popup_border[i] = 1;
|
wp->w_popup_border[i] = 1;
|
||||||
parse_previewpopup(wp);
|
parse_previewpopup(wp);
|
||||||
popup_set_wantpos_cursor(wp, wp->w_minwidth);
|
popup_set_wantpos_cursor(wp, wp->w_minwidth, d);
|
||||||
}
|
}
|
||||||
# ifdef FEAT_QUICKFIX
|
# ifdef FEAT_QUICKFIX
|
||||||
if (type == TYPE_INFO)
|
if (type == TYPE_INFO)
|
||||||
|
@@ -12,7 +12,7 @@ int popup_width(win_T *wp);
|
|||||||
int popup_extra_width(win_T *wp);
|
int popup_extra_width(win_T *wp);
|
||||||
int parse_previewpopup(win_T *wp);
|
int parse_previewpopup(win_T *wp);
|
||||||
int parse_completepopup(win_T *wp);
|
int parse_completepopup(win_T *wp);
|
||||||
void popup_set_wantpos_cursor(win_T *wp, int width);
|
void popup_set_wantpos_cursor(win_T *wp, int width, dict_T *d);
|
||||||
void popup_set_wantpos_rowcol(win_T *wp, int row, int col);
|
void popup_set_wantpos_rowcol(win_T *wp, int row, int col);
|
||||||
void f_popup_clear(typval_T *argvars, typval_T *rettv);
|
void f_popup_clear(typval_T *argvars, typval_T *rettv);
|
||||||
void f_popup_create(typval_T *argvars, typval_T *rettv);
|
void f_popup_create(typval_T *argvars, typval_T *rettv);
|
||||||
|
@@ -2113,7 +2113,8 @@ typedef enum {
|
|||||||
POPPOS_TOPLEFT,
|
POPPOS_TOPLEFT,
|
||||||
POPPOS_BOTRIGHT,
|
POPPOS_BOTRIGHT,
|
||||||
POPPOS_TOPRIGHT,
|
POPPOS_TOPRIGHT,
|
||||||
POPPOS_CENTER
|
POPPOS_CENTER,
|
||||||
|
POPPOS_NONE
|
||||||
} poppos_T;
|
} poppos_T;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
12
src/testdir/dumps/Test_popupwin_atcursor_pos.dump
Normal file
12
src/testdir/dumps/Test_popupwin_atcursor_pos.dump
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
|-+0&#ffffff0@59| @14
|
||||||
|
|-@59| @14
|
||||||
|
|-@25|%|-@16>@|-@14| @14
|
||||||
|
|-@25|f+0#0000001#ffd7ff255|i|R|S|t| |-+0#0000000#ffffff0@6|F+0#0000001#ffd7ff255|i|r|s|t| |-+0#0000000#ffffff0@14| @14
|
||||||
|
|-@25|s+0#0000001#ffd7ff255|e|C|O|n|d|-+0#0000000#ffffff0@6|S+0#0000001#ffd7ff255|e|c|o|n|D|-+0#0000000#ffffff0@14| @14
|
||||||
|
|-@59| @14
|
||||||
|
|-@1|f+0#0000001#ffd7ff255|i|r|s|t| |-+0#0000000#ffffff0@6|F+0#0000001#ffd7ff255|I|r|s|T| |-+0#0000000#ffffff0@38| @14
|
||||||
|
|-@1|s+0#0000001#ffd7ff255|e|c|o|n|d|-+0#0000000#ffffff0@6|S+0#0000001#ffd7ff255|E|c|o|N|D|-+0#0000000#ffffff0@38| @14
|
||||||
|
|-@1|#|-@16|&|-@38| @14
|
||||||
|
|-@59| @14
|
||||||
|
|-@59| @14
|
||||||
|
@57|3|,|4|5| @9|T|o|p|
|
@@ -1294,6 +1294,42 @@ func Test_popup_atcursor()
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_popup_atcursor_pos()
|
||||||
|
CheckScreendump
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
call setline(1, repeat([repeat('-', 60)], 15))
|
||||||
|
set so=0
|
||||||
|
|
||||||
|
normal 9G3|r#
|
||||||
|
let winid1 = popup_atcursor(['first', 'second'], #{
|
||||||
|
\ moved: [0, 0, 0],
|
||||||
|
\ })
|
||||||
|
normal 9G21|r&
|
||||||
|
let winid1 = popup_atcursor(['FIrsT', 'SEcoND'], #{
|
||||||
|
\ pos: 'botright',
|
||||||
|
\ moved: [0, 0, 0],
|
||||||
|
\ })
|
||||||
|
normal 3G27|r%
|
||||||
|
let winid1 = popup_atcursor(['fiRSt', 'seCOnd'], #{
|
||||||
|
\ pos: 'topleft',
|
||||||
|
\ moved: [0, 0, 0],
|
||||||
|
\ })
|
||||||
|
normal 3G45|r@
|
||||||
|
let winid1 = popup_atcursor(['First', 'SeconD'], #{
|
||||||
|
\ pos: 'topright',
|
||||||
|
\ moved: [0, 0, 0],
|
||||||
|
\ })
|
||||||
|
END
|
||||||
|
call writefile(lines, 'XtestPopupAtcursorPos')
|
||||||
|
let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
|
||||||
|
call VerifyScreenDump(buf, 'Test_popupwin_atcursor_pos', {})
|
||||||
|
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('XtestPopupAtcursorPos')
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_popup_beval()
|
func Test_popup_beval()
|
||||||
CheckScreendump
|
CheckScreendump
|
||||||
CheckFeature balloon_eval_term
|
CheckFeature balloon_eval_term
|
||||||
|
@@ -741,6 +741,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 */
|
||||||
|
/**/
|
||||||
|
2273,
|
||||||
/**/
|
/**/
|
||||||
2272,
|
2272,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user