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; 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,13 @@ kbinput = do_statusbar_input(&ran_func, &finished, refresh_func); assert(statusbar_x <= strlen(answer)); +#ifndef NANO_TINY + if (kbinput == KEY_WINCH) { + update_statusbar_line(answer, statusbar_x); + continue; + } +#endif + func = func_from_key(&kbinput); if (func == do_cancel || func == do_enter_void) @@ -1055,6 +1067,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 +1117,14 @@ wnoutrefresh(edit); wnoutrefresh(bottomwin); - do { - int kbinput; - functionptrtype func; -#ifndef DISABLE_MOUSE - int mouse_x, mouse_y; + currmenu = MYESNO; + kbinput = get_kbinput(bottomwin); + +#ifndef NANO_TINY + if (kbinput == KEY_WINCH) + continue; #endif - currmenu = MYESNO; - kbinput = get_kbinput(bottomwin); func = func_from_key(&kbinput); if (func == do_cancel) Index: src/browser.c =================================================================== --- src/browser.c (revision 5213) +++ src/browser.c (working copy) @@ -111,13 +111,34 @@ /* 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) { + /* Reset the necessary global variables. */ + filelist = NULL; + filelist_len = 0; + width = 0; + longest = 0; + /* We have closed dir stream, so we have to reopen it. */ + dir = opendir(path); + browser_init(path, dir); + qsort(filelist, filelist_len, sizeof(char *), diralphasort); + titlebar(path); + curs_set(0); + continue; + } +#endif + #ifndef DISABLE_MOUSE if (kbinput == KEY_MOUSE) { int mouse_x, mouse_y; 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,6 +107,9 @@ { int input; size_t errcount; +#ifndef NANO_TINY + sig_atomic_t sigwinch_flag_save = sigwinch_flag; +#endif /* If the keystroke buffer isn't empty, get out. */ if (key_buffer != NULL) @@ -127,6 +130,13 @@ return; } else while ((input = wgetch(win)) == ERR) { +#ifndef NANO_TINY + /* Did we get SIGWINCH while we were in blocking mode? */ + if (sigwinch_flag != sigwinch_flag_save) { + input = KEY_WINCH; + break; + } else +#endif errcount++; /* If we've failed to get a character MAX_BUF_SIZE times in a @@ -148,6 +158,13 @@ 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 (sigwinch_flag != sigwinch_flag_save) + return; +#endif + /* Read in the remaining characters using non-blocking input. */ nodelay(win, TRUE); @@ -643,6 +660,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 @@ -1406,14 +1405,10 @@ 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); + /* Let the others know the handler has been executed. */ + sigwinch_flag = sigwinch_flag ? 0 : 1; } /* If allow is TRUE, block any SIGWINCH signals that we get, so that we @@ -1608,6 +1603,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 +2807,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();