# HG changeset patch # User Christian Brabandt # Date 1533656705 -7200 # Node ID 65b2226178527dd0961969de13728fb903437084 # Parent abfda8a2268eeb02106d45ae2cb6e446b5bf9c50 patch 8.1.0244: no redraw when using a STOP signal on Vim and then CONT commit https://github.com/vim/vim/commit/917e32bda5a93941fbbccab09ae3960114b67188 Author: Bram Moolenaar Date: Tue Aug 7 17:38:41 2018 +0200 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 https://github.com/vim/vim/issues/3285) diff --git a/src/os_unix.c b/src/os_unix.c --- 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 SIGPRO 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 - -# 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; + in_mch_suspend = 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 --- 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 --- a/src/term.c +++ b/src/term.c @@ -3789,16 +3789,23 @@ 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. */ void 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 --- a/src/version.c +++ b/src/version.c @@ -795,6 +795,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 244, +/**/ 243, /**/ 242,