patch 8.1.1192: mode is not cleared when leaving Insert mode with mapped Esc

Problem:    Mode is not cleared when leaving Insert mode with mapped Esc.
Solution:   Clear the mode when redraw_cmdline is set. (closes #4269)
diff --git a/src/globals.h b/src/globals.h
index 6f4144a..e3a2c3b 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -90,12 +90,13 @@
  */
 EXTERN int	cmdline_row;
 
-EXTERN int	redraw_cmdline INIT(= FALSE);	/* cmdline must be redrawn */
-EXTERN int	clear_cmdline INIT(= FALSE);	/* cmdline must be cleared */
-EXTERN int	mode_displayed INIT(= FALSE);	/* mode is being displayed */
-EXTERN int	no_win_do_lines_ins INIT(= FALSE); /* don't insert lines */
+EXTERN int	redraw_cmdline INIT(= FALSE);	// cmdline must be redrawn
+EXTERN int	redraw_mode INIT(= FALSE);	// mode must be redrawn
+EXTERN int	clear_cmdline INIT(= FALSE);	// cmdline must be cleared
+EXTERN int	mode_displayed INIT(= FALSE);	// mode is being displayed
+EXTERN int	no_win_do_lines_ins INIT(= FALSE); // don't insert lines
 #if defined(FEAT_CRYPT) || defined(FEAT_EVAL)
-EXTERN int	cmdline_star INIT(= FALSE);	/* cmdline is crypted */
+EXTERN int	cmdline_star INIT(= FALSE);	// cmdline is crypted
 #endif
 
 EXTERN int	exec_from_reg INIT(= FALSE);	/* executing register */
diff --git a/src/screen.c b/src/screen.c
index 1c21b74..67a0db9 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -790,7 +790,7 @@
 
     /* Clear or redraw the command line.  Done last, because scrolling may
      * mess up the command line. */
-    if (clear_cmdline || redraw_cmdline)
+    if (clear_cmdline || redraw_cmdline || redraw_mode)
 	showmode();
 
     if (no_update)
@@ -857,7 +857,7 @@
     static void
 update_finish(void)
 {
-    if (redraw_cmdline)
+    if (redraw_cmdline || redraw_mode)
 	showmode();
 
 # ifdef FEAT_SEARCH_EXTRA
@@ -10128,7 +10128,7 @@
 	    || !redrawing()
 	    || (char_avail() && !KeyTyped))
     {
-	redraw_cmdline = TRUE;		// show mode later
+	redraw_mode = TRUE;		// show mode later
 	return TRUE;
     }
     return FALSE;
@@ -10140,6 +10140,7 @@
  * If clear_cmdline is TRUE, clear the rest of the cmdline.
  * If clear_cmdline is FALSE there may be a message there that needs to be
  * cleared only if a mode is shown.
+ * If redraw_mode is TRUE show or clear the mode.
  * Return the length of the message (0 if no message).
  */
     int
@@ -10313,7 +10314,7 @@
 	}
 
 	mode_displayed = TRUE;
-	if (need_clear || clear_cmdline)
+	if (need_clear || clear_cmdline || redraw_mode)
 	    msg_clr_eos();
 	msg_didout = FALSE;		/* overwrite this message */
 	length = msg_col;
@@ -10323,6 +10324,11 @@
     else if (clear_cmdline && msg_silent == 0)
 	/* Clear the whole command line.  Will reset "clear_cmdline". */
 	msg_clr_cmdline();
+    else if (redraw_mode)
+    {
+	msg_pos_mode();
+	msg_clr_eos();
+    }
 
 #ifdef FEAT_CMDL_INFO
     /* In Visual mode the size of the selected area must be redrawn. */
@@ -10335,6 +10341,7 @@
 	win_redr_ruler(lastwin, TRUE, FALSE);
 #endif
     redraw_cmdline = FALSE;
+    redraw_mode = FALSE;
     clear_cmdline = FALSE;
 
     return length;
diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim
index 2d1d6d9..5708183 100644
--- a/src/testdir/test_messages.vim
+++ b/src/testdir/test_messages.vim
@@ -125,3 +125,31 @@
   exe buf . 'bwipe!'
   call delete(testfile)
 endfunc
+
+func Test_mode_message_at_leaving_insert_with_esc_mapped()
+  if !has('terminal') || has('gui_running')
+    return
+  endif
+
+  " Set custom statusline built by user-defined function.
+  let testfile = 'Xtest.vim'
+  call writefile([
+        \ 'set laststatus=2',
+        \ 'inoremap <Esc> <Esc>00',
+        \ ], testfile)
+
+  let rows = 10
+  let buf = term_start([GetVimProg(), '--clean', '-S', testfile], {'term_rows': rows})
+  call term_wait(buf, 200)
+  call assert_equal('run', job_status(term_getjob(buf)))
+
+  call term_sendkeys(buf, "i")
+  call WaitForAssert({-> assert_match('^-- INSERT --\s*$', term_getline(buf, rows))})
+  call term_sendkeys(buf, "\<Esc>")
+  call WaitForAssert({-> assert_match('^\s*$', term_getline(buf, rows))})
+
+  call term_sendkeys(buf, ":qall!\<CR>")
+  call WaitForAssert({-> assert_equal('dead', job_status(term_getjob(buf)))})
+  exe buf . 'bwipe!'
+  call delete(testfile)
+endfunc
diff --git a/src/version.c b/src/version.c
index 7fc39ae..2448efd 100644
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1192,
+/**/
     1191,
 /**/
     1190,