changeset 18398:21c25bee9df8 v8.1.2193

patch 8.1.2193: popup_setoptions(popup_getoptions()) does not work Commit: https://github.com/vim/vim/commit/a13961536e5b1e686574826d4ed713e3d5526715 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Oct 20 18:46:05 2019 +0200 patch 8.1.2193: popup_setoptions(popup_getoptions()) does not work Problem: Popup_setoptions(popup_getoptions()) does not work. Solution: Also accept a list with three entries for "moved" and "mousemoved". (closes #5081)
author Bram Moolenaar <Bram@vim.org>
date Sun, 20 Oct 2019 19:00:03 +0200
parents 3bc55782efa5
children abf655222da5
files runtime/doc/popup.txt src/popupwin.c src/testdir/test_popupwin.vim src/version.c
diffstat 4 files changed, 34 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/popup.txt
+++ b/runtime/doc/popup.txt
@@ -474,6 +474,8 @@ popup_notification({what}, {options})			
 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()| 
 			- "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).
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -493,12 +493,28 @@ handle_moved_argument(win_T *wp, dictite
     }
     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;
--- 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,
--- 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,