summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-08-07 17:38:41 +0200
committerBram Moolenaar <Bram@vim.org>2018-08-07 17:38:41 +0200
commit917e32bda5a93941fbbccab09ae3960114b67188 (patch)
treecb6ca0ec9d5f36da3a40d4efafd080d9830b7d47
parent5db7eec42337f0eecdc332f582eecf37278044e8 (diff)
patch 8.1.0244: no redraw when using a STOP signal on Vim and then CONTv8.1.0244
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)
-rw-r--r--src/os_unix.c68
-rw-r--r--src/proto/term.pro1
-rw-r--r--src/term.c15
-rw-r--r--src/version.c2
4 files changed, 69 insertions, 17 deletions
diff --git a/src/os_unix.c b/src/os_unix.c
index 3649276c49..94c3dc9a2e 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 7eafdeffa9..9a9606baf0 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 209a03f5c1..ace467f6df 100644
--- 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
index 46125c029d..08345408b4 100644
--- 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,