diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-12-10 21:50:56 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-12-10 21:50:56 +0100 |
commit | 04357fbb87e65e50cc76295aec50114adb5cbd68 (patch) | |
tree | 5a6a33328beb8ed9e2a7b21265767a4ba0433209 | |
parent | 2ed639abdc4000436115f378e28320b7bee38a6e (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.
-rw-r--r-- | src/popupmenu.c | 40 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |