Index: src/nano.h =================================================================== --- src/nano.h (revision 5213) +++ src/nano.h (working copy) @@ -117,7 +117,7 @@ #include #endif #ifndef NANO_TINY -#include +#include #endif #include @@ -571,6 +571,9 @@ #define CONTROL_RIGHT 554 #ifndef NANO_TINY +/* An imaginary key for when we get a SIGWINCH (window resize). */ +#define KEY_WINCH -2 + /* Extra bits for the undo function. */ #define UNdel_del (1<<0) #define UNdel_backspace (1<<1) Index: src/global.c =================================================================== --- src/global.c (revision 5213) +++ src/global.c (working copy) @@ -30,12 +30,8 @@ /* Global variables. */ #ifndef NANO_TINY -sigjmp_buf jump_buf; - /* Used to return to either main() or the unjustify routine in - * do_justify() after a SIGWINCH. */ -bool jump_buf_main = FALSE; - /* Have we set jump_buf so that we return to main() after a - * SIGWINCH? */ +volatile sig_atomic_t sigwinch_flag = 0; + /* Is toggled whenever the SIGWINCH handler has been executed. */ #endif bool meta_key; Index: src/proto.h =================================================================== --- src/proto.h (revision 5213) +++ src/proto.h (working copy) @@ -28,8 +28,7 @@ /* All external variables. See global.c for their descriptions. */ #ifndef NANO_TINY -extern sigjmp_buf jump_buf; -extern bool jump_buf_main; +extern volatile sig_atomic_t sigwinch_flag; #endif extern bool meta_key; @@ -478,6 +477,7 @@ RETSIGTYPE do_continue(int signal); #ifndef NANO_TINY RETSIGTYPE handle_sigwinch(int signal); +void regenerate_screen(void); void allow_pending_sigwinch(bool allow); void do_toggle(int flag); #endif Index: src/prompt.c =================================================================== --- src/prompt.c (revision 5213) +++ src/prompt.c (working copy) @@ -66,6 +66,11 @@ /* Read in a character. */ input = get_kbinput(bottomwin); +#ifndef NANO_TINY + if (input == KEY_WINCH) + return KEY_WINCH; +#endif + #ifndef DISABLE_MOUSE /* If we got a mouse click and it was on a shortcut, read in the * shortcut character. */ @@ -794,6 +799,14 @@ kbinput = do_statusbar_input(&ran_func, &finished, refresh_func); assert(statusbar_x <= strlen(answer)); +#ifndef NANO_TINY + if (kbinput == KEY_WINCH) { + refresh_func(); + update_statusbar_line(answer, statusbar_x); + continue; + } +#endif + func = func_from_key(&kbinput); if (func == do_cancel || func == do_enter_void) @@ -1055,6 +1068,13 @@ nostr = _("Nn"); allstr = _("Aa"); + do { + int kbinput; + functionptrtype func; +#ifndef DISABLE_MOUSE + int mouse_x, mouse_y; +#endif + if (!ISSET(NO_HELP)) { char shortstr[3]; /* Temp string for Yes, No, All. */ @@ -1098,15 +1118,14 @@ wnoutrefresh(edit); wnoutrefresh(bottomwin); - do { - int kbinput; - functionptrtype func; -#ifndef DISABLE_MOUSE - int mouse_x, mouse_y; -#endif - currmenu = MYESNO; kbinput = get_kbinput(bottomwin); + +#ifndef NANO_TINY + if (kbinput == KEY_WINCH) + continue; +#endif + func = func_from_key(&kbinput); if (func == do_cancel) Index: src/browser.c =================================================================== --- src/browser.c (revision 5213) +++ src/browser.c (working copy) @@ -41,6 +41,8 @@ /* The number of columns in the longest filename in the list. */ static size_t selected = 0; /* The currently selected filename in the list; zero-based. */ +static char *path_save = NULL; + /* The current path backup */ /* Our main file browser function. path is the tilde-expanded path we * start browsing from. */ @@ -75,6 +77,9 @@ path = mallocstrassn(path, get_full_path(path)); + /* Save the current path in order to be used later */ + path_save = path; + assert(path != NULL && path[strlen(path) - 1] == '/'); /* Get the file list, and set longest and width in the process. */ @@ -111,13 +116,24 @@ /* Display the file list if we don't have a key, or if the * selected file has changed, and set width in the process. */ - if (kbinput == ERR || old_selected != selected) + if (kbinput == ERR || +#ifndef NANO_TINY + kbinput == KEY_WINCH || +#endif + old_selected != selected) browser_refresh(); old_selected = selected; kbinput = get_kbinput(edit); +#ifndef NANO_TINY + if (kbinput == KEY_WINCH) { + curs_set(0); + continue; + } +#endif + #ifndef DISABLE_MOUSE if (kbinput == KEY_MOUSE) { int mouse_x, mouse_y; @@ -156,6 +172,8 @@ } else if (func == do_help_void) { #ifndef DISABLE_HELP do_help_void(); + /* Perhaps window dimensions have changed */ + browser_refresh(); curs_set(0); #else nano_disabled_msg(); @@ -552,6 +570,11 @@ char *foo; /* The file information that we'll display. */ + /* Perhaps window dimensions have changed. Initialize the browser again. */ + browser_init(path_save, opendir(path_save)); + qsort(filelist, filelist_len, sizeof(char *), diralphasort); + titlebar(path_save); + if (uimax_digits == -1) uimax_digits = digits(UINT_MAX); Index: src/text.c =================================================================== --- src/text.c (revision 5213) +++ src/text.c (working copy) @@ -2207,17 +2207,6 @@ edit_refresh(); -#ifndef NANO_TINY - /* We're going to set jump_buf so that we return here after a - * SIGWINCH instead of to main(). Indicate this. */ - jump_buf_main = FALSE; - - /* Return here after a SIGWINCH. */ - sigsetjmp(jump_buf, 1); -#endif - - statusbar(_("Can now UnJustify!")); - /* If constant cursor position display is on, make sure the current * cursor position will be properly displayed on the statusbar. */ if (ISSET(CONST_UPDATE)) @@ -2229,7 +2218,15 @@ /* Now get a keystroke and see if it's unjustify. If not, put back * the keystroke and return. */ - kbinput = do_input(FALSE); +#ifndef NANO_TINY + do { +#endif + statusbar(_("Can now UnJustify!")); + kbinput = do_input(FALSE); +#ifndef NANO_TINY + } while (kbinput == KEY_WINCH); +#endif + func = func_from_key(&kbinput); if (func == do_uncut_text) { @@ -3184,6 +3181,12 @@ } kbinput = get_kbinput(bottomwin); + +#ifndef NANO_TINY + if (kbinput == KEY_WINCH) + continue; +#endif + func = func_from_key(&kbinput); tmplint = curlint; Index: src/winio.c =================================================================== --- src/winio.c (revision 5213) +++ src/winio.c (working copy) @@ -107,15 +107,15 @@ { int input; size_t errcount; +#ifndef NANO_TINY + sig_atomic_t sigwinch_flag_save; + sigset_t sigset; +#endif /* If the keystroke buffer isn't empty, get out. */ if (key_buffer != NULL) return; -#ifndef NANO_TINY - allow_pending_sigwinch(TRUE); -#endif - /* Just before reading in the first character, display any pending * screen updates. */ doupdate(); @@ -125,8 +125,29 @@ if (nodelay_mode) { if ((input = wgetch(win)) == ERR) return; - } else + } else { +#ifndef NANO_TINY + sigpending(&sigset); + if (sigismember(&sigset, SIGWINCH)) { + /* Let pending SIGWINCH be delivered. */ + allow_pending_sigwinch(TRUE); + allow_pending_sigwinch(FALSE); + regenerate_screen(); + input = KEY_WINCH; + } else { + sigwinch_flag_save = sigwinch_flag; + allow_pending_sigwinch(TRUE); +#endif while ((input = wgetch(win)) == ERR) { +#ifndef NANO_TINY + allow_pending_sigwinch(FALSE); + /* Did we get SIGWINCH while we were in blocking mode? */ + if (sigwinch_flag != sigwinch_flag_save) { + regenerate_screen(); + input = KEY_WINCH; + break; + } else +#endif errcount++; /* If we've failed to get a character MAX_BUF_SIZE times in a @@ -137,10 +158,10 @@ if (errcount == MAX_BUF_SIZE) handle_hupterm(0); } - #ifndef NANO_TINY - allow_pending_sigwinch(FALSE); + } #endif + } /* Increment the length of the keystroke buffer, and save the value * of the keystroke at the end of it. */ @@ -148,14 +169,17 @@ key_buffer = (int *)nmalloc(sizeof(int)); key_buffer[0] = input; +#ifndef NANO_TINY + /* If we got SIGWINCH, get out immediately since the win argument is + * no longer valid. */ + if (input == KEY_WINCH) + return; +#endif + /* Read in the remaining characters using non-blocking input. */ nodelay(win, TRUE); while (TRUE) { -#ifndef NANO_TINY - allow_pending_sigwinch(TRUE); -#endif - input = wgetch(win); /* If there aren't any more characters, stop reading. */ @@ -168,10 +192,6 @@ key_buffer = (int *)nrealloc(key_buffer, key_buffer_len * sizeof(int)); key_buffer[key_buffer_len - 1] = input; - -#ifndef NANO_TINY - allow_pending_sigwinch(FALSE); -#endif } /* Switch back to waiting mode for input. */ @@ -191,11 +211,6 @@ /* Add the keystrokes in input to the keystroke buffer. */ void unget_input(int *input, size_t input_len) { -#ifndef NANO_TINY - allow_pending_sigwinch(TRUE); - allow_pending_sigwinch(FALSE); -#endif - /* If input is empty, get out. */ if (input_len == 0) return; @@ -249,11 +264,6 @@ { int *input; -#ifndef NANO_TINY - allow_pending_sigwinch(TRUE); - allow_pending_sigwinch(FALSE); -#endif - if (key_buffer_len == 0) { if (win != NULL) { get_key_buffer(win); @@ -643,6 +653,12 @@ retval = sc_seq_or(do_next_word_void, 0); #endif break; + +#ifndef NANO_TINY + case KEY_WINCH: + retval = KEY_WINCH; + break; +#endif } /* If our result is an extended keypad value (i.e. a value Index: src/help.c =================================================================== --- src/help.c (revision 5213) +++ src/help.c (working copy) @@ -88,7 +88,12 @@ /* Display the help text if we don't have a key, or if the help * text has moved. */ - if (kbinput == ERR || line != old_line) { + if (kbinput == ERR || +#ifndef NANO_TINY + kbinput == KEY_WINCH || +#endif + line != old_line) { + blank_edit(); ptr = help_text; @@ -117,6 +122,24 @@ kbinput = get_kbinput(edit); +#ifndef NANO_TINY + if (kbinput == KEY_WINCH) { + ptr = help_text; + /* The window dimensions have changed; recalculate last_line. */ + last_line = 0; + for (; *ptr != '\0'; last_line++) { + ptr += help_line_len(ptr); + if (*ptr == '\n') + ptr++; + } + if (last_line > 0) + last_line--; + + curs_set(0); + continue; + } +#endif + #ifndef DISABLE_MOUSE if (kbinput == KEY_MOUSE) { int mouse_x, mouse_y; Index: src/nano.c =================================================================== --- src/nano.c (revision 5213) +++ src/nano.c (working copy) @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -1353,6 +1352,12 @@ /* Handler for SIGWINCH (window size change). */ RETSIGTYPE handle_sigwinch(int signal) { + /* Let the others know the handler has been executed. */ + sigwinch_flag = sigwinch_flag ? 0 : 1; +} + +void regenerate_screen(void) +{ const char *tty = ttyname(0); int fd, result = 0; struct winsize win; @@ -1406,14 +1411,7 @@ window_init(); /* Redraw the contents of the windows that need it. */ - blank_statusbar(); - wnoutrefresh(bottomwin); - currmenu = MMAIN; total_refresh(); - - /* Jump back to either main() or the unjustify routine in - * do_justify(). */ - siglongjmp(jump_buf, 1); } /* If allow is TRUE, block any SIGWINCH signals that we get, so that we @@ -1608,6 +1606,11 @@ /* Read in a character. */ input = get_kbinput(edit); +#ifndef NANO_TINY + if (input == KEY_WINCH) + return KEY_WINCH; +#endif + #ifndef DISABLE_MOUSE if (func_key && input == KEY_MOUSE) { /* We received a mouse click. */ @@ -2807,17 +2810,6 @@ reset_cursor(); wnoutrefresh(edit); -#ifndef NANO_TINY - if (!jump_buf_main) { - /* If we haven't already, we're going to set jump_buf so - * that we return here after a SIGWINCH. Indicate this. */ - jump_buf_main = TRUE; - - /* Return here after a SIGWINCH. */ - sigsetjmp(jump_buf, 1); - } -#endif - /* Just in case we were at the statusbar prompt, make sure the * statusbar cursor position is reset. */ do_prompt_abort();