1
0
forked from aniani/vim

patch 8.1.1673: cannot easily find the popup window at a certain position

Problem:    Cannot easily find the popup window at a certain position.
Solution:   Add popup_locate().
This commit is contained in:
Bram Moolenaar
2019-07-12 21:07:54 +02:00
parent d94ac0caca
commit b4f0628fc5
6 changed files with 32 additions and 1 deletions

View File

@@ -170,6 +170,7 @@ Filter functions:
Other: Other:
|popup_getoptions()| get current options for a popup |popup_getoptions()| get current options for a popup
|popup_getpos()| get actual position and size of a popup |popup_getpos()| get actual position and size of a popup
|popup_locate()| find popup window at a screen position
DETAILS *popup-function-details* DETAILS *popup-function-details*
@@ -343,6 +344,13 @@ popup_hide({id}) *popup_hide()*
exists but is not a popup window an error is given. *E993* exists but is not a popup window an error is given. *E993*
popup_locate({row}, {col}) *popup_locate()*
Return the |window-ID| of the popup at screen positoin {row}
and {col}. If there are multiple popups the one with the
highest zindex is returned. If there are no popups at this
position then zero is returned.
popup_menu({what}, {options}) *popup_menu()* popup_menu({what}, {options}) *popup_menu()*
Show the {what} near the cursor, handle selecting one of the Show the {what} near the cursor, handle selecting one of the
items with cursorkeys, and close it an item is selected with items with cursorkeys, and close it an item is selected with

View File

@@ -781,6 +781,7 @@ static struct fst
{"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},
{"popup_hide", 1, 1, f_popup_hide}, {"popup_hide", 1, 1, f_popup_hide},
{"popup_locate", 2, 2, f_popup_locate},
{"popup_menu", 2, 2, f_popup_menu}, {"popup_menu", 2, 2, f_popup_menu},
{"popup_move", 2, 2, f_popup_move}, {"popup_move", 2, 2, f_popup_move},
{"popup_notification", 2, 2, f_popup_notification}, {"popup_notification", 2, 2, f_popup_notification},

View File

@@ -1890,6 +1890,20 @@ f_popup_getpos(typval_T *argvars, typval_T *rettv)
win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0); win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0);
} }
} }
/*
* popup_locate({row}, {col})
*/
void
f_popup_locate(typval_T *argvars, typval_T *rettv)
{
int row = tv_get_number(&argvars[0]) - 1;
int col = tv_get_number(&argvars[1]) - 1;
win_T *wp;
wp = mouse_find_win(&row, &col, FIND_POPUP);
if (WIN_IS_POPUP(wp))
rettv->vval.v_number = wp->w_id;
}
/* /*
* For popup_getoptions(): add a "border" or "padding" entry to "dict". * For popup_getoptions(): add a "border" or "padding" entry to "dict".

View File

@@ -29,6 +29,7 @@ void close_all_popups(void);
void f_popup_move(typval_T *argvars, typval_T *rettv); void f_popup_move(typval_T *argvars, typval_T *rettv);
void f_popup_setoptions(typval_T *argvars, typval_T *rettv); void f_popup_setoptions(typval_T *argvars, typval_T *rettv);
void f_popup_getpos(typval_T *argvars, typval_T *rettv); void f_popup_getpos(typval_T *argvars, typval_T *rettv);
void f_popup_locate(typval_T *argvars, typval_T *rettv);
void f_popup_getoptions(typval_T *argvars, typval_T *rettv); void f_popup_getoptions(typval_T *argvars, typval_T *rettv);
int error_if_popup_window(void); int error_if_popup_window(void);
void popup_reset_handled(void); void popup_reset_handled(void);

View File

@@ -713,7 +713,7 @@ func Test_popup_time()
topleft vnew topleft vnew
call setline(1, 'hello') call setline(1, 'hello')
call popup_create('world', { let winid = popup_create('world', {
\ 'line': 1, \ 'line': 1,
\ 'col': 1, \ 'col': 1,
\ 'minwidth': 20, \ 'minwidth': 20,
@@ -723,6 +723,11 @@ func Test_popup_time()
let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '') let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
call assert_equal('world', line) call assert_equal('world', line)
call assert_equal(winid, popup_locate(1, 1))
call assert_equal(winid, popup_locate(1, 20))
call assert_equal(0, popup_locate(1, 21))
call assert_equal(0, popup_locate(2, 1))
sleep 700m sleep 700m
redraw redraw
let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '') let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')

View File

@@ -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 */
/**/
1673,
/**/ /**/
1672, 1672,
/**/ /**/