From: Bram Moolenaar Date: Tue, 7 Aug 2018 15:38:41 +0000 (+0200) Subject: patch 8.1.0244: no redraw when using a STOP signal on Vim and then CONT X-Git-Tag: v8.1.0244 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=917e32bda5a93941fbbccab09ae3960114b67188;p=vim patch 8.1.0244: no redraw when using a STOP signal on Vim and then CONT Problem: No redraw when using a STOP signal on Vim and then a CONT signal. Solution: Catch the CONT signal and force a redraw. (closes #3285) --- diff --git a/src/os_unix.c b/src/os_unix.c index 3649276c4..94c3dc9a2 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1227,7 +1227,23 @@ deathtrap SIGDEFARG(sigarg) SIGRETURN; } -#if defined(_REENTRANT) && defined(SIGCONT) + static void +after_sigcont(void) +{ +# ifdef FEAT_TITLE + // Set oldtitle to NULL, so the current title is obtained again. + VIM_CLEAR(oldtitle); +# endif + settmode(TMODE_RAW); + need_check_timestamps = TRUE; + did_check_timestamps = FALSE; +} + +#if defined(SIGCONT) +static RETSIGTYPE sigcont_handler SIGPROTOARG; +static int in_mch_suspend = FALSE; + +# if defined(_REENTRANT) && defined(SIGCONT) /* * On Solaris with multi-threading, suspending might not work immediately. * Catch the SIGCONT signal, which will be used as an indication whether the @@ -1239,7 +1255,7 @@ deathtrap SIGDEFARG(sigarg) * volatile because it is used in signal handler sigcont_handler(). */ static volatile int sigcont_received; -static RETSIGTYPE sigcont_handler SIGPROTOARG; +# endif /* * signal handler for SIGCONT @@ -1247,7 +1263,38 @@ static RETSIGTYPE sigcont_handler SIGPROTOARG; static RETSIGTYPE sigcont_handler SIGDEFARG(sigarg) { - sigcont_received = TRUE; + if (in_mch_suspend) + { +# if defined(_REENTRANT) && defined(SIGCONT) + sigcont_received = TRUE; +# endif + } + else + { + // We didn't suspend ourselves, assume we were stopped by a SIGSTOP + // signal (which can't be intercepted) and get a SIGCONT. Need to get + // back to a sane mode and redraw. + after_sigcont(); + + update_screen(CLEAR); + if (State & CMDLINE) + redrawcmdline(); + else if (State == HITRETURN || State == SETWSIZE || State == ASKMORE + || State == EXTERNCMD || State == CONFIRM || exmode_active) + repeat_message(); + else if (redrawing()) + setcursor(); +#if defined(FEAT_INS_EXPAND) + if (pum_visible()) + { + redraw_later(NOT_VALID); + ins_compl_show_pum(); + } +#endif + cursor_on_force(); + out_flush(); + } + SIGRETURN; } #endif @@ -1330,6 +1377,8 @@ mch_suspend(void) { /* BeOS does have SIGTSTP, but it doesn't work. */ #if defined(SIGTSTP) && !defined(__BEOS__) + in_mch_suspend = TRUE; + out_flush(); /* needed to make cursor visible on some systems */ settmode(TMODE_COOK); out_flush(); /* needed to disable mouse on some systems */ @@ -1361,16 +1410,9 @@ mch_suspend(void) mch_delay(wait_time, FALSE); } # endif + in_mch_suspend = FALSE; -# ifdef FEAT_TITLE - /* - * Set oldtitle to NULL, so the current title is obtained again. - */ - VIM_CLEAR(oldtitle); -# endif - settmode(TMODE_RAW); - need_check_timestamps = TRUE; - did_check_timestamps = FALSE; + after_sigcont(); #else suspend_shell(); #endif @@ -1410,7 +1452,7 @@ set_signals(void) #ifdef SIGTSTP signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); #endif -#if defined(_REENTRANT) && defined(SIGCONT) +#if defined(SIGCONT) signal(SIGCONT, sigcont_handler); #endif diff --git a/src/proto/term.pro b/src/proto/term.pro index 7eafdeffa..9a9606baf 100644 --- a/src/proto/term.pro +++ b/src/proto/term.pro @@ -50,6 +50,7 @@ void setmouse(void); int mouse_has(int c); int mouse_model_popup(void); void scroll_start(void); +void cursor_on_force(void); void cursor_on(void); void cursor_off(void); void term_cursor_mode(int forced); diff --git a/src/term.c b/src/term.c index 209a03f5c..ace467f6d 100644 --- a/src/term.c +++ b/src/term.c @@ -3788,6 +3788,16 @@ scroll_start(void) static int cursor_is_off = FALSE; +/* + * Enable the cursor without checking if it's already enabled. + */ + void +cursor_on_force(void) +{ + out_str(T_VE); + cursor_is_off = FALSE; +} + /* * Enable the cursor. */ @@ -3795,10 +3805,7 @@ static int cursor_is_off = FALSE; cursor_on(void) { if (cursor_is_off) - { - out_str(T_VE); - cursor_is_off = FALSE; - } + cursor_on_force(); } /* diff --git a/src/version.c b/src/version.c index 46125c029..08345408b 100644 --- a/src/version.c +++ b/src/version.c @@ -794,6 +794,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 244, /**/ 243, /**/