# HG changeset patch # User Christian Brabandt # Date 1471004105 -7200 # Node ID 6642768336705a0972248efb4043fbb140e4b3cb # Parent 9dd04cad0feb460351fca9c46b54edd15fa22e4b commit https://github.com/vim/vim/commit/107abd2ca53c31fd3bb40d77ff296e98eaae2975 Author: Bram Moolenaar Date: Fri Aug 12 14:08:25 2016 +0200 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. diff --git a/src/gui.c b/src/gui.c --- a/src/gui.c +++ b/src/gui.c @@ -1964,12 +1964,13 @@ gui_write( * gui_can_update_cursor() afterwards. */ void -gui_dont_update_cursor(void) +gui_dont_update_cursor(int undraw) { if (gui.in_use) { /* 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; } } diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -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 * gui_dont_update_cursor() at this point but it works as a quick * fix for now. */ - gui_dont_update_cursor(); + gui_dont_update_cursor(TRUE); do { diff --git a/src/proto/gui.pro b/src/proto/gui.pro --- a/src/proto/gui.pro +++ b/src/proto/gui.pro @@ -23,7 +23,7 @@ void gui_stop_highlight(int mask); void gui_clear_block(int row1, int col1, int row2, int col2); void gui_update_cursor_later(void); 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); int gui_outstr_nowrap(char_u *s, int len, int flags, guicolor_T fg, guicolor_T bg, int back); void gui_undraw_cursor(void); diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -498,6 +498,7 @@ update_screen(int type) int did_one; #endif #ifdef FEAT_GUI + int did_undraw = FALSE; int gui_cursor_col; int gui_cursor_row; #endif @@ -697,11 +698,12 @@ update_screen(int type) /* Remove the cursor before starting to do anything, because * scrolling may make it difficult to redraw the text under * it. */ - if (gui.in_use) + if (gui.in_use && wp == curwin) { gui_cursor_col = gui.cursor_col; gui_cursor_row = gui.cursor_row; gui_undraw_cursor(); + did_undraw = TRUE; } #endif } @@ -757,7 +759,7 @@ update_screen(int type) if (gui.in_use) { 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() * uses that. */ @@ -9679,7 +9681,7 @@ screen_ins_lines( #ifdef FEAT_GUI /* Don't update the GUI cursor here, ScreenLines[] is invalid until the * scrolling is actually carried out. */ - gui_dont_update_cursor(); + gui_dont_update_cursor(row + off <= gui.cursor_row); #endif if (*T_CCS != NUL) /* cursor relative to region */ @@ -9781,10 +9783,10 @@ screen_ins_lines( } /* - * delete lines on the screen and update ScreenLines[] - * '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. - * 'row' and 'end' are relative to the start of the region. + * Delete lines on the screen and update ScreenLines[]. + * "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. + * "row" and "end" are relative to the start of the region. * * Return OK for success, FAIL if the lines are not deleted. */ @@ -9900,7 +9902,8 @@ screen_del_lines( #ifdef FEAT_GUI /* Don't update the GUI cursor here, ScreenLines[] is invalid until the * scrolling is actually carried out. */ - gui_dont_update_cursor(); + gui_dont_update_cursor(gui.cursor_row >= row + off + && gui.cursor_row < end + off); #endif if (*T_CCS != NUL) /* cursor relative to region */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2199, +/**/ 2198, /**/ 2197,