diff src/ex_cmds2.c @ 12244:d0b039e2ed56 v8.0.1002

patch 8.0.1002: unnecessarily updating screen after timer callback commit https://github.com/vim/vim/commit/02e177d3e85e089ebdfba1a7d937150cffcb287a Author: Bram Moolenaar <Bram@vim.org> 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.
author Christian Brabandt <cb@256bit.org>
date Sat, 26 Aug 2017 23:45:04 +0200
parents bd8d767fb36f
children ab0d827151a1
line wrap: on
line diff
--- 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;
 }