From d5546d338474ffff73517800d035d461a693700f Mon Sep 17 00:00:00 2001 From: PatR Date: Fri, 17 May 2024 14:38:17 -0700 Subject: [PATCH] revise curses_raw_print() For curses, behave like tty by keeping a count of messages issued via raw_print, then if that is non-zero issue a prompt and require the player to acknowledge them before it erases the screen. Mainly so that complaints during RC file processing will be seen. For tty, force getret() to be an unconditional routine instead of sometimes a routine, sometimes a macro which calls another routine. --- doc/fixes3-7-0.txt | 3 +++ include/flag.h | 3 ++- src/windows.c | 2 ++ win/curses/cursmain.c | 30 ++++++++++++++++++++++++++---- win/tty/wintty.c | 23 +++++++++++------------ 5 files changed, 44 insertions(+), 17 deletions(-) diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 59b13f574..9a06242b5 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -2097,6 +2097,9 @@ curses: change petattr attributes, dropping support for curses-only ones curses: swap the grey and no-color color initialization curses: allow changing default colors with the 'palette' config option (only if compiled with CHANGE_COLOR) +curses: if messages have been issued during start-up (for instance, warnings + about issues in run-time config file), prompt user to press + so that they can be read before curses erases the screen macOS: Xcode project was failing to build if the path to the NetHack source tree contained a space; the issue was within some shell script code contained within the project diff --git a/include/flag.h b/include/flag.h index 616580265..abcadc11f 100644 --- a/include/flag.h +++ b/include/flag.h @@ -1,4 +1,4 @@ -/* NetHack 3.7 flag.h $NHDT-Date: 1707122958 2024/02/05 08:49:18 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.236 $ */ +/* NetHack 3.7 flag.h $NHDT-Date: 1715979826 2024/05/17 21:03:46 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.246 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2006. */ /* NetHack may be freely redistributed. See license for details. */ @@ -257,6 +257,7 @@ struct instance_flags { int override_ID; /* true to force full identification of objects */ int parse_config_file_src; /* hack for parse_config_line() */ int purge_monsters; /* # of dead monsters still on fmon list */ + int raw_printed; /* count of messages issued before window_inited */ int suppress_price; /* controls doname() for unpaid objects */ unsigned terrainmode; /* for getpos()'s autodescribe during #terrain */ #define TER_MAP 0x01U diff --git a/src/windows.c b/src/windows.c index 3bb8004b9..e7f1351f7 100644 --- a/src/windows.c +++ b/src/windows.c @@ -206,6 +206,8 @@ void def_raw_print(const char *s) { puts(s); + if (*s) + iflags.raw_printed++; } staticfn diff --git a/win/curses/cursmain.c b/win/curses/cursmain.c index b6af48ca5..fd24fda9e 100644 --- a/win/curses/cursmain.c +++ b/win/curses/cursmain.c @@ -207,6 +207,12 @@ curses_init_nhwindows( #endif #endif + /* if anything has already been output by nethack (for instance, warnings + about RC file issues), let the player acknowlege it before initscr() + erases the screen */ + if (iflags.raw_printed) + curses_wait_synch(); + #ifdef XCURSES base_term = Xinitscr(*argcp, argv); #else @@ -853,6 +859,23 @@ wait_synch() -- Wait until all pending output is complete (*flush*() for void curses_wait_synch(void) { + if (iflags.raw_printed) { + int chr; + /* + * If any message has been issued via raw_print(), make the user + * acknowledge it. This might take place before initscr() so + * access to curses is limited. [Despite that, there's probably + * a more curses-specific way to handle this. FIXME?] + */ + + (void) fprintf(stdout, "\nPress to continue: "); + (void) fflush(stdout); + do { + chr = fgetc(stdin); + } while (chr > 0 && chr != C('j') && chr != C('m') && chr != '\033'); + iflags.raw_printed = 0; + } + if (iflags.window_inited) { if (curses_got_output()) (void) curses_more(); @@ -1001,12 +1024,11 @@ curses_raw_print(const char *str) if (iflags.window_inited) { curses_message_win_puts(str, FALSE); - } else { - puts(str); + return; } -#else - puts(str); #endif + puts(str); + iflags.raw_printed++; } /* diff --git a/win/tty/wintty.c b/win/tty/wintty.c index f738fc46d..04b973fcd 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 wintty.c $NHDT-Date: 1708290310 2024/02/18 21:05:10 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.386 $ */ +/* NetHack 3.7 wintty.c $NHDT-Date: 1715979847 2024/05/17 21:04:07 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.406 $ */ /* Copyright (c) David Cohrs, 1991 */ /* NetHack may be freely redistributed. See license for details. */ @@ -208,15 +208,10 @@ boolean GFlag = FALSE; boolean HE_resets_AS; /* see termcap.c */ #endif -#if defined(MICRO) || defined(WIN32CON) -static const char to_continue[] = "to continue"; -#define getret() getreturn(to_continue) -#else -static void getret(void); -#endif static void bail(const char *); /* __attribute__((noreturn)) */ static void newclipping(coordxy, coordxy); static void new_status_window(void); +static void getret(void); static void erase_menu_or_text(winid, struct WinDesc *, boolean); static void free_window_info(struct WinDesc *, boolean); static boolean toggle_menu_curr(winid, tty_menu_item *, int, boolean, @@ -770,10 +765,12 @@ tty_get_nh_event(void) return; } -#if !defined(MICRO) && !defined(WIN32CON) static void getret(void) { +#if defined(MICRO) || defined(WIN32CON) + getreturn("to continue"); +#else HUPSKIP(); xputs("\n"); if (flags.standout) @@ -784,8 +781,9 @@ getret(void) if (flags.standout) standoutend(); xwaitforspace(" "); -} #endif + iflags.raw_printed = 0; +} void tty_suspend_nhwindows(const char *str) @@ -3965,6 +3963,8 @@ tty_raw_print(const char *str) HUPSKIP(); if (ttyDisplay) ttyDisplay->rawprint++; + else if (*str) + iflags.raw_printed++; print_vt_code2(AVTC_SELECT_WINDOW, NHW_BASE); #if defined(MICRO) || defined(WIN32CON) msmsg("%s\n", str); @@ -3980,6 +3980,8 @@ tty_raw_print_bold(const char *str) HUPSKIP(); if (ttyDisplay) ttyDisplay->rawprint++; + else if (*str) + iflags.raw_printed++; print_vt_code2(AVTC_SELECT_WINDOW, NHW_BASE); term_start_raw_bold(); #if defined(MICRO) || defined(WIN32CON) @@ -5257,9 +5259,6 @@ play_usersound_via_idx(int idx, int volume) #endif #undef RESIZABLE -#ifdef getret -#undef getret -#endif #undef HUPSKIP #undef HUPSKIP_RESULT #undef ttypanic