Improved readability of topline state management.

This commit is contained in:
Bart House
2020-10-19 15:19:09 -07:00
parent 3a31587ca9
commit 7795d82be6
4 changed files with 45 additions and 34 deletions
+6
View File
@@ -52,6 +52,12 @@ struct WinDesc {
#define WIN_STOP 1 /* for NHW_MESSAGE; stops output */ #define WIN_STOP 1 /* for NHW_MESSAGE; stops output */
#define WIN_LOCKHISTORY 2 /* for NHW_MESSAGE; suppress history updates */ #define WIN_LOCKHISTORY 2 /* for NHW_MESSAGE; suppress history updates */
/* topline states */
#define TOPLINE_EMPTY 0 /* empty */
#define TOPLINE_NEED_MORE 1 /* non-empty, need --More-- */
#define TOPLINE_NON_EMPTY 2 /* non-empty, no --More-- required */
#define TOPLINE_SPECIAL_PROMPT 3 /* special prompt state */
/* descriptor for tty-based displays -- all the per-display data */ /* descriptor for tty-based displays -- all the per-display data */
struct DisplayDesc { struct DisplayDesc {
short rows, cols; /* width and height of tty display */ short rows, cols; /* width and height of tty display */
+3 -3
View File
@@ -52,10 +52,10 @@ getlin_hook_proc hook;
struct WinDesc *cw = wins[WIN_MESSAGE]; struct WinDesc *cw = wins[WIN_MESSAGE];
boolean doprev = 0; boolean doprev = 0;
if (ttyDisplay->toplin == 1 && !(cw->flags & WIN_STOP)) if (ttyDisplay->toplin == TOPLINE_NEED_MORE && !(cw->flags & WIN_STOP))
more(); more();
cw->flags &= ~WIN_STOP; cw->flags &= ~WIN_STOP;
ttyDisplay->toplin = 3; /* special prompt state */ ttyDisplay->toplin = TOPLINE_SPECIAL_PROMPT;
ttyDisplay->inread++; ttyDisplay->inread++;
/* issue the prompt */ /* issue the prompt */
@@ -193,7 +193,7 @@ getlin_hook_proc hook;
} else } else
tty_nhbell(); tty_nhbell();
} }
ttyDisplay->toplin = 2; /* nonempty, no --More-- required */ ttyDisplay->toplin = TOPLINE_NON_EMPTY;
ttyDisplay->inread--; ttyDisplay->inread--;
clear_nhwindow(WIN_MESSAGE); /* clean up after ourselves */ clear_nhwindow(WIN_MESSAGE); /* clean up after ourselves */
+12 -12
View File
@@ -138,7 +138,7 @@ const char *str;
end_glyphout(); /* in case message printed during graphics output */ end_glyphout(); /* in case message printed during graphics output */
putsyms(str); putsyms(str);
cl_end(); cl_end();
ttyDisplay->toplin = 1; ttyDisplay->toplin = TOPLINE_NEED_MORE;
if (ttyDisplay->cury && otoplin != 3) if (ttyDisplay->cury && otoplin != 3)
more(); more();
} }
@@ -151,7 +151,7 @@ const char *str;
struct WinDesc *cw = wins[WIN_MESSAGE]; struct WinDesc *cw = wins[WIN_MESSAGE];
if (!(cw->flags & WIN_STOP)) { if (!(cw->flags & WIN_STOP)) {
if (ttyDisplay->cury && ttyDisplay->toplin == 2) if (ttyDisplay->cury && ttyDisplay->toplin == TOPLINE_NON_EMPTY)
tty_clear_nhwindow(WIN_MESSAGE); tty_clear_nhwindow(WIN_MESSAGE);
cw->curx = cw->cury = 0; cw->curx = cw->cury = 0;
@@ -159,8 +159,8 @@ const char *str;
cl_end(); cl_end();
addtopl(str); addtopl(str);
if (ttyDisplay->cury && ttyDisplay->toplin != 3) if (ttyDisplay->cury && ttyDisplay->toplin != TOPLINE_SPECIAL_PROMPT)
ttyDisplay->toplin = 2; ttyDisplay->toplin = TOPLINE_NON_EMPTY;
} }
} }
@@ -196,7 +196,7 @@ const char *s;
tty_curs(BASE_WINDOW, cw->curx + 1, cw->cury); tty_curs(BASE_WINDOW, cw->curx + 1, cw->cury);
putsyms(s); putsyms(s);
cl_end(); cl_end();
ttyDisplay->toplin = 1; ttyDisplay->toplin = TOPLINE_NEED_MORE;
} }
void void
@@ -236,7 +236,7 @@ more()
home(); home();
cl_end(); cl_end();
} }
ttyDisplay->toplin = 0; ttyDisplay->toplin = TOPLINE_EMPTY;
ttyDisplay->inmore = 0; ttyDisplay->inmore = 0;
} }
@@ -252,7 +252,7 @@ register const char *bp;
/* If there is room on the line, print message on same line */ /* If there is room on the line, print message on same line */
/* But messages like "You die..." deserve their own line */ /* But messages like "You die..." deserve their own line */
n0 = strlen(bp); n0 = strlen(bp);
if ((ttyDisplay->toplin == 1 || (cw->flags & WIN_STOP)) if ((ttyDisplay->toplin == TOPLINE_NEED_MORE || (cw->flags & WIN_STOP))
&& cw->cury == 0 && cw->cury == 0
&& n0 + (int) strlen(g.toplines) + 3 < CO - 8 /* room for --More-- */ && n0 + (int) strlen(g.toplines) + 3 < CO - 8 /* room for --More-- */
&& (notdied = strncmp(bp, "You die", 7)) != 0) { && (notdied = strncmp(bp, "You die", 7)) != 0) {
@@ -263,9 +263,9 @@ register const char *bp;
addtopl(bp); addtopl(bp);
return; return;
} else if (!(cw->flags & WIN_STOP)) { } else if (!(cw->flags & WIN_STOP)) {
if (ttyDisplay->toplin == 1) { if (ttyDisplay->toplin == TOPLINE_NEED_MORE) {
more(); more();
} else if (cw->cury) { /* for when flags.toplin == 2 && cury > 1 */ } else if (cw->cury) { /* for toplin == TOPLINE_NON_EMPTY && cury > 1 */
docorner(1, cw->cury + 1); /* reset cury = 0 if redraw screen */ docorner(1, cw->cury + 1); /* reset cury = 0 if redraw screen */
cw->curx = cw->cury = 0; /* from home--cls() & docorner(1,n) */ cw->curx = cw->cury = 0; /* from home--cls() & docorner(1,n) */
} }
@@ -381,10 +381,10 @@ char def;
char prompt[BUFSZ]; char prompt[BUFSZ];
yn_number = 0L; yn_number = 0L;
if (ttyDisplay->toplin == 1 && !(cw->flags & WIN_STOP)) if (ttyDisplay->toplin == TOPLINE_NEED_MORE && !(cw->flags & WIN_STOP))
more(); more();
cw->flags &= ~WIN_STOP; cw->flags &= ~WIN_STOP;
ttyDisplay->toplin = 3; /* special prompt state */ ttyDisplay->toplin = TOPLINE_SPECIAL_PROMPT;
ttyDisplay->inread++; ttyDisplay->inread++;
if (resp) { if (resp) {
char *rb, respbuf[QBUFSZ]; char *rb, respbuf[QBUFSZ];
@@ -531,7 +531,7 @@ char def;
dumplogmsg(g.toplines); dumplogmsg(g.toplines);
#endif #endif
ttyDisplay->inread--; ttyDisplay->inread--;
ttyDisplay->toplin = 2; ttyDisplay->toplin = TOPLINE_NON_EMPTY;
if (ttyDisplay->intr) if (ttyDisplay->intr)
ttyDisplay->intr--; ttyDisplay->intr--;
if (wins[WIN_MESSAGE]->cury) if (wins[WIN_MESSAGE]->cury)
+24 -19
View File
@@ -348,7 +348,7 @@ int sig_unused UNUSED;
new_status_window(); new_status_window();
if (u.ux) { if (u.ux) {
i = ttyDisplay->toplin; i = ttyDisplay->toplin;
ttyDisplay->toplin = 0; ttyDisplay->toplin = TOPLINE_EMPTY;
docrt(); docrt();
bot(); bot();
ttyDisplay->toplin = i; ttyDisplay->toplin = i;
@@ -436,7 +436,7 @@ char **argv UNUSED;
/* set up tty descriptor */ /* set up tty descriptor */
ttyDisplay = (struct DisplayDesc *) alloc(sizeof (struct DisplayDesc)); ttyDisplay = (struct DisplayDesc *) alloc(sizeof (struct DisplayDesc));
ttyDisplay->toplin = 0; ttyDisplay->toplin = TOPLINE_EMPTY;
ttyDisplay->rows = hgt; ttyDisplay->rows = hgt;
ttyDisplay->cols = wid; ttyDisplay->cols = wid;
ttyDisplay->curx = ttyDisplay->cury = 0; ttyDisplay->curx = ttyDisplay->cury = 0;
@@ -1652,12 +1652,12 @@ winid window;
switch (cw->type) { switch (cw->type) {
case NHW_MESSAGE: case NHW_MESSAGE:
if (ttyDisplay->toplin) { if (ttyDisplay->toplin != TOPLINE_EMPTY) {
home(); home();
cl_end(); cl_end();
if (cw->cury) if (cw->cury)
docorner(1, cw->cury + 1); docorner(1, cw->cury + 1);
ttyDisplay->toplin = 0; ttyDisplay->toplin = TOPLINE_EMPTY;
} }
break; break;
case NHW_STATUS: case NHW_STATUS:
@@ -2353,12 +2353,13 @@ boolean blocking; /* with ttys, all windows are blocking */
switch (cw->type) { switch (cw->type) {
case NHW_MESSAGE: case NHW_MESSAGE:
if (ttyDisplay->toplin == 1) { if (ttyDisplay->toplin == TOPLINE_NEED_MORE) {
more(); more();
ttyDisplay->toplin = 1; /* more resets this */ ttyDisplay->toplin = TOPLINE_NEED_MORE; /* more resets this */
tty_clear_nhwindow(window); tty_clear_nhwindow(window);
/* nhassert(ttyDisplay->toplin == TOPLINE_EMPTY); */
} else } else
ttyDisplay->toplin = 0; ttyDisplay->toplin = TOPLINE_EMPTY;
cw->curx = cw->cury = 0; cw->curx = cw->cury = 0;
if (!cw->active) if (!cw->active)
iflags.window_inited = TRUE; iflags.window_inited = TRUE;
@@ -2366,8 +2367,8 @@ boolean blocking; /* with ttys, all windows are blocking */
case NHW_MAP: case NHW_MAP:
end_glyphout(); end_glyphout();
if (blocking) { if (blocking) {
if (!ttyDisplay->toplin) if (ttyDisplay->toplin != TOPLINE_EMPTY)
ttyDisplay->toplin = 1; ttyDisplay->toplin = TOPLINE_NEED_MORE;
tty_display_nhwindow(WIN_MESSAGE, TRUE); tty_display_nhwindow(WIN_MESSAGE, TRUE);
return; return;
} }
@@ -2397,7 +2398,7 @@ boolean blocking; /* with ttys, all windows are blocking */
cw->offx = 0; cw->offx = 0;
if (cw->type == NHW_MENU) if (cw->type == NHW_MENU)
cw->offy = 0; cw->offy = 0;
if (ttyDisplay->toplin == 1) if (ttyDisplay->toplin == TOPLINE_NEED_MORE)
tty_display_nhwindow(WIN_MESSAGE, TRUE); tty_display_nhwindow(WIN_MESSAGE, TRUE);
#ifdef H2344_BROKEN #ifdef H2344_BROKEN
if (cw->maxrow >= (int) ttyDisplay->rows if (cw->maxrow >= (int) ttyDisplay->rows
@@ -2413,7 +2414,7 @@ boolean blocking; /* with ttys, all windows are blocking */
cl_eos(); cl_eos();
} else } else
clear_screen(); clear_screen();
ttyDisplay->toplin = 0; ttyDisplay->toplin = TOPLINE_EMPTY;
} else { } else {
if (WIN_MESSAGE != WIN_ERR) if (WIN_MESSAGE != WIN_ERR)
tty_clear_nhwindow(WIN_MESSAGE); tty_clear_nhwindow(WIN_MESSAGE);
@@ -2442,8 +2443,9 @@ winid window;
switch (cw->type) { switch (cw->type) {
case NHW_MESSAGE: case NHW_MESSAGE:
if (ttyDisplay->toplin) if (ttyDisplay->toplin != TOPLINE_EMPTY)
tty_display_nhwindow(WIN_MESSAGE, TRUE); tty_display_nhwindow(WIN_MESSAGE, TRUE);
/* nhassert(ttyDisplay->toplin == TOPLINE_EMPTY); */
/*FALLTHRU*/ /*FALLTHRU*/
case NHW_STATUS: case NHW_STATUS:
case NHW_BASE: case NHW_BASE:
@@ -3194,10 +3196,11 @@ const char *mesg;
response to a prompt, we'll assume that the display is up to date */ response to a prompt, we'll assume that the display is up to date */
tty_putstr(WIN_MESSAGE, 0, mesg); tty_putstr(WIN_MESSAGE, 0, mesg);
/* if `mesg' didn't wrap (triggering --More--), force --More-- now */ /* if `mesg' didn't wrap (triggering --More--), force --More-- now */
if (ttyDisplay->toplin == 1) { if (ttyDisplay->toplin == TOPLINE_NEED_MORE) {
more(); more();
ttyDisplay->toplin = 1; /* more resets this */ ttyDisplay->toplin = TOPLINE_NEED_MORE; /* more resets this */
tty_clear_nhwindow(WIN_MESSAGE); tty_clear_nhwindow(WIN_MESSAGE);
/* nhassert(ttyDisplay->toplin == TOPLINE_EMPTY); */
} }
/* normally <ESC> means skip further messages, but in this case /* normally <ESC> means skip further messages, but in this case
it means cancel the current prompt; any other messages should it means cancel the current prompt; any other messages should
@@ -3237,7 +3240,7 @@ tty_wait_synch()
(void) fflush(stdout); (void) fflush(stdout);
} else if (ttyDisplay->inread > g.program_state.gameover) { } else if (ttyDisplay->inread > g.program_state.gameover) {
/* this can only happen if we were reading and got interrupted */ /* this can only happen if we were reading and got interrupted */
ttyDisplay->toplin = 3; ttyDisplay->toplin = TOPLINE_SPECIAL_PROMPT;
/* do this twice; 1st time gets the Quit? message again */ /* do this twice; 1st time gets the Quit? message again */
(void) tty_doprev_message(); (void) tty_doprev_message();
(void) tty_doprev_message(); (void) tty_doprev_message();
@@ -3570,8 +3573,9 @@ tty_nhgetch()
i = '\033'; /* map NUL to ESC since nethack doesn't expect NUL */ i = '\033'; /* map NUL to ESC since nethack doesn't expect NUL */
else if (i == EOF) else if (i == EOF)
i = '\033'; /* same for EOF */ i = '\033'; /* same for EOF */
if (ttyDisplay && ttyDisplay->toplin == 1) /* topline has been seen - we can clear need for more */
ttyDisplay->toplin = 2; if (ttyDisplay && ttyDisplay->toplin == TOPLINE_NEED_MORE)
ttyDisplay->toplin = TOPLINE_NON_EMPTY;
#ifdef TTY_TILES_ESCCODES #ifdef TTY_TILES_ESCCODES
{ {
/* hack to force output of the window select code */ /* hack to force output of the window select code */
@@ -3613,8 +3617,9 @@ int *x UNUSED, *y UNUSED, *mod UNUSED;
i = ntposkey(x, y, mod); i = ntposkey(x, y, mod);
if (!i && mod && (*mod == 0 || *mod == EOF)) if (!i && mod && (*mod == 0 || *mod == EOF))
i = '\033'; /* map NUL or EOF to ESC, nethack doesn't expect either */ i = '\033'; /* map NUL or EOF to ESC, nethack doesn't expect either */
if (ttyDisplay && ttyDisplay->toplin == 1) /* topline has been seen - we can clear need for more */
ttyDisplay->toplin = 2; if (ttyDisplay && ttyDisplay->toplin == TOPLINE_NEED_MORE)
ttyDisplay->toplin = TOPLINE_NON_EMPTY;
#else /* !WIN32CON */ #else /* !WIN32CON */
i = tty_nhgetch(); i = tty_nhgetch();
#endif /* ?WIN32CON */ #endif /* ?WIN32CON */