summaryrefslogtreecommitdiffstats
path: root/src/ex_cmds2.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-08-26 23:43:28 +0200
committerBram Moolenaar <Bram@vim.org>2017-08-26 23:43:28 +0200
commit02e177d3e85e089ebdfba1a7d937150cffcb287a (patch)
tree8dd39ac4f0b474700a6f0935c98ac2fa99586fe8 /src/ex_cmds2.c
parent0903d56f5ca69bb1fa0bbb00ed2a3d9c4d06ddb4 (diff)
patch 8.0.1002: unnecessarily updating screen after timer callbackv8.0.1002
Problem: Unnecessarily updating screen after timer callback. Solution: Check if calling the timer sets must_redraw.
Diffstat (limited to 'src/ex_cmds2.c')
-rw-r--r--src/ex_cmds2.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 3682e797ab..18930a6cfb 100644
--- 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;
}