From 369732ff8176832ce7753e1a444ed40a5c4c4554 Mon Sep 17 00:00:00 2001 From: David Lawrence Ramsey Date: Mon, 16 Feb 2004 20:32:40 +0000 Subject: [PATCH] handle pending sigwinches better, etc. git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1652 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- ChangeLog | 8 ++++++++ src/nano.c | 39 ++++++++++++++++++++++++++++++--------- src/proto.h | 1 + src/winio.c | 17 +++++++++++++++++ 4 files changed, 56 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 50a9b35d..2a312549 100644 --- 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 diff --git a/src/nano.c b/src/nano.c index 050c3f07..3fee0db1 100644 --- a/src/nano.c +++ b/src/nano.c @@ -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 diff --git a/src/proto.h b/src/proto.h index 7a5a49c7..b09ed621 100644 --- a/src/proto.h +++ b/src/proto.h @@ -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 diff --git a/src/winio.c b/src/winio.c index fbae044e..51c734a4 100644 --- a/src/winio.c +++ b/src/winio.c @@ -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; } -- 2.39.5