1
0
forked from aniani/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)
This commit is contained in:
Bram Moolenaar
2018-08-07 17:38:41 +02:00
parent 5db7eec423
commit 917e32bda5
4 changed files with 69 additions and 17 deletions

View File

@@ -1227,7 +1227,23 @@ deathtrap SIGDEFARG(sigarg)
SIGRETURN; 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. * On Solaris with multi-threading, suspending might not work immediately.
* Catch the SIGCONT signal, which will be used as an indication whether the * 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(). * volatile because it is used in signal handler sigcont_handler().
*/ */
static volatile int sigcont_received; static volatile int sigcont_received;
static RETSIGTYPE sigcont_handler SIGPROTOARG; # endif
/* /*
* signal handler for SIGCONT * signal handler for SIGCONT
@@ -1247,7 +1263,38 @@ static RETSIGTYPE sigcont_handler SIGPROTOARG;
static RETSIGTYPE static RETSIGTYPE
sigcont_handler SIGDEFARG(sigarg) 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; SIGRETURN;
} }
#endif #endif
@@ -1330,6 +1377,8 @@ mch_suspend(void)
{ {
/* BeOS does have SIGTSTP, but it doesn't work. */ /* BeOS does have SIGTSTP, but it doesn't work. */
#if defined(SIGTSTP) && !defined(__BEOS__) #if defined(SIGTSTP) && !defined(__BEOS__)
in_mch_suspend = TRUE;
out_flush(); /* needed to make cursor visible on some systems */ out_flush(); /* needed to make cursor visible on some systems */
settmode(TMODE_COOK); settmode(TMODE_COOK);
out_flush(); /* needed to disable mouse on some systems */ out_flush(); /* needed to disable mouse on some systems */
@@ -1361,16 +1410,9 @@ mch_suspend(void)
mch_delay(wait_time, FALSE); mch_delay(wait_time, FALSE);
} }
# endif # endif
in_mch_suspend = FALSE;
# ifdef FEAT_TITLE after_sigcont();
/*
* 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;
#else #else
suspend_shell(); suspend_shell();
#endif #endif
@@ -1410,7 +1452,7 @@ set_signals(void)
#ifdef SIGTSTP #ifdef SIGTSTP
signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL);
#endif #endif
#if defined(_REENTRANT) && defined(SIGCONT) #if defined(SIGCONT)
signal(SIGCONT, sigcont_handler); signal(SIGCONT, sigcont_handler);
#endif #endif

View File

@@ -50,6 +50,7 @@ void setmouse(void);
int mouse_has(int c); int mouse_has(int c);
int mouse_model_popup(void); int mouse_model_popup(void);
void scroll_start(void); void scroll_start(void);
void cursor_on_force(void);
void cursor_on(void); void cursor_on(void);
void cursor_off(void); void cursor_off(void);
void term_cursor_mode(int forced); void term_cursor_mode(int forced);

View File

@@ -3788,6 +3788,16 @@ scroll_start(void)
static int cursor_is_off = FALSE; 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. * Enable the cursor.
*/ */
@@ -3795,10 +3805,7 @@ static int cursor_is_off = FALSE;
cursor_on(void) cursor_on(void)
{ {
if (cursor_is_off) if (cursor_is_off)
{ cursor_on_force();
out_str(T_VE);
cursor_is_off = FALSE;
}
} }
/* /*

View File

@@ -794,6 +794,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
244,
/**/ /**/
243, 243,
/**/ /**/