mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04:00
patch 8.2.2803: flicker when the popup menu has an info popup
Problem: Flicker when the popup menu has an info popup. Solution: Avoid drawing over the popup when it's going to be redrawn in the same position. (closes #8131) Also avoid redrawing the scrollbar.
This commit is contained in:
@@ -93,6 +93,7 @@ update_screen(int type_arg)
|
|||||||
int gui_cursor_row = 0;
|
int gui_cursor_row = 0;
|
||||||
#endif
|
#endif
|
||||||
int no_update = FALSE;
|
int no_update = FALSE;
|
||||||
|
int save_pum_will_redraw = pum_will_redraw;
|
||||||
|
|
||||||
// Don't do anything if the screen structures are (not yet) valid.
|
// Don't do anything if the screen structures are (not yet) valid.
|
||||||
if (!screen_valid(TRUE))
|
if (!screen_valid(TRUE))
|
||||||
@@ -276,6 +277,11 @@ update_screen(int type_arg)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (pum_redraw_in_same_position())
|
||||||
|
// Avoid flicker if the popup menu is going to be redrawn in the same
|
||||||
|
// position.
|
||||||
|
pum_will_redraw = TRUE;
|
||||||
|
|
||||||
// Go from top to bottom through the windows, redrawing the ones that need
|
// Go from top to bottom through the windows, redrawing the ones that need
|
||||||
// it.
|
// it.
|
||||||
#if defined(FEAT_SEARCH_EXTRA) || defined(FEAT_CLIPBOARD)
|
#if defined(FEAT_SEARCH_EXTRA) || defined(FEAT_CLIPBOARD)
|
||||||
@@ -321,7 +327,9 @@ update_screen(int type_arg)
|
|||||||
#if defined(FEAT_SEARCH_EXTRA)
|
#if defined(FEAT_SEARCH_EXTRA)
|
||||||
end_search_hl();
|
end_search_hl();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// May need to redraw the popup menu.
|
// May need to redraw the popup menu.
|
||||||
|
pum_will_redraw = save_pum_will_redraw;
|
||||||
pum_may_redraw();
|
pum_may_redraw();
|
||||||
|
|
||||||
// Reset b_mod_set flags. Going through all windows is probably faster
|
// Reset b_mod_set flags. Going through all windows is probably faster
|
||||||
|
@@ -741,6 +741,10 @@ EXTERN int popup_visible INIT(= FALSE);
|
|||||||
EXTERN int text_prop_frozen INIT(= 0);
|
EXTERN int text_prop_frozen INIT(= 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// When set the popup menu will redraw soon using the pum_win_ values. Do not
|
||||||
|
// draw over the poup menu area to avoid flicker.
|
||||||
|
EXTERN int pum_will_redraw INIT(= FALSE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The window layout is kept in a tree of frames. topframe points to the top
|
* The window layout is kept in a tree of frames. topframe points to the top
|
||||||
* of the tree.
|
* of the tree.
|
||||||
|
@@ -40,10 +40,6 @@ static int pum_win_width;
|
|||||||
// makes pum_visible() return FALSE even when there is a popup menu.
|
// makes pum_visible() return FALSE even when there is a popup menu.
|
||||||
static int pum_pretend_not_visible = FALSE;
|
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);
|
static int pum_set_selected(int n, int repeat);
|
||||||
|
|
||||||
#define PUM_DEF_HEIGHT 10
|
#define PUM_DEF_HEIGHT 10
|
||||||
@@ -392,7 +388,7 @@ pum_under_menu(int row, int col)
|
|||||||
&& row >= pum_row
|
&& row >= pum_row
|
||||||
&& row < pum_row + pum_height
|
&& row < pum_row + pum_height
|
||||||
&& col >= pum_col - 1
|
&& col >= pum_col - 1
|
||||||
&& col < pum_col + pum_width;
|
&& col < pum_col + pum_width + pum_scrollbar;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1048,6 +1044,32 @@ pum_visible(void)
|
|||||||
return !pum_pretend_not_visible && pum_array != NULL;
|
return !pum_pretend_not_visible && pum_array != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE if the popup can be redrawn in the same position.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
pum_in_same_position(void)
|
||||||
|
{
|
||||||
|
return pum_window != curwin
|
||||||
|
|| (pum_win_row == curwin->w_wrow + W_WINROW(curwin)
|
||||||
|
&& pum_win_height == curwin->w_height
|
||||||
|
&& pum_win_col == curwin->w_wincol
|
||||||
|
&& pum_win_width == curwin->w_width);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE when pum_may_redraw() will call pum_redraw().
|
||||||
|
* This means that the pum area should not be overwritten to avoid flicker.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
pum_redraw_in_same_position(void)
|
||||||
|
{
|
||||||
|
if (!pum_visible() || pum_will_redraw)
|
||||||
|
return FALSE; // nothing to do
|
||||||
|
|
||||||
|
return pum_in_same_position();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reposition the popup menu to adjust for window layout changes.
|
* Reposition the popup menu to adjust for window layout changes.
|
||||||
*/
|
*/
|
||||||
@@ -1061,11 +1083,7 @@ pum_may_redraw(void)
|
|||||||
if (!pum_visible() || pum_will_redraw)
|
if (!pum_visible() || pum_will_redraw)
|
||||||
return; // nothing to do
|
return; // nothing to do
|
||||||
|
|
||||||
if (pum_window != curwin
|
if (pum_in_same_position())
|
||||||
|| (pum_win_row == curwin->w_wrow + W_WINROW(curwin)
|
|
||||||
&& pum_win_height == curwin->w_height
|
|
||||||
&& pum_win_col == curwin->w_wincol
|
|
||||||
&& pum_win_width == curwin->w_width))
|
|
||||||
{
|
{
|
||||||
// window position didn't change, redraw in the same position
|
// window position didn't change, redraw in the same position
|
||||||
pum_redraw();
|
pum_redraw();
|
||||||
|
@@ -7,6 +7,7 @@ void pum_position_info_popup(win_T *wp);
|
|||||||
void pum_undisplay(void);
|
void pum_undisplay(void);
|
||||||
void pum_clear(void);
|
void pum_clear(void);
|
||||||
int pum_visible(void);
|
int pum_visible(void);
|
||||||
|
int pum_redraw_in_same_position(void);
|
||||||
void pum_may_redraw(void);
|
void pum_may_redraw(void);
|
||||||
int pum_get_height(void);
|
int pum_get_height(void);
|
||||||
void pum_set_event_info(dict_T *dict);
|
void pum_set_event_info(dict_T *dict);
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2803,
|
||||||
/**/
|
/**/
|
||||||
2802,
|
2802,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user