int os_string_width (const zchar *);
void os_init_setup (void);
void os_warn (const char *, ...);
+ void os_quit (void);
+
+/* Front ends call this if the terminal size changes. */
+void resize_screen(void);
+
+/* This is callable only from resize_screen. */
+bool os_repaint_window (int win, int ypos_old, int ypos_new, int xpos,
+ int ysize, int xsize);
/* On many terminals the backspace key returns DEL. */
if (c == erasechar()) return ZC_BACKSPACE;;
- if (c == killchar()) return ZC_ESCAPE;
-
switch(c) {
- /* Normally ERR means timeout. I suppose we might also get
- ERR if a signal hits getch. */
+ /* This should not happen because select said we have input. */
case ERR:
- if (timeout_to_ms() == 0)
- return ZC_TIME_OUT;
- else
- continue;
-
-/*
- * Under ncurses, getch() will return OK (defined to 0) when Ctrl-@ or
- * Ctrl-Space is pressed. 0 is also the ZSCII character code for
- * ZC_TIME_OUT. This causes a fatal error "Call to non-routine", after
- * which Frotz aborts. This doesn't happen with all games nor is the
- * crashing consistent. Sometimes repeated tests on a single game will
- * yield some crashes and some non-crashes. When linked with ncurses,
- * we must make sure that unix_read_char() does not return a bogus
- * ZC_TIME_OUT.
- *
- */
-#ifdef USE_NCURSES_H
+ /* Ignore NUL (ctrl+space or ctrl+@ on many terminals) because it
+ would be misinterpreted as timeout (ZC_TIME_OUT == 0). */
case 0:
- continue;
-#endif /* USE_NCURSES_H */
+ /* Ncurses appears to produce KEY_RESIZE even if we handle SIGWINCH
+ ourselves. */
+#ifdef KEY_RESIZE
+ case KEY_RESIZE:
+#endif
+ continue;
/* Screen decluttering. */
case MOD_CTRL ^ 'L': case MOD_CTRL ^ 'R':