patch 8.2.1513: cannot interrupt shell used for filename expansion

Problem:    Cannot interrupt shell used for filename expansion. (Dominique
            Pellé)
Solution:   Do set tmode in mch_delay(). (closes #6770)
diff --git a/src/os_unix.c b/src/os_unix.c
index 0f61367..73caa1a 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -577,15 +577,19 @@
 }
 #endif
 
+/*
+ * "flags": MCH_DELAY_IGNOREINPUT - don't read input
+ *	    MCH_DELAY_SETTMODE - use settmode() even for short delays
+ */
     void
-mch_delay(long msec, int ignoreinput)
+mch_delay(long msec, int flags)
 {
     tmode_T	old_tmode;
 #ifdef FEAT_MZSCHEME
     long	total = msec; // remember original value
 #endif
 
-    if (ignoreinput)
+    if (flags & MCH_DELAY_IGNOREINPUT)
     {
 	// Go to cooked mode without echo, to allow SIGINT interrupting us
 	// here.  But we don't want QUIT to kill us (CTRL-\ used in a
@@ -593,7 +597,8 @@
 	// Only do this if sleeping for more than half a second.
 	in_mch_delay = TRUE;
 	old_tmode = mch_cur_tmode;
-	if (mch_cur_tmode == TMODE_RAW && msec > 500)
+	if (mch_cur_tmode == TMODE_RAW
+			       && (msec > 500 || (flags & MCH_DELAY_SETTMODE)))
 	    settmode(TMODE_SLEEP);
 
 	/*
@@ -636,10 +641,8 @@
 
 	    tv.tv_sec = msec / 1000;
 	    tv.tv_usec = (msec % 1000) * 1000;
-	    /*
-	     * NOTE: Solaris 2.6 has a bug that makes select() hang here.  Get
-	     * a patch from Sun to fix this.  Reported by Gunnar Pedersen.
-	     */
+	    // NOTE: Solaris 2.6 has a bug that makes select() hang here.  Get
+	    // a patch from Sun to fix this.  Reported by Gunnar Pedersen.
 	    select(0, NULL, NULL, NULL, &tv);
 	}
 #  endif // HAVE_SELECT
@@ -650,7 +653,7 @@
 	while (total > 0);
 #endif
 
-	if (msec > 500)
+	if (msec > 500 || (flags & MCH_DELAY_SETTMODE))
 	    settmode(old_tmode);
 	in_mch_delay = FALSE;
     }
@@ -1284,7 +1287,7 @@
 	long wait_time;
 
 	for (wait_time = 0; !sigcont_received && wait_time <= 3L; wait_time++)
-	    mch_delay(wait_time, FALSE);
+	    mch_delay(wait_time, 0);
     }
 # endif
     in_mch_suspend = FALSE;
@@ -4170,7 +4173,7 @@
 	if (wait_pid == 0)
 	{
 	    // Wait for 1 to 10 msec before trying again.
-	    mch_delay(delay_msec, TRUE);
+	    mch_delay(delay_msec, MCH_DELAY_IGNOREINPUT | MCH_DELAY_SETTMODE);
 	    if (++delay_msec > 10)
 		delay_msec = 10;
 	    continue;
@@ -5262,6 +5265,9 @@
 	    {
 		long delay_msec = 1;
 
+		out_str(T_CTE);	// possibly disables modifyOtherKeys, so that
+				// the system can recognize CTRL-C
+
 		/*
 		 * Similar to the loop above, but only handle X events, no
 		 * I/O.
@@ -5295,11 +5301,14 @@
 		    clip_update();
 
 		    // Wait for 1 to 10 msec. 1 is faster but gives the child
-		    // less time.
-		    mch_delay(delay_msec, TRUE);
+		    // less time, gradually wait longer.
+		    mch_delay(delay_msec,
+				   MCH_DELAY_IGNOREINPUT | MCH_DELAY_SETTMODE);
 		    if (++delay_msec > 10)
 			delay_msec = 10;
 		}
+
+		out_str(T_CTI);	// possibly enables modifyOtherKeys again
 	    }
 # endif
 
@@ -6710,7 +6719,7 @@
     // When running in the background, give it some time to create the temp
     // file, but don't wait for it to finish.
     if (ampersand)
-	mch_delay(10L, TRUE);
+	mch_delay(10L, MCH_DELAY_IGNOREINPUT);
 
     extra_shell_arg = NULL;		// cleanup
     show_shell_mess = TRUE;