# HG changeset patch # User Bram Moolenaar # Date 1571590803 -7200 # Node ID 21c25bee9df87457b153849726bb95a7d975645f # Parent 3bc55782efa5e14e05e6ad36a2feba304ff3cdad patch 8.1.2193: popup_setoptions(popup_getoptions()) does not work Commit: https://github.com/vim/vim/commit/a13961536e5b1e686574826d4ed713e3d5526715 Author: Bram Moolenaar 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) diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt --- 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 || - [{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 --- 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; diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim --- 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 --- 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,