vi: fix ^Z not always working as intended
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 1 Apr 2019 10:29:27 +0000 (12:29 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 1 Apr 2019 10:29:27 +0000 (12:29 +0200)
function                                             old     new   delta
tstp_handler                                          64      71      +7
text_yank                                             54      56      +2
vi_main                                              280     272      -8
do_cmd                                              4705    4696      -9
colon                                               2861    2852      -9
cont_handler                                          66       -     -66
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 2/3 up/down: 9/-92)             Total: -83 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/vi.c

index a11e06040de5220bd7c0bc4e9a03871ddf5d6125..9bdee5928ef2fb128011aedb0bb7c939022e7e67 100644 (file)
@@ -330,9 +330,6 @@ struct globals {
        int lmc_len;             // length of last_modifying_cmd
        char *ioq, *ioq_start;   // pointer to string for get_one_char to "read"
 #endif
-#if ENABLE_FEATURE_VI_USE_SIGNALS || ENABLE_FEATURE_VI_CRASHME
-       int my_pid;
-#endif
 #if ENABLE_FEATURE_VI_SEARCH
        char *last_search_pattern; // last pattern from a '/' or '?' search
 #endif
@@ -449,7 +446,6 @@ struct globals {
 #define lmc_len                 (G.lmc_len            )
 #define ioq                     (G.ioq                )
 #define ioq_start               (G.ioq_start          )
-#define my_pid                  (G.my_pid             )
 #define last_search_pattern     (G.last_search_pattern)
 
 #define edit_file__cur_line     (G.edit_file__cur_line)
@@ -634,11 +630,8 @@ int vi_main(int argc, char **argv)
 #endif
 #endif
 
-#if ENABLE_FEATURE_VI_USE_SIGNALS || ENABLE_FEATURE_VI_CRASHME
-       my_pid = getpid();
-#endif
 #if ENABLE_FEATURE_VI_CRASHME
-       srand((long) my_pid);
+       srand((long) getpid());
 #endif
 #ifdef NO_SUCH_APPLET_YET
        // if we aren't "vi", we are "view"
@@ -2770,31 +2763,30 @@ static void winch_handler(int sig UNUSED_PARAM)
        redraw(TRUE);           // re-draw the screen
        errno = save_errno;
 }
-static void cont_handler(int sig UNUSED_PARAM)
-{
-       int save_errno = errno;
-       rawmode(); // terminal to "raw"
-       last_status_cksum = 0; // force status update
-       redraw(TRUE); // re-draw the screen
-
-       signal(SIGTSTP, tstp_handler);
-       signal(SIGCONT, SIG_DFL);
-       //kill(my_pid, SIGCONT); // huh? why? we are already "continued"...
-       errno = save_errno;
-}
 static void tstp_handler(int sig UNUSED_PARAM)
 {
        int save_errno = errno;
+
+       // ioctl inside cookmode() was seen to generate SIGTTOU,
+       // stopping us too early. Prevent that:
+       signal(SIGTTOU, SIG_IGN);
+
        go_bottom_and_clear_to_eol();
        cookmode(); // terminal to "cooked"
 
-       signal(SIGCONT, cont_handler);
-       signal(SIGTSTP, SIG_DFL);
-       kill(my_pid, SIGTSTP);
+       // stop now
+       //signal(SIGTSTP, SIG_DFL);
+       //raise(SIGTSTP);
+       raise(SIGSTOP); // avoid "dance" with TSTP handler - use SIGSTOP instead
+       //signal(SIGTSTP, tstp_handler);
+
+       // we have been "continued" with SIGCONT, restore screen and termios
+       rawmode(); // terminal to "raw"
+       last_status_cksum = 0; // force status update
+       redraw(TRUE); // re-draw the screen
+
        errno = save_errno;
 }
-
-//----- Come here when we get a signal ---------------------------
 static void int_handler(int sig)
 {
        signal(SIGINT, int_handler);