summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-12-10 21:50:56 +0100
committerBram Moolenaar <Bram@vim.org>2019-12-10 21:50:56 +0100
commit04357fbb87e65e50cc76295aec50114adb5cbd68 (patch)
tree5a6a33328beb8ed9e2a7b21265767a4ba0433209 /src
parent2ed639abdc4000436115f378e28320b7bee38a6e (diff)
patch 8.1.2415: popup menu flickers if an info popup is usedv8.1.2415
Problem: Popup menu flickers if an info popup is used. (Nick Spoons) Solution: Set the pum_skip_redraw flag.
Diffstat (limited to 'src')
-rw-r--r--src/popupmenu.c40
-rw-r--r--src/version.c2
2 files changed, 29 insertions, 13 deletions
diff --git a/src/popupmenu.c b/src/popupmenu.c
index ceb72b4f27..f908bfca4b 100644
--- a/src/popupmenu.c
+++ b/src/popupmenu.c
@@ -36,8 +36,13 @@ static int pum_win_col;
static int pum_win_wcol;
static int pum_win_width;
-static int pum_do_redraw = FALSE; // do redraw anyway
-static int pum_skip_redraw = FALSE; // skip redraw
+// Some parts are not updated when a popup menu is visible. Setting this flag
+// makes pum_visible() return FALSE even when there is a popup menu.
+static int pum_pretend_not_visible = FALSE;
+
+// When set the popup menu will redraw soon using the pum_win_ values. Do not
+// draw over the poup menu area to avoid flicker.
+static int pum_will_redraw = FALSE;
static int pum_set_selected(int n, int repeat);
@@ -377,7 +382,7 @@ pum_call_update_screen()
int
pum_under_menu(int row, int col)
{
- return pum_skip_redraw
+ return pum_will_redraw
&& row >= pum_row
&& row < pum_row + pum_height
&& col >= pum_col - 1
@@ -410,9 +415,11 @@ pum_redraw(void)
if (call_update_screen)
{
call_update_screen = FALSE;
- pum_skip_redraw = TRUE; // do not redraw in pum_may_redraw().
+ // Do not redraw in pum_may_redraw() and don't draw in the area where
+ // the popup menu will be.
+ pum_will_redraw = TRUE;
update_screen(0);
- pum_skip_redraw = FALSE;
+ pum_will_redraw = FALSE;
}
// never display more than we have
@@ -916,9 +923,13 @@ pum_set_selected(int n, int repeat UNUSED)
// Update the screen before drawing the popup menu.
// Enable updating the status lines.
- pum_do_redraw = TRUE;
+ pum_pretend_not_visible = TRUE;
+ // But don't draw text at the new popup menu position,
+ // it causes flicker.
+ pum_will_redraw = TRUE;
update_screen(0);
- pum_do_redraw = FALSE;
+ pum_pretend_not_visible = FALSE;
+ pum_will_redraw = FALSE;
if (!resized && win_valid(curwin_save))
{
@@ -936,9 +947,11 @@ pum_set_selected(int n, int repeat UNUSED)
// May need to update the screen again when there are
// autocommands involved.
- pum_do_redraw = TRUE;
+ pum_pretend_not_visible = TRUE;
+ pum_will_redraw = TRUE;
update_screen(0);
- pum_do_redraw = FALSE;
+ pum_pretend_not_visible = FALSE;
+ pum_will_redraw = FALSE;
call_update_screen = FALSE;
}
}
@@ -990,13 +1003,14 @@ pum_clear(void)
}
/*
- * Return TRUE if the popup menu is displayed.
- * Overruled when "pum_do_redraw" is set, used to redraw the status lines.
+ * Return TRUE if the popup menu is displayed. Used to avoid some redrawing
+ * that could overwrite it. Overruled when "pum_pretend_not_visible" is set,
+ * used to redraw the status lines.
*/
int
pum_visible(void)
{
- return !pum_do_redraw && pum_array != NULL;
+ return !pum_pretend_not_visible && pum_array != NULL;
}
/*
@@ -1009,7 +1023,7 @@ pum_may_redraw(void)
int len = pum_size;
int selected = pum_selected;
- if (!pum_visible() || pum_skip_redraw)
+ if (!pum_visible() || pum_will_redraw)
return; // nothing to do
if (pum_window != curwin
diff --git a/src/version.c b/src/version.c
index 4e9dc94081..645631ec0e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2415,
+/**/
2414,
/**/
2413,