summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-23 14:28:37 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-23 14:28:37 +0200
commit0981c8729e09551f2e8e6c159bc29f2c1d04019c (patch)
treefb59625d83fd366041f504191b5dbfadea1d81c9
parent69e44552c567ff25b363ba0790ad3d43fa0397a7 (diff)
patch 8.2.1513: cannot interrupt shell used for filename expansionv8.2.1513
Problem: Cannot interrupt shell used for filename expansion. (Dominique Pellé) Solution: Do set tmode in mch_delay(). (closes #6770)
-rw-r--r--src/channel.c2
-rw-r--r--src/if_cscope.c4
-rw-r--r--src/os_amiga.c6
-rw-r--r--src/os_unix.c35
-rw-r--r--src/os_win32.c4
-rw-r--r--src/proto/os_amiga.pro2
-rw-r--r--src/proto/os_unix.pro2
-rw-r--r--src/proto/os_win32.pro2
-rw-r--r--src/term.c2
-rw-r--r--src/ui.c2
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h4
12 files changed, 41 insertions, 26 deletions
diff --git a/src/channel.c b/src/channel.c
index 3e7ec96598..0b41133c2d 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -904,7 +904,7 @@ channel_connect(
*waittime -= elapsed_msec;
if (waitnow > 0)
{
- mch_delay((long)waitnow, TRUE);
+ mch_delay((long)waitnow, MCH_DELAY_IGNOREINPUT);
ui_breakcheck();
*waittime -= waitnow;
}
diff --git a/src/if_cscope.c b/src/if_cscope.c
index 0e6f5ae30f..c027c71b48 100644
--- a/src/if_cscope.c
+++ b/src/if_cscope.c
@@ -2243,7 +2243,7 @@ cs_release_csp(int i, int freefnpp)
waitpid_errno = errno;
if (pid != 0)
break; // break unless the process is still running
- mch_delay(50L, FALSE); // sleep 50 ms
+ mch_delay(50L, 0); // sleep 50 ms
}
# endif
/*
@@ -2278,7 +2278,7 @@ cs_release_csp(int i, int freefnpp)
alive = FALSE; // cscope process no longer exists
break;
}
- mch_delay(50L, FALSE); // sleep 50ms
+ mch_delay(50L, 0); // sleep 50 ms
}
}
if (alive)
diff --git a/src/os_amiga.c b/src/os_amiga.c
index 850c26acda..91c13e7d29 100644
--- a/src/os_amiga.c
+++ b/src/os_amiga.c
@@ -222,10 +222,10 @@ mch_avail_mem(int special)
/*
* Waits a specified amount of time, or until input arrives if
- * ignoreinput is FALSE.
+ * flags does not have MCH_DELAY_IGNOREINPUT.
*/
void
-mch_delay(long msec, int ignoreinput)
+mch_delay(long msec, int flags)
{
#ifndef LATTICE // SAS declares void Delay(ULONG)
void Delay(long);
@@ -233,7 +233,7 @@ mch_delay(long msec, int ignoreinput)
if (msec > 0)
{
- if (ignoreinput)
+ if (flags & MCH_DELAY_IGNOREINPUT)
Delay(msec / 20L); // Delay works with 20 msec intervals
else
WaitForChar(raw_in, msec * 1000L);
diff --git a/src/os_unix.c b/src/os_unix.c
index 0f61367f2a..73caa1a3e4 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -577,15 +577,19 @@ mch_total_mem(int special UNUSED)
}
#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 @@ mch_delay(long msec, int ignoreinput)
// 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 @@ mch_delay(long msec, int ignoreinput)
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 @@ mch_delay(long msec, int ignoreinput)
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 @@ mch_suspend(void)
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 @@ wait4pid(pid_t child, waitstatus *status)
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 @@ finished:
{
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 @@ finished:
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 @@ mch_expand_wildcards(
// 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;
diff --git a/src/os_win32.c b/src/os_win32.c
index 43ad1026d5..96af44364b 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -6739,7 +6739,7 @@ notsgr:
void
mch_delay(
long msec,
- int ignoreinput UNUSED)
+ int flags UNUSED)
{
#if defined(FEAT_GUI_MSWIN) && !defined(VIMDLL)
Sleep((int)msec); // never wait for input
@@ -6751,7 +6751,7 @@ mch_delay(
return;
}
# endif
- if (ignoreinput)
+ if (flags & MCH_DELAY_IGNOREINPUT)
# ifdef FEAT_MZSCHEME
if (mzthreads_allowed() && p_mzq > 0 && msec > p_mzq)
{
diff --git a/src/proto/os_amiga.pro b/src/proto/os_amiga.pro
index b2ad9c3b55..abebae154f 100644
--- a/src/proto/os_amiga.pro
+++ b/src/proto/os_amiga.pro
@@ -5,7 +5,7 @@ void mch_write(char_u *p, int len);
int mch_inchar(char_u *buf, int maxlen, long time, int tb_change_cnt);
int mch_char_avail(void);
long_u mch_avail_mem(int special);
-void mch_delay(long msec, int ignoreinput);
+void mch_delay(long msec, int flags);
void mch_suspend(void);
void mch_init(void);
int mch_check_win(int argc, char **argv);
diff --git a/src/proto/os_unix.pro b/src/proto/os_unix.pro
index cb84994429..ee22b4a422 100644
--- a/src/proto/os_unix.pro
+++ b/src/proto/os_unix.pro
@@ -5,7 +5,7 @@ int mch_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
int mch_char_avail(void);
int mch_check_messages(void);
long_u mch_total_mem(int special);
-void mch_delay(long msec, int ignoreinput);
+void mch_delay(long msec, int flags);
int mch_stackcheck(char *p);
void mch_suspend(void);
void mch_init(void);
diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro
index 85c09c0ba1..18c81273e1 100644
--- a/src/proto/os_win32.pro
+++ b/src/proto/os_win32.pro
@@ -53,7 +53,7 @@ int mch_signal_job(job_T *job, char_u *how);
void mch_clear_job(job_T *job);
void mch_set_normal_colors(void);
void mch_write(char_u *s, int len);
-void mch_delay(long msec, int ignoreinput);
+void mch_delay(long msec, int flags);
int mch_remove(char_u *name);
void mch_breakcheck(int force);
long_u mch_total_mem(int special);
diff --git a/src/term.c b/src/term.c
index 3648df6d50..b1a7a66c58 100644
--- a/src/term.c
+++ b/src/term.c
@@ -3598,7 +3598,7 @@ stoptermcap(void)
{
# ifdef UNIX
// Give the terminal a chance to respond.
- mch_delay(100L, FALSE);
+ mch_delay(100L, 0);
# endif
# ifdef TCIFLUSH
// Discard data received but not read.
diff --git a/src/ui.c b/src/ui.c
index e473f85259..fc24a01b4d 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -539,7 +539,7 @@ ui_delay(long msec_arg, int ignoreinput)
gui_wait_for_chars(msec, typebuf.tb_change_cnt);
else
#endif
- mch_delay(msec, ignoreinput);
+ mch_delay(msec, ignoreinput ? MCH_DELAY_IGNOREINPUT : 0);
}
/*
diff --git a/src/version.c b/src/version.c
index 2b996d6914..b52d4a8c62 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1513,
+/**/
1512,
/**/
1511,
diff --git a/src/vim.h b/src/vim.h
index 2b28948726..7bcc488c81 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -2668,4 +2668,8 @@ long elapsed(DWORD start_tick);
#define READDIR_SORT_IC 2 // sort ignoring case (strcasecmp)
#define READDIR_SORT_COLLATE 3 // sort according to collation (strcoll)
+// Flags for mch_delay.
+#define MCH_DELAY_IGNOREINPUT 1
+#define MCH_DELAY_SETTMODE 2
+
#endif // VIM__H