# HG changeset patch # User Christian Brabandt # Date 1503783904 -7200 # Node ID d0b039e2ed56b8486af76fad450621eb9671362c # Parent c91be926abaf650eab9ab669e3aa0a69e8453803 patch 8.0.1002: unnecessarily updating screen after timer callback commit https://github.com/vim/vim/commit/02e177d3e85e089ebdfba1a7d937150cffcb287a Author: Bram Moolenaar Date: Sat Aug 26 23:43:28 2017 +0200 patch 8.0.1002: unnecessarily updating screen after timer callback Problem: Unnecessarily updating screen after timer callback. Solution: Check if calling the timer sets must_redraw. diff --git a/src/channel.c b/src/channel.c --- a/src/channel.c +++ b/src/channel.c @@ -2887,7 +2887,7 @@ channel_close(channel_T *channel, int in if (channel_need_redraw) { channel_need_redraw = FALSE; - redraw_after_callback(); + redraw_after_callback(TRUE); } if (!channel->ch_drop_never) @@ -4130,7 +4130,7 @@ channel_parse_messages(void) if (channel_need_redraw) { channel_need_redraw = FALSE; - redraw_after_callback(); + redraw_after_callback(TRUE); } --safe_to_invoke_callback; @@ -5230,7 +5230,7 @@ job_check_ended(void) if (channel_need_redraw) { channel_need_redraw = FALSE; - redraw_after_callback(); + redraw_after_callback(TRUE); } } diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -1194,6 +1194,7 @@ check_due_timer(void) long next_due = -1; proftime_T now; int did_one = FALSE; + int need_update_screen = FALSE; long current_id = last_timer_id; # ifdef WIN3264 LARGE_INTEGER fr; @@ -1221,10 +1222,12 @@ check_due_timer(void) int did_emsg_save = did_emsg; int called_emsg_save = called_emsg; int did_throw_save = did_throw; + int save_must_redraw = must_redraw; timer_busy = timer_busy > 0 || vgetc_busy > 0; vgetc_busy = 0; called_emsg = FALSE; + must_redraw = 0; timer->tr_firing = TRUE; timer_callback(timer); timer->tr_firing = FALSE; @@ -1240,6 +1243,10 @@ check_due_timer(void) } did_emsg = did_emsg_save; called_emsg = called_emsg_save; + if (must_redraw != 0) + need_update_screen = TRUE; + must_redraw = must_redraw > save_must_redraw + ? must_redraw : save_must_redraw; /* Only fire the timer again if it repeats and stop_timer() wasn't * called while inside the callback (tr_id == -1). */ @@ -1265,7 +1272,7 @@ check_due_timer(void) } if (did_one) - redraw_after_callback(); + redraw_after_callback(need_update_screen); return current_id != last_timer_id ? 1 : next_due; } diff --git a/src/proto/screen.pro b/src/proto/screen.pro --- a/src/proto/screen.pro +++ b/src/proto/screen.pro @@ -7,7 +7,7 @@ void redraw_curbuf_later(int type); void redraw_buf_later(buf_T *buf, int type); void redraw_buf_and_status_later(buf_T *buf, int type); int redraw_asap(int type); -void redraw_after_callback(void); +void redraw_after_callback(int call_update_screen); void redrawWinline(linenr_T lnum, int invalid); void update_curbuf(int type); void update_screen(int type_arg); @@ -47,7 +47,7 @@ void setcursor(void); int win_ins_lines(win_T *wp, int row, int line_count, int invalid, int mayclear); int win_del_lines(win_T *wp, int row, int line_count, int invalid, int mayclear, int clear_attr); int screen_ins_lines(int off, int row, int line_count, int end, int clear_attr, win_T *wp); -int screen_del_lines(int off, int row, int line_count, int end, int force, int attr, win_T *wp); +int screen_del_lines(int off, int row, int line_count, int end, int force, int clear_attr, win_T *wp); int showmode(void); void unshowmode(int force); void clearmode(void); diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -445,9 +445,11 @@ redraw_asap(int type) * Invoked after an asynchronous callback is called. * If an echo command was used the cursor needs to be put back where * it belongs. If highlighting was changed a redraw is needed. + * If "call_update_screen" is FALSE don't call update_screen() when at the + * command line. */ void -redraw_after_callback(void) +redraw_after_callback(int call_update_screen) { ++redrawing_for_callback; @@ -461,7 +463,7 @@ redraw_after_callback(void) #ifdef FEAT_WILDMENU && wild_menu_showing == 0 #endif - ) + && call_update_screen) update_screen(0); /* Redraw in the same position, so that the user can continue * editing the command. */ @@ -3013,7 +3015,7 @@ win_line( int startrow, int endrow, int nochange UNUSED, /* not updating for changed text */ - proftime_T *syntax_tm) + proftime_T *syntax_tm UNUSED) { int col = 0; /* visual column on screen */ unsigned off; /* offset in ScreenLines/ScreenAttrs */ diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -669,7 +669,7 @@ write_to_term(buf_T *buffer, char_u *msg update_cursor(term, TRUE); } else - redraw_after_callback(); + redraw_after_callback(TRUE); } } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -770,6 +770,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1002, +/**/ 1001, /**/ 1000,