This fixes the broken code that was using a boolean as an integer.
I didn't try to track down when it changed or what it looked like
before the change. The intended effect is fairly straightforward;
just padding a bold line with spaces. I've no idea why someone
deciced that that was useful though.
It also fixes something I broke six years ago: tty_exit_nhwindows()
releases the termcap data needed for turning bold on and off, so
raw_print_bold() used by topten() stopped working on tty then.
Not fixed: the code in really_done() for dealing with topten() vs
the 'toptenwin' option really ought to be redone.
destroy_nhwindow(endwin);
dump_close_log();
- /* "So when I die, the first thing I will see in Heaven is a
- * score list?" */
+ /*
+ * "So when I die, the first thing I will see in Heaven is a score list?"
+ *
+ * topten() updates 'logfile' and 'xlogfile', when they're enabled.
+ * Then the current game's score is shown in its relative position
+ * within high scores, and 'record' is updated if that makes the cut.
+ *
+ * FIXME!
+ * If writing topten with raw_print(), which will usually be sent to
+ * stdout, we call exit_nhwindows() first in case it erases the screen.
+ * But when writing topten to a window, we call exit_nhwindows()
+ * after topten() because that needs the windowing system to still
+ * be up. This sequencing is absurd; we need something like
+ * raw_prompt("--More--") (or "Press <return> to continue.") that
+ * topten() can call for !toptenwin before returning here.
+ */
if (have_windows && !iflags.toptenwin)
exit_nhwindows((char *) 0), have_windows = FALSE;
- /* update 'logfile' and 'xlogfile', if enabled, and maybe 'record' */
topten(how, endtime);
if (have_windows)
exit_nhwindows((char *) 0);
free_ttlist(tt_head);
showwin:
- if (iflags.toptenwin && !done_stopprint)
- display_nhwindow(g.toptenwin, TRUE);
+ if (!done_stopprint) {
+ if (iflags.toptenwin) {
+ display_nhwindow(g.toptenwin, TRUE);
+ } else {
+ /* when not a window, we need something comparable to more()
+ but can't use it directly because we aren't dealing with
+ the message window */
+ ;
+ }
+ }
destroywin:
if (!t0_used)
dealloc_ttentry(t0);
Strcpy(linebuf3, bp);
else
Strcpy(linebuf3, bp + 1);
- *bp = 0;
+ *bp = '\0';
if (so) {
while (bp < linebuf + (COLNO - 1))
*bp++ = ' ';
- *bp = 0;
+ *bp = '\0';
topten_print_bold(linebuf);
} else
topten_print(linebuf);
if (so) {
bp = eos(linebuf);
- if (so >= COLNO)
- so = COLNO - 1;
- while (bp < linebuf + so)
+ while (bp < linebuf + (COLNO - 1))
*bp++ = ' ';
- *bp = 0;
+ *bp = '\0';
topten_print_bold(linebuf);
} else
topten_print(linebuf);
#endif
#endif /* TERMLIB */
+/* these don't need to be part of 'struct instance_globals g' */
+static char tty_standout_on[16], tty_standout_off[16];
+
void
tty_startup(int *wid, int *hgt)
{
MR = Tgetstr("mr"); /* reverse */
MB = Tgetstr("mb"); /* blink */
MD = Tgetstr("md"); /* boldface */
+ if (!SO)
+ SO = MD;
MH = Tgetstr("mh"); /* dim */
ME = Tgetstr("me"); /* turn off all attributes */
if (!ME)
error("TERMCAP entry too big...\n");
free((genericptr_t) tptr);
#endif /* TERMLIB */
+ /* keep static copies of these so that raw_print_bold() will work
+ after exit_nhwindows(); if the sequences are too long, then bold
+ won't work after that--it will be rendered as ordinary text */
+ if (nh_HI && strlen(nh_HI) < sizeof tty_standout_on)
+ Strcpy(tty_standout_on, nh_HI);
+ if (nh_HE && strlen(nh_HE) < sizeof tty_standout_off)
+ Strcpy(tty_standout_off, nh_HE);
}
/* note: at present, this routine is not part of the formal window interface
void
term_start_raw_bold(void)
{
- xputs(nh_HI);
+ if (!nh_HI)
+ nh_HI = tty_standout_on;
+
+ if (*nh_HI)
+ xputs(nh_HI);
}
void
term_end_raw_bold(void)
{
- xputs(nh_HE);
+ if (!nh_HE)
+ nh_HE = tty_standout_off;
+
+ if (*nh_HE)
+ xputs(nh_HE);
}
#ifdef TEXTCOLOR