diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-07-12 21:07:54 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-07-12 21:07:54 +0200 |
commit | b4f0628fc5892e1bb9f0f780af782ff47ef277ed (patch) | |
tree | e99eecacf4b8582fa7dde3dafb312f8edce2fd18 | |
parent | d94ac0caca12c6ceb54b07fc932edba84a5f60f2 (diff) |
patch 8.1.1673: cannot easily find the popup window at a certain positionv8.1.1673
Problem: Cannot easily find the popup window at a certain position.
Solution: Add popup_locate().
-rw-r--r-- | runtime/doc/popup.txt | 8 | ||||
-rw-r--r-- | src/evalfunc.c | 1 | ||||
-rw-r--r-- | src/popupwin.c | 14 | ||||
-rw-r--r-- | src/proto/popupwin.pro | 1 | ||||
-rw-r--r-- | src/testdir/test_popupwin.vim | 7 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 32 insertions, 1 deletions
diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt index ba4dc3fc15..b0397a35e8 100644 --- a/runtime/doc/popup.txt +++ b/runtime/doc/popup.txt @@ -170,6 +170,7 @@ Filter functions: Other: |popup_getoptions()| get current options for 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* @@ -343,6 +344,13 @@ popup_hide({id}) *popup_hide()* 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()* Show the {what} near the cursor, handle selecting one of the items with cursorkeys, and close it an item is selected with diff --git a/src/evalfunc.c b/src/evalfunc.c index 4ee0d5d9a1..43c8028b6e 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -781,6 +781,7 @@ static struct fst {"popup_getoptions", 1, 1, f_popup_getoptions}, {"popup_getpos", 1, 1, f_popup_getpos}, {"popup_hide", 1, 1, f_popup_hide}, + {"popup_locate", 2, 2, f_popup_locate}, {"popup_menu", 2, 2, f_popup_menu}, {"popup_move", 2, 2, f_popup_move}, {"popup_notification", 2, 2, f_popup_notification}, diff --git a/src/popupwin.c b/src/popupwin.c index aa19a5d63d..ea85588f2f 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -1890,6 +1890,20 @@ f_popup_getpos(typval_T *argvars, typval_T *rettv) 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". diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro index 7733368578..d1267e0224 100644 --- a/src/proto/popupwin.pro +++ b/src/proto/popupwin.pro @@ -29,6 +29,7 @@ void close_all_popups(void); void f_popup_move(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_locate(typval_T *argvars, typval_T *rettv); void f_popup_getoptions(typval_T *argvars, typval_T *rettv); int error_if_popup_window(void); void popup_reset_handled(void); diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 7b7b1bd755..a55e913a9a 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -713,7 +713,7 @@ func Test_popup_time() topleft vnew call setline(1, 'hello') - call popup_create('world', { + let winid = popup_create('world', { \ 'line': 1, \ 'col': 1, \ 'minwidth': 20, @@ -723,6 +723,11 @@ func Test_popup_time() let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '') 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 redraw let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '') diff --git a/src/version.c b/src/version.c index ea5de7db29..07c0d7ae9b 100644 --- a/src/version.c +++ b/src/version.c @@ -778,6 +778,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1673, +/**/ 1672, /**/ 1671, |