summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-10-20 18:46:05 +0200
committerBram Moolenaar <Bram@vim.org>2019-10-20 18:46:05 +0200
commita13961536e5b1e686574826d4ed713e3d5526715 (patch)
tree63a0cbe0b2edab411bd7991afae9217b8b8e2729
parentdca7abe79cc4f0933473c3e4bcc75b46cc2c48fd (diff)
downloadvim-git-a13961536e5b1e686574826d4ed713e3d5526715.tar.gz
patch 8.1.2193: popup_setoptions(popup_getoptions()) does not workv8.1.2193
Problem: Popup_setoptions(popup_getoptions()) does not work. Solution: Also accept a list with three entries for "moved" and "mousemoved". (closes #5081)
-rw-r--r--runtime/doc/popup.txt7
-rw-r--r--src/popupwin.c24
-rw-r--r--src/testdir/test_popupwin.vim4
-rw-r--r--src/version.c2
4 files changed, 33 insertions, 4 deletions
diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt
index a438ce64e..d1dfd86a1 100644
--- a/runtime/doc/popup.txt
+++ b/runtime/doc/popup.txt
@@ -474,6 +474,8 @@ popup_notification({what}, {options}) *popup_notification()*
popup_show({id}) *popup_show()*
If {id} is a hidden popup, show it now.
For {id} see `popup_hide()`.
+ If {id} is the info popup it will be positioned next to the
+ current popup menu item.
popup_setoptions({id}, {options}) *popup_setoptions()*
@@ -680,8 +682,13 @@ The second argument of |popup_create()| is a dictionary with options:
- "expr": if the cursor moved outside |<cexpr>|
- [{start}, {end}]: if the cursor moved before column
{start} or after {end}
+ - [{lnum}, {start}, {end}]: if the cursor moved away
+ from line {lnum}, before column {start} or after
+ {end}
The popup also closes if the cursor moves to another
line or to another window.
+ mousemoved Like "moved" but referring to the mouse pointer
+ position
cursorline non-zero: Highlight the cursor line. Also scrolls the
text to show this line (only works properly
when 'wrap' is off).
diff --git a/src/popupwin.c b/src/popupwin.c
index 95435f8fe..a9579320e 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -493,12 +493,28 @@ handle_moved_argument(win_T *wp, dictitem_T *di, int mousemoved)
}
else if (di->di_tv.v_type == VAR_LIST
&& di->di_tv.vval.v_list != NULL
- && di->di_tv.vval.v_list->lv_len == 2)
+ && (di->di_tv.vval.v_list->lv_len == 2
+ || di->di_tv.vval.v_list->lv_len == 3))
{
- list_T *l = di->di_tv.vval.v_list;
- int mincol = tv_get_number(&l->lv_first->li_tv);
- int maxcol = tv_get_number(&l->lv_first->li_next->li_tv);
+ list_T *l = di->di_tv.vval.v_list;
+ listitem_T *li = l->lv_first;
+ int mincol;
+ int maxcol;
+ if (di->di_tv.vval.v_list->lv_len == 3)
+ {
+ varnumber_T nr = tv_get_number(&l->lv_first->li_tv);
+
+ // Three numbers, might be from popup_getoptions().
+ if (mousemoved)
+ wp->w_popup_mouse_row = nr;
+ else
+ wp->w_popup_lnum = nr;
+ li = li->li_next;
+ }
+
+ mincol = tv_get_number(&li->li_tv);
+ maxcol = tv_get_number(&li->li_next->li_tv);
if (mousemoved)
{
wp->w_popup_mouse_mincol = mincol;
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index 2e2d1df80..dc382d83b 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -170,6 +170,10 @@ func Test_popup_with_border_and_padding()
call assert_equal(['Top', 'Right', 'Bottom', 'Left'], options.borderhighlight)
call assert_equal(['1', '^', '2', '>', '3', 'v', '4', '<'], options.borderchars)
+ " Check that popup_setoptions() takes the output of popup_getoptions()
+ call popup_setoptions(winid, options)
+ call assert_equal(options, popup_getoptions(winid))
+
let winid = popup_create('hello both', #{line: 3, col: 8, border: [], padding: []})
call assert_equal(#{
\ line: 3,
diff --git a/src/version.c b/src/version.c
index 76b4c1cf5..6c8a36b21 100644
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2193,
+/**/
2192,
/**/
2191,