1
0
forked from aniani/vim

patch 7.4.2199

Problem:    In the GUI the cursor is hidden when redrawing any window,
            causing flicker.
Solution:   Only undraw the cursor when updating the window it's in.
This commit is contained in:
Bram Moolenaar 2016-08-12 14:08:25 +02:00
parent 0e5d3a2940
commit 107abd2ca5
5 changed files with 18 additions and 12 deletions

View File

@ -1964,12 +1964,13 @@ gui_write(
* gui_can_update_cursor() afterwards. * gui_can_update_cursor() afterwards.
*/ */
void void
gui_dont_update_cursor(void) gui_dont_update_cursor(int undraw)
{ {
if (gui.in_use) if (gui.in_use)
{ {
/* Undraw the cursor now, we probably can't do it after the change. */ /* Undraw the cursor now, we probably can't do it after the change. */
gui_undraw_cursor(); if (undraw)
gui_undraw_cursor();
can_update_cursor = FALSE; can_update_cursor = FALSE;
} }
} }

View File

@ -6698,7 +6698,7 @@ check_copy_area(void)
* we don't want it to be. I'm not sure if it's correct to call * we don't want it to be. I'm not sure if it's correct to call
* gui_dont_update_cursor() at this point but it works as a quick * gui_dont_update_cursor() at this point but it works as a quick
* fix for now. */ * fix for now. */
gui_dont_update_cursor(); gui_dont_update_cursor(TRUE);
do do
{ {

View File

@ -23,7 +23,7 @@ void gui_stop_highlight(int mask);
void gui_clear_block(int row1, int col1, int row2, int col2); void gui_clear_block(int row1, int col1, int row2, int col2);
void gui_update_cursor_later(void); void gui_update_cursor_later(void);
void gui_write(char_u *s, int len); void gui_write(char_u *s, int len);
void gui_dont_update_cursor(void); void gui_dont_update_cursor(int undraw);
void gui_can_update_cursor(void); void gui_can_update_cursor(void);
int gui_outstr_nowrap(char_u *s, int len, int flags, guicolor_T fg, guicolor_T bg, int back); int gui_outstr_nowrap(char_u *s, int len, int flags, guicolor_T fg, guicolor_T bg, int back);
void gui_undraw_cursor(void); void gui_undraw_cursor(void);

View File

@ -498,6 +498,7 @@ update_screen(int type)
int did_one; int did_one;
#endif #endif
#ifdef FEAT_GUI #ifdef FEAT_GUI
int did_undraw = FALSE;
int gui_cursor_col; int gui_cursor_col;
int gui_cursor_row; int gui_cursor_row;
#endif #endif
@ -697,11 +698,12 @@ update_screen(int type)
/* Remove the cursor before starting to do anything, because /* Remove the cursor before starting to do anything, because
* scrolling may make it difficult to redraw the text under * scrolling may make it difficult to redraw the text under
* it. */ * it. */
if (gui.in_use) if (gui.in_use && wp == curwin)
{ {
gui_cursor_col = gui.cursor_col; gui_cursor_col = gui.cursor_col;
gui_cursor_row = gui.cursor_row; gui_cursor_row = gui.cursor_row;
gui_undraw_cursor(); gui_undraw_cursor();
did_undraw = TRUE;
} }
#endif #endif
} }
@ -757,7 +759,7 @@ update_screen(int type)
if (gui.in_use) if (gui.in_use)
{ {
out_flush(); /* required before updating the cursor */ out_flush(); /* required before updating the cursor */
if (did_one && !gui_mch_is_blink_off()) if (did_undraw && !gui_mch_is_blink_off())
{ {
/* Put the GUI position where the cursor was, gui_update_cursor() /* Put the GUI position where the cursor was, gui_update_cursor()
* uses that. */ * uses that. */
@ -9679,7 +9681,7 @@ screen_ins_lines(
#ifdef FEAT_GUI #ifdef FEAT_GUI
/* Don't update the GUI cursor here, ScreenLines[] is invalid until the /* Don't update the GUI cursor here, ScreenLines[] is invalid until the
* scrolling is actually carried out. */ * scrolling is actually carried out. */
gui_dont_update_cursor(); gui_dont_update_cursor(row + off <= gui.cursor_row);
#endif #endif
if (*T_CCS != NUL) /* cursor relative to region */ if (*T_CCS != NUL) /* cursor relative to region */
@ -9781,10 +9783,10 @@ screen_ins_lines(
} }
/* /*
* delete lines on the screen and update ScreenLines[] * Delete lines on the screen and update ScreenLines[].
* 'end' is the line after the scrolled part. Normally it is Rows. * "end" is the line after the scrolled part. Normally it is Rows.
* When scrolling region used 'off' is the offset from the top for the region. * When scrolling region used "off" is the offset from the top for the region.
* 'row' and 'end' are relative to the start of the region. * "row" and "end" are relative to the start of the region.
* *
* Return OK for success, FAIL if the lines are not deleted. * Return OK for success, FAIL if the lines are not deleted.
*/ */
@ -9900,7 +9902,8 @@ screen_del_lines(
#ifdef FEAT_GUI #ifdef FEAT_GUI
/* Don't update the GUI cursor here, ScreenLines[] is invalid until the /* Don't update the GUI cursor here, ScreenLines[] is invalid until the
* scrolling is actually carried out. */ * scrolling is actually carried out. */
gui_dont_update_cursor(); gui_dont_update_cursor(gui.cursor_row >= row + off
&& gui.cursor_row < end + off);
#endif #endif
if (*T_CCS != NUL) /* cursor relative to region */ if (*T_CCS != NUL) /* cursor relative to region */

View File

@ -763,6 +763,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 */
/**/
2199,
/**/ /**/
2198, 2198,
/**/ /**/