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
index b31d95d..886522b 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -2887,7 +2887,7 @@
 	      if (channel_need_redraw)
 	      {
 		  channel_need_redraw = FALSE;
-		  redraw_after_callback();
+		  redraw_after_callback(TRUE);
 	      }
 
 	      if (!channel->ch_drop_never)
@@ -4130,7 +4130,7 @@
     if (channel_need_redraw)
     {
 	channel_need_redraw = FALSE;
-	redraw_after_callback();
+	redraw_after_callback(TRUE);
     }
 
     --safe_to_invoke_callback;
@@ -5230,7 +5230,7 @@
     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
index 3682e79..18930a6 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -1194,6 +1194,7 @@
     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 @@
 	    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 @@
 	    }
 	    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 @@
     }
 
     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
index 4e89293..b40e0da 100644
--- a/src/proto/screen.pro
+++ b/src/proto/screen.pro
@@ -7,7 +7,7 @@
 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 @@
 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
index 54ba957..b576214 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -445,9 +445,11 @@
  * 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 @@
 #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 @@
     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
index c522613..a8c7ae5 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -669,7 +669,7 @@
 	    update_cursor(term, TRUE);
 	}
 	else
-	    redraw_after_callback();
+	    redraw_after_callback(TRUE);
     }
 }
 
diff --git a/src/version.c b/src/version.c
index f8eb491..d79f429 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1002,
+/**/
     1001,
 /**/
     1000,