summaryrefslogtreecommitdiff
path: root/src/popupmenu.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-10-20 18:17:57 +0200
committerBram Moolenaar <Bram@vim.org>2019-10-20 18:17:57 +0200
commitdca7abe79cc4f0933473c3e4bcc75b46cc2c48fd (patch)
tree577964fff695a536bc2d957889e74a2f9f087290 /src/popupmenu.c
parent88d3d09e07dbe0e3ea450bc554e2aadc451450d2 (diff)
downloadvim-git-dca7abe79cc4f0933473c3e4bcc75b46cc2c48fd.tar.gz
patch 8.1.2192: cannot easily fill the info popup asynchronouslyv8.1.2192
Problem: Cannot easily fill the info popup asynchronously. Solution: Add the "popuphidden" value to 'completeopt'. (closes #4924)
Diffstat (limited to 'src/popupmenu.c')
-rw-r--r--src/popupmenu.c52
1 files changed, 34 insertions, 18 deletions
diff --git a/src/popupmenu.c b/src/popupmenu.c
index b88c6531c..005adb20b 100644
--- a/src/popupmenu.c
+++ b/src/popupmenu.c
@@ -622,33 +622,36 @@ pum_redraw(void)
}
#if defined(FEAT_TEXT_PROP) && defined(FEAT_QUICKFIX)
- static void
-pum_position_info_popup(void)
+/*
+ * Position the info popup relative to the popup menu item.
+ */
+ void
+pum_position_info_popup(win_T *wp)
{
int col = pum_col + pum_width + 1;
int row = pum_row;
int botpos = POPPOS_BOTLEFT;
- curwin->w_popup_pos = POPPOS_TOPLEFT;
+ wp->w_popup_pos = POPPOS_TOPLEFT;
if (Columns - col < 20 && Columns - col < pum_col)
{
col = pum_col - 1;
- curwin->w_popup_pos = POPPOS_TOPRIGHT;
+ wp->w_popup_pos = POPPOS_TOPRIGHT;
botpos = POPPOS_BOTRIGHT;
- curwin->w_maxwidth = pum_col - 1;
+ wp->w_maxwidth = pum_col - 1;
}
else
- curwin->w_maxwidth = Columns - col + 1;
- curwin->w_maxwidth -= popup_extra_width(curwin);
+ wp->w_maxwidth = Columns - col + 1;
+ wp->w_maxwidth -= popup_extra_width(wp);
- row -= popup_top_extra(curwin);
- if (curwin->w_popup_flags & POPF_INFO_MENU)
+ row -= popup_top_extra(wp);
+ if (wp->w_popup_flags & POPF_INFO_MENU)
{
if (pum_row < pum_win_row)
{
// menu above cursor line, align with bottom
row += pum_height;
- curwin->w_popup_pos = botpos;
+ wp->w_popup_pos = botpos;
}
else
// menu below cursor line, align with top
@@ -658,7 +661,7 @@ pum_position_info_popup(void)
// align with the selected item
row += pum_selected - pum_first + 1;
- popup_set_wantpos_rowcol(curwin, row, col);
+ popup_set_wantpos_rowcol(wp, row, col);
}
#endif
@@ -756,15 +759,21 @@ pum_set_selected(int n, int repeat UNUSED)
tabpage_T *curtab_save = curtab;
int res = OK;
# ifdef FEAT_TEXT_PROP
- int use_popup = strstr((char *)p_cot, "popup") != NULL;
+ use_popup_T use_popup;
# else
-# define use_popup 0
+# define use_popup POPUP_NONE
# endif
# ifdef FEAT_TEXT_PROP
has_info = TRUE;
+ if (strstr((char *)p_cot, "popuphidden") != NULL)
+ use_popup = USEPOPUP_HIDDEN;
+ else if (strstr((char *)p_cot, "popup") != NULL)
+ use_popup = USEPOPUP_NORMAL;
+ else
+ use_popup = USEPOPUP_NONE;
# endif
- // Open a preview window. 3 lines by default. Prefer
- // 'previewheight' if set and smaller.
+ // Open a preview window and set "curwin" to it.
+ // 3 lines by default, prefer 'previewheight' if set and smaller.
g_do_tagpreview = 3;
if (p_pvh > 0 && p_pvh < g_do_tagpreview)
g_do_tagpreview = p_pvh;
@@ -838,7 +847,7 @@ pum_set_selected(int n, int repeat UNUSED)
/* Increase the height of the preview window to show the
* text, but no more than 'previewheight' lines. */
- if (repeat == 0 && !use_popup)
+ if (repeat == 0 && use_popup == USEPOPUP_NONE)
{
if (lnum > p_pvh)
lnum = p_pvh;
@@ -863,9 +872,9 @@ pum_set_selected(int n, int repeat UNUSED)
curwin->w_cursor.lnum = curwin->w_topline;
curwin->w_cursor.col = 0;
# ifdef FEAT_TEXT_PROP
- if (use_popup)
+ if (use_popup != USEPOPUP_NONE)
{
- pum_position_info_popup();
+ pum_position_info_popup(curwin);
if (win_valid(curwin_save))
redraw_win_later(curwin_save, SOME_VALID);
}
@@ -907,9 +916,16 @@ pum_set_selected(int n, int repeat UNUSED)
if (!resized && win_valid(curwin_save))
{
+# ifdef FEAT_TEXT_PROP
+ win_T *wp = curwin;
+# endif
++no_u_sync;
win_enter(curwin_save, TRUE);
--no_u_sync;
+# ifdef FEAT_TEXT_PROP
+ if (use_popup == USEPOPUP_HIDDEN && win_valid(wp))
+ popup_hide(wp);
+# endif
}
/* May need to update the screen again when there are