changeset 18858:539c05ea2d3a v8.1.2415

patch 8.1.2415: popup menu flickers if an info popup is used Commit: https://github.com/vim/vim/commit/04357fbb87e65e50cc76295aec50114adb5cbd68 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Dec 10 21:50:56 2019 +0100 patch 8.1.2415: popup menu flickers if an info popup is used Problem: Popup menu flickers if an info popup is used. (Nick Spoons) Solution: Set the pum_skip_redraw flag.
author Bram Moolenaar <Bram@vim.org>
date Tue, 10 Dec 2019 22:00:04 +0100
parents 70ce979e76bc
children 5b30956b26a4
files src/popupmenu.c src/version.c
diffstat 2 files changed, 29 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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 UNUSE
 
 			// 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 UNUSE
 
 			// 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
--- 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,