# HG changeset patch # User Bram Moolenaar # Date 1598185805 -7200 # Node ID 88070e222e824a76901752ae90b96d87217687cd # Parent ec5898bccf0802de50c8f4ca267c07c32d3214ff patch 8.2.1513: cannot interrupt shell used for filename expansion Commit: https://github.com/vim/vim/commit/0981c8729e09551f2e8e6c159bc29f2c1d04019c Author: Bram Moolenaar Date: Sun Aug 23 14:28:37 2020 +0200 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/channel.c b/src/channel.c --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- a/src/proto/os_unix.pro +++ b/src/proto/os_unix.pro @@ -5,7 +5,7 @@ int mch_inchar(char_u *buf, int maxlen, 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 --- 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 *h 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 --- 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 --- 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 --- 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 --- 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