]> git.wh0rd.org Git - nano.git/commitdiff
handle pending sigwinches better, etc.
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 16 Feb 2004 20:32:40 +0000 (20:32 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 16 Feb 2004 20:32:40 +0000 (20:32 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1652 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/nano.c
src/proto.h
src/winio.c

index 50a9b35d6459b7756e2e3aac36eb8dc4015375f6..2a312549abfe9ecb036b729779dab86fc2454b65 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -15,6 +15,11 @@ CVS code -
        - Add more intuitive Meta-key aliases for moving to the
          beginning and ending lines of a paragraph at the search
          prompt: Meta-P and Meta-N. (DLR)
+       - Block SIGWINCH after setting up its handler, and only unblock
+         and handle it when we're in a stable state, i.e, when we're
+         waiting for input from the user.  New function
+         allow_pending_sigwinch(); changes to signal_init(),
+         get_kbinput(), and get_verbatim_kbinput(). (DLR)
 - files.c:
   add_open_files()
        - Make the saving of marked status in open_files->file_flags
@@ -50,6 +55,9 @@ CVS code -
          doesn't need to be called every time through the loop.  Call it
          instead of cbreak() on such systems, as it overrides cbreak()
          anyway. (DLR)
+       - Add more descriptive comments explaining the termios and
+         curses setup routines, and turn the keypad on before setting
+         the input mode. (DLR)
 - search.c:
   do_replace_loop()
        - Fix segfault when doing a regex replace of a string that
index 050c3f07b657908ddf721f4f85d87a54ae4ae584..3fee0db1187a3b7f7990fe3edd013224c97b2f1c 100644 (file)
@@ -2815,6 +2815,7 @@ void signal_init(void)
 #ifndef NANO_SMALL
     act.sa_handler = handle_sigwinch;
     sigaction(SIGWINCH, &act, NULL);
+    allow_pending_sigwinch(FALSE);
 #endif
 
 #ifdef _POSIX_VDISABLE
@@ -2988,6 +2989,17 @@ void handle_sigwinch(int s)
     /* Jump back to the main loop. */
     siglongjmp(jmpbuf, 1);
 }
+
+void allow_pending_sigwinch(int allow)
+{
+    sigset_t winch;
+    sigemptyset(&winch);
+    sigaddset(&winch, SIGWINCH);
+    if (allow)
+       sigprocmask(SIG_UNBLOCK, &winch, NULL);
+    else
+       sigprocmask(SIG_BLOCK, &winch, NULL);
+}
 #endif /* !NANO_SMALL */
 
 /* If the NumLock key has made the keypad go awry, print an error
@@ -3419,9 +3431,11 @@ int main(int argc, char *argv[])
            filename = mallocstrcpy(filename, argv[optind]);
     }
 
-    /* First back up the old settings so they can be restored, duh */
+    /* Termios initialization stuff: Back up the old settings so that
+     * they can be restored, disable SIGINT on ^C and SIGQUIT on ^\,
+     * since we need them for Cancel and Replace, and disable
+     * implementation-defined input processing. */
     tcgetattr(0, &oldterm);
-
 #ifdef _POSIX_VDISABLE
     term = oldterm;
     term.c_cc[VINTR] = _POSIX_VDISABLE;
@@ -3430,21 +3444,32 @@ int main(int argc, char *argv[])
     tcsetattr(0, TCSANOW, &term);
 #endif
 
-    /* now ncurses init stuff... */
+   /* Curses initialization stuff: Start curses, save the state of the
+    * the terminal mode, disable translation of carriage return (^M)
+    * into newline (^J) so we can catch the Enter key and use ^J for
+    * Justify, turn the keypad on for the windows that read input, put
+    * the terminal in cbreak mode (read one character at a time and
+    * interpret the special control keys) if we can selectively disable
+    * the special control keys or raw mode (read one character at a
+    * time and don't interpret the special control keys) if we
+    * can't, and turn off echoing of characters as they're typed. */
     initscr();
     savetty();
     nonl();
+    keypad(edit, TRUE);
+    keypad(bottomwin, TRUE);
 #ifdef _POSIX_VDISABLE
     cbreak();
 #else
-    /* We're going to have to do it the old way, i.e, on Cygwin. */
     raw();
 #endif
     noecho();
 
-    /* Set up some global variables */
+    /* Set up the global variables and the shortcuts. */
     global_init(0);
     shortcut_init(0);
+
+    /* Set up the signal handlers. */
     signal_init();
 
 #ifdef DEBUG
@@ -3456,10 +3481,6 @@ int main(int argc, char *argv[])
     mouse_init();
 #endif
 
-    /* Turn the keypad on */
-    keypad(edit, TRUE);
-    keypad(bottomwin, TRUE);
-
 #ifdef DEBUG
     fprintf(stderr, "Main: bottom win\n");
 #endif
index 7a5a49c7eb5d83d3687627b9153ec664c48b384c..b09ed621111d6d16566807689f212b13e6c09fa0 100644 (file)
@@ -331,6 +331,7 @@ RETSIGTYPE do_suspend(int signal);
 RETSIGTYPE do_cont(int signal);
 #ifndef NANO_SMALL
 void handle_sigwinch(int s);
+void allow_pending_sigwinch(int allow);
 #endif
 void print_numlock_warning(void);
 #ifndef NANO_SMALL
index fbae044e5c59c86910d2eba6baa5c94d9012254d..51c734a47f16e968f06368fefb73049f31eabb87 100644 (file)
@@ -45,9 +45,17 @@ int get_kbinput(WINDOW *win, int *meta)
 {
     int kbinput, retval;
 
+#ifndef NANO_SMALL
+    allow_pending_sigwinch(TRUE);
+#endif
+
     kbinput = get_ignored_kbinput(win);
     retval = get_accepted_kbinput(win, kbinput, meta);
 
+#ifndef NANO_SMALL
+    allow_pending_sigwinch(FALSE);
+#endif
+
     return retval;
 }
 
@@ -59,6 +67,10 @@ int *get_verbatim_kbinput(WINDOW *win, int *kbinput_len, int
 {
     int kbinput, *verbatim_kbinput;
 
+#ifndef NANO_SMALL
+    allow_pending_sigwinch(TRUE);
+#endif
+
     /* Turn the keypad off so that we don't get extended keypad values,
      * all of which are outside the ASCII range, and switch to raw mode
      * so that we can type ^C, ^Q, ^S, ^Z, and ^\ (and ^Y on the Hurd)
@@ -98,6 +110,11 @@ int *get_verbatim_kbinput(WINDOW *win, int *kbinput_len, int
 #ifdef DEBUG
     fprintf(stderr, "get_verbatim_kbinput(): verbatim_kbinput = %s\n", verbatim_kbinput);
 #endif
+
+#ifndef NANO_SMALL
+    allow_pending_sigwinch(FALSE);
+#endif
+
     return verbatim_kbinput;
 }