diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-08-26 23:43:28 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-08-26 23:43:28 +0200 |
commit | 02e177d3e85e089ebdfba1a7d937150cffcb287a (patch) | |
tree | 8dd39ac4f0b474700a6f0935c98ac2fa99586fe8 /src/ex_cmds2.c | |
parent | 0903d56f5ca69bb1fa0bbb00ed2a3d9c4d06ddb4 (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.c | 9 |
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; } |