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:
parent
0e5d3a2940
commit
107abd2ca5
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
19
src/screen.c
19
src/screen.c
@ -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 */
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user