# HG changeset patch # User Bram Moolenaar # Date 1589223603 -7200 # Node ID b84e366e04187b1ee512b44a815577286b7bf7f4 # Parent 56a7fdb97a5d1adcc448b5458da9961960b1bb50 patch 8.2.0737: when shell doesn't support CTRL-Z Vim still handles it Commit: https://github.com/vim/vim/commit/5c3128efe6bc48cbd88da23973db389ad3b8ab63 Author: Bram Moolenaar Date: Mon May 11 20:54:42 2020 +0200 patch 8.2.0737: when shell doesn't support CTRL-Z Vim still handles it Problem: When shell doesn't support CTRL-Z Vim still handles it. Solution: Ignore the STOP signal if it was ignored on startup. (Kurtis Rader, closes #5990, closes #6058) diff --git a/src/os_unix.c b/src/os_unix.c --- a/src/os_unix.c +++ b/src/os_unix.c @@ -129,6 +129,8 @@ Window x11_window = 0; Display *x11_display = NULL; #endif +static int ignore_sigtstp = FALSE; + #ifdef FEAT_TITLE static int get_x11_title(int); @@ -1237,6 +1239,9 @@ restore_clipboard(void) void mch_suspend(void) { + if (ignore_sigtstp) + return; + // BeOS does have SIGTSTP, but it doesn't work. #if defined(SIGTSTP) && !defined(__BEOS__) in_mch_suspend = TRUE; @@ -1286,6 +1291,14 @@ mch_init(void) Rows = 24; out_flush(); + +#ifdef SIGTSTP + // Check whether we were invoked with SIGTSTP set to be ignored. If it is + // that indicates the shell (or program) that launched us does not support + // tty job control and thus we should ignore that signal. If invoked as a + // restricted editor (e.g., as "rvim") SIGTSTP is always ignored. + ignore_sigtstp = restricted || SIG_IGN == signal(SIGTSTP, SIG_ERR); +#endif set_signals(); #ifdef MACOS_CONVERT @@ -1306,17 +1319,13 @@ set_signals(void) signal(SIGWINCH, (RETSIGTYPE (*)())sig_winch); #endif - /* - * We want the STOP signal to work, to make mch_suspend() work. - * For "rvim" the STOP signal is ignored. - */ #ifdef SIGTSTP - signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); + // See mch_init() for the conditions under which we ignore SIGTSTP. + signal(SIGTSTP, ignore_sigtstp ? SIG_IGN : SIG_DFL); #endif #if defined(SIGCONT) signal(SIGCONT, sigcont_handler); #endif - /* * We want to ignore breaking of PIPEs. */ @@ -1386,6 +1395,7 @@ catch_signals( int i; for (i = 0; signal_info[i].sig != -1; i++) + { if (signal_info[i].deadly) { #if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION) @@ -1420,7 +1430,17 @@ catch_signals( #endif } else if (func_other != SIG_ERR) + { + // Deal with non-deadly signals. +#ifdef SIGTSTP + signal(signal_info[i].sig, + signal_info[i].sig == SIGTSTP && ignore_sigtstp + ? SIG_IGN : func_other); +#else signal(signal_info[i].sig, func_other); +#endif + } + } } #ifdef HAVE_SIGPROCMASK diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 737, +/**/ 736, /**/ 735,