diff options
-rw-r--r-- | runtime/doc/popup.txt | 18 | ||||
-rw-r--r-- | src/evalfunc.c | 3 | ||||
-rw-r--r-- | src/ex_cmds.c | 3 | ||||
-rw-r--r-- | src/ex_docmd.c | 2 | ||||
-rw-r--r-- | src/popupmnu.c | 8 | ||||
-rw-r--r-- | src/popupwin.c | 63 | ||||
-rw-r--r-- | src/proto/popupwin.pro | 7 | ||||
-rw-r--r-- | src/testdir/dumps/Test_popupwin_infopopup_align_3.dump | 2 | ||||
-rw-r--r-- | src/testdir/test_popupwin.vim | 7 | ||||
-rw-r--r-- | src/version.c | 2 |
10 files changed, 87 insertions, 28 deletions
diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt index 67ad70bc5..e766deb4a 100644 --- a/runtime/doc/popup.txt +++ b/runtime/doc/popup.txt @@ -289,6 +289,20 @@ popup_filter_yesno({id}, {key}) *popup_filter_yesno()* See the example here: |popup_dialog-example| +popup_findinfo() *popup_findinfo()* + Get the |window-ID| for the popup info window, as it used by + the popup menu. See |complete-popup|. The info popup is + hidden when not used, it can be deleted with |popup_clear()| + and |popup_close()|. + Return zero if there is none. + + +popup_findpreview() *popup_findpreview()* + Get the |window-ID| for the popup preview window. + Return zero if there is none. + + + popup_getoptions({id}) *popup_getoptions()* Return the {options} for popup {id} in a Dict. A zero value means the option was not set. For "zindex" the @@ -336,10 +350,6 @@ popup_getpos({id}) *popup_getpos()* If popup window {id} is not found an empty Dict is returned. -popup_getpreview() *popup_getpreview()* - Get the |window-ID| for the popup preview window. - Return zero if there is none. - popup_hide({id}) *popup_hide()* If {id} is a displayed popup, hide it now. If the popup has a diff --git a/src/evalfunc.c b/src/evalfunc.c index d2a0c64bd..62938c1ca 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -702,9 +702,10 @@ static funcentry_T global_functions[] = {"popup_dialog", 2, 2, 0, f_popup_dialog}, {"popup_filter_menu", 2, 2, 0, f_popup_filter_menu}, {"popup_filter_yesno", 2, 2, 0, f_popup_filter_yesno}, + {"popup_findinfo", 0, 0, 0, f_popup_findinfo}, + {"popup_findpreview", 0, 0, 0, f_popup_findpreview}, {"popup_getoptions", 1, 1, 0, f_popup_getoptions}, {"popup_getpos", 1, 1, 0, f_popup_getpos}, - {"popup_getpreview", 0, 0, 0, f_popup_getpreview}, {"popup_hide", 1, 1, 0, f_popup_hide}, {"popup_locate", 2, 2, 0, f_popup_locate}, {"popup_menu", 2, 2, 0, f_popup_menu}, diff --git a/src/ex_cmds.c b/src/ex_cmds.c index ee3291c11..dceb1a739 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -5154,7 +5154,8 @@ prepare_tagpreview( else if (use_popup) { wp = popup_find_info_window(); - // TODO: set position + if (wp != NULL) + popup_show(wp); } else # endif diff --git a/src/ex_docmd.c b/src/ex_docmd.c index a64a0b40c..aad1bae66 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -5808,7 +5808,7 @@ ex_pclose(exarg_T *eap) } # ifdef FEAT_TEXT_PROP // Also when 'previewpopup' is empty, it might have been cleared. - popup_close_preview(FALSE); + popup_close_preview(); # endif } #endif diff --git a/src/popupmnu.c b/src/popupmnu.c index 8f35ee545..03eb412bb 100644 --- a/src/popupmnu.c +++ b/src/popupmnu.c @@ -923,8 +923,8 @@ pum_set_selected(int n, int repeat UNUSED) } #if defined(FEAT_TEXT_PROP) && defined(FEAT_QUICKFIX) if (!has_info) - // close any popup info window - popup_close_preview(TRUE); + // hide any popup info window + popup_hide_info(); #endif if (!resized) @@ -944,8 +944,8 @@ pum_undisplay(void) redraw_tabline = TRUE; status_redraw_all(); #if defined(FEAT_TEXT_PROP) && defined(FEAT_QUICKFIX) - // close any popup info window - popup_close_preview(TRUE); + // hide any popup info window + popup_hide_info(); #endif } diff --git a/src/popupwin.c b/src/popupwin.c index b8fc8fdf2..482c5a6e1 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -2058,6 +2058,18 @@ f_popup_close(typval_T *argvars, typval_T *rettv UNUSED) popup_close_and_callback(wp, &argvars[1]); } + static void +popup_hide(win_T *wp) +{ + if ((wp->w_popup_flags & POPF_HIDDEN) == 0) + { + wp->w_popup_flags |= POPF_HIDDEN; + --wp->w_buffer->b_nwindows; + redraw_all_later(NOT_VALID); + popup_mask_refresh = TRUE; + } +} + /* * popup_hide({id}) */ @@ -2067,10 +2079,17 @@ f_popup_hide(typval_T *argvars, typval_T *rettv UNUSED) int id = (int)tv_get_number(argvars); win_T *wp = find_popup_win(id); - if (wp != NULL && (wp->w_popup_flags & POPF_HIDDEN) == 0) + if (wp != NULL) + popup_hide(wp); +} + + void +popup_show(win_T *wp) +{ + if ((wp->w_popup_flags & POPF_HIDDEN) != 0) { - wp->w_popup_flags |= POPF_HIDDEN; - --wp->w_buffer->b_nwindows; + wp->w_popup_flags &= ~POPF_HIDDEN; + ++wp->w_buffer->b_nwindows; redraw_all_later(NOT_VALID); popup_mask_refresh = TRUE; } @@ -2085,13 +2104,8 @@ f_popup_show(typval_T *argvars, typval_T *rettv UNUSED) int id = (int)tv_get_number(argvars); win_T *wp = find_popup_win(id); - if (wp != NULL && (wp->w_popup_flags & POPF_HIDDEN) != 0) - { - wp->w_popup_flags &= ~POPF_HIDDEN; - ++wp->w_buffer->b_nwindows; - redraw_all_later(NOT_VALID); - popup_mask_refresh = TRUE; - } + if (wp != NULL) + popup_show(wp); } /* @@ -3314,7 +3328,15 @@ popup_find_info_window(void) #endif void -f_popup_getpreview(typval_T *argvars UNUSED, typval_T *rettv) +f_popup_findinfo(typval_T *argvars UNUSED, typval_T *rettv) +{ + win_T *wp = popup_find_info_window(); + + rettv->vval.v_number = wp == NULL ? 0 : wp->w_id; +} + + void +f_popup_findpreview(typval_T *argvars UNUSED, typval_T *rettv) { win_T *wp = popup_find_preview_window(); @@ -3355,10 +3377,13 @@ popup_create_preview_window(int info) } #if defined(FEAT_QUICKFIX) || defined(PROTO) +/* + * Close any preview popup. + */ void -popup_close_preview(int info) +popup_close_preview(void) { - win_T *wp = info ? popup_find_info_window() : popup_find_preview_window(); + win_T *wp = popup_find_preview_window(); if (wp != NULL) { @@ -3369,6 +3394,18 @@ popup_close_preview(int info) popup_close_and_callback(wp, &res); } } + +/* + * Hide the info popup. + */ + void +popup_hide_info(void) +{ + win_T *wp = popup_find_info_window(); + + if (wp != NULL) + popup_hide(wp); +} #endif /* diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro index 9f6d4339e..050711422 100644 --- a/src/proto/popupwin.pro +++ b/src/proto/popupwin.pro @@ -27,6 +27,7 @@ void f_popup_menu(typval_T *argvars, typval_T *rettv); void f_popup_notification(typval_T *argvars, typval_T *rettv); void f_popup_close(typval_T *argvars, typval_T *rettv); void f_popup_hide(typval_T *argvars, typval_T *rettv); +void popup_show(win_T *wp); void f_popup_show(typval_T *argvars, typval_T *rettv); void f_popup_settext(typval_T *argvars, typval_T *rettv); void popup_close(int id); @@ -49,9 +50,11 @@ int set_ref_in_popups(int copyID); win_T *popup_find_preview_window(void); int popup_is_popup(win_T *wp); win_T *popup_find_info_window(void); -void f_popup_getpreview(typval_T *argvars, typval_T *rettv); +void f_popup_findinfo(typval_T *argvars, typval_T *rettv); +void f_popup_findpreview(typval_T *argvars, typval_T *rettv); int popup_create_preview_window(int info); -void popup_close_preview(int info); +void popup_close_preview(void); +void popup_hide_info(void); void popup_set_title(win_T *wp); void popup_update_preview_title(void); /* vim: set ft=c : */ diff --git a/src/testdir/dumps/Test_popupwin_infopopup_align_3.dump b/src/testdir/dumps/Test_popupwin_infopopup_align_3.dump index 6effda0e5..2599094f8 100644 --- a/src/testdir/dumps/Test_popupwin_infopopup_align_3.dump +++ b/src/testdir/dumps/Test_popupwin_infopopup_align_3.dump @@ -8,7 +8,7 @@ |x| @7| +0#0000001#e0e0e08|w|r|d| @4|W| |e|x|t|r|a| |t|e|x|t| | +0#0000000#ffffff0@43 |x| @7| +0#0000001#ffd7ff255|a|n|o|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| | +0#0000000#ffffff0@43 |x| @7| +0#0000001#ffd7ff255|n|o|a|w|r|d| @1|W| |e|x|t|r|a| |t|e|x|t| | +0#0000000#ffffff0@43 -|x| @7| +0#0000001#ffd7ff255|t|h|a|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| | +0&#e0e0e08|w|o|r|d|s| |a|r|e| |c|o@1|l| | +0#0000000#ffffff0@27 +|x| @7| +0#0000001#ffd7ff255|t|h|a|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| | +0#0000000#ffff4012|w|o|r|d|s| |a|r|e| |c|o@1|l| | +0&#ffffff0@27 |t|e|s|t| |t|e|x|t| |a|w|o|r|d> @59 |~+0#4040ff13&| @73 |-+2#0000000&@1| |U|s|e|r| |d|e|f|i|n|e|d| |c|o|m|p|l|e|t|i|o|n| |(|^|U|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |1| |o|f| |4| +0#0000000&@26 diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 1f1f7314b..6c1ac524a 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -2162,7 +2162,7 @@ func Test_previewpopup() call term_sendkeys(buf, "/another\<CR>\<C-W>}") call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {}) - call term_sendkeys(buf, ":call popup_move(popup_getpreview(), #{col: 15})\<CR>") + call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>") call term_sendkeys(buf, ":\<CR>") call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {}) @@ -2245,6 +2245,10 @@ func Get_popupmenu_lines() \ } endfunc call setline(1, 'text text text text text text text ') + func ChangeColor() + let id = popup_findinfo() + call popup_setoptions(id, #{highlight: 'InfoPopup'}) + endfunc END return lines endfunc @@ -2313,6 +2317,7 @@ func Test_popupmenu_info_align_menu() call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {}) call term_sendkeys(buf, "\<Esc>") + call term_sendkeys(buf, ":call ChangeColor()\<CR>") call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>") call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>") call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {}) diff --git a/src/version.c b/src/version.c index 6c8bd8983..ae0bd9c4e 100644 --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1905, +/**/ 1904, /**/ 1903, |