diff --git a/src/intf.c b/src/intf.c index 45ad32a..38d8248 100644 --- a/src/intf.c +++ b/src/intf.c @@ -119,6 +119,19 @@ static void init_title (void); static void sigterm_handler (int sig); +/* + Function: txresize - Handle a terminal resize event + Parameters: (none) + Returns: (nothing) + + This function handles a SIGWINCH (terminal window size changed) event + by refreshing Curses windows as appropriate. +*/ +#ifdef HANDLE_RESIZE_EVENTS +static void txresize (void); +#endif + + /* Function: txinput_fixup - Copy strings with fixup Parameters: dest - Destination buffer of size BUFSIZE @@ -464,6 +477,26 @@ int txrefresh (void) } +/***********************************************************************/ +// txresize: Handle a terminal resize event + +#ifdef HANDLE_RESIZE_EVENTS + +void txresize (void) +{ + /* The current implementation cannot resize windows per se: a given + window would have to be destroyed and recreated in the new + location, then redrawn, most likely via a call-back function. + We just redraw the game title, refresh all windows and hope for + the best! */ + + init_title(); + txrefresh(); +} + +#endif // HANDLE_RESIZE_EVENTS + + /***********************************************************************/ // attrpr: Print a string with a particular character rendition @@ -654,11 +687,34 @@ int center3 (WINDOW *win, int y, chtype attr1, chtype attr3, chtype attr2, int gettxchar (WINDOW *win) { + int key; + bool done; + + keypad(win, true); meta(win, true); wtimeout(win, -1); - return wgetch(win); + done = false; + while (! done) { + key = wgetch(win); + switch (key) { + case ERR: + beep(); + break; + +#ifdef HANDLE_RESIZE_EVENTS + case KEY_RESIZE: + txresize(); + break; +#endif // HANDLE_RESIZE_EVENTS + + default: + done = true; + } + } + + return key; } @@ -1265,11 +1321,11 @@ int gettxline (WINDOW *win, char *buf, int bufsize, bool *restrict modified, // Miscellaneous keys and events +#ifdef HANDLE_RESIZE_EVENTS case KEY_RESIZE: - case KEY_EVENT: - ret = key; - done = true; + txresize(); break; +#endif // HANDLE_RESIZE_EVENTS default: beep(); @@ -1279,11 +1335,11 @@ int gettxline (WINDOW *win, char *buf, int bufsize, bool *restrict modified, wtimeout(win, -1); break; +#ifdef HANDLE_RESIZE_EVENTS case KEY_RESIZE: - case KEY_EVENT: - ret = key; - done = true; + txresize(); break; +#endif // HANDLE_RESIZE_EVENTS default: beep(); @@ -1553,11 +1609,24 @@ bool answer_yesno (WINDOW *win, chtype attr_keys) done = false; while (! done) { - key = toupper(wgetch(win)); + key = wgetch(win); - if (key == 'Y' || key == 'N') { + switch (key) { + case 'Y': + case 'y': + case 'N': + case 'n': + key = toupper(key); done = true; - } else { + break; + +#ifdef HANDLE_RESIZE_EVENTS + case KEY_RESIZE: + txresize(); + break; +#endif // HANDLE_RESIZE_EVENTS + + default: beep(); } } @@ -1584,6 +1653,10 @@ bool answer_yesno (WINDOW *win, chtype attr_keys) void wait_for_key (WINDOW *win, int y, chtype attr) { + int key; + bool done; + + keypad(win, true); meta(win, true); wtimeout(win, -1); @@ -1591,7 +1664,24 @@ void wait_for_key (WINDOW *win, int y, chtype attr) center(win, y, attr, "[ Press to continue ] "); wrefresh(win); - (void) wgetch(win); + done = false; + while (! done) { + key = wgetch(win); + switch (key) { + case ERR: + beep(); + break; + +#ifdef HANDLE_RESIZE_EVENTS + case KEY_RESIZE: + txresize(); + break; +#endif // HANDLE_RESIZE_EVENTS + + default: + done = true; + } + } } diff --git a/src/intf.h b/src/intf.h index 6301c2a..e60957e 100644 --- a/src/intf.h +++ b/src/intf.h @@ -43,20 +43,27 @@ /* This version of Star Traders only utilises WIN_COLS x WIN_LINES of a terminal screen; this terminal must be at least MIN_COLS x MIN_LINES in - size; the newtxwin() function automatically places a new window in the - centre-top of the terminal screen. The program does not yet handle - terminal resizing events. + size. The newtxwin() function automatically places a new window in the + centre-top of the terminal screen. */ #define MIN_LINES 24 // Minimum number of lines in terminal #define MIN_COLS 80 // Minimum number of columns in terminal -#define WIN_LINES MIN_LINES // Number of lines in main window -#define WIN_COLS MIN_COLS // Number of columns in main window +#define WIN_LINES MIN_LINES // Number of lines used in main window +#define WIN_COLS MIN_COLS // Number of columns used in main window #define WCENTER -1 // Centre the new window +// Check if resizing events are supported +#ifdef KEY_RESIZE +# define HANDLE_RESIZE_EVENTS 1 +#else +# undef HANDLE_RESIZE_EVENTS +#endif + + // Visibility of the cursor in Curses (for curs_set()) typedef enum curs_type { CURS_INVISIBLE = 0, @@ -77,8 +84,6 @@ typedef enum curs_type { #define KEY_CTRL(x) ((x) - 0100) // ASCII control character -#define KEY_ILLEGAL 077777 // No key should ever return this! - // Keycodes for inserting the default value in input routines #define KEY_DEFAULTVAL1 '=' #define KEY_DEFAULTVAL2 ';' @@ -91,17 +96,6 @@ typedef enum curs_type { # define KEY_CRIGHT 01052 // CTRL + Right Arrow #endif -// Keycodes only defined by NCurses -#ifndef KEY_RESIZE -# define KEY_RESIZE KEY_ILLEGAL -#endif -#ifndef KEY_EVENT -# define KEY_EVENT KEY_ILLEGAL -#endif -#ifndef KEY_MOUSE -# define KEY_MOUSE KEY_ILLEGAL -#endif - // Timeout value (in ms) for Meta-X-style keyboard input #ifdef NCURSES_VERSION # define META_TIMEOUT ESCDELAY