From c61d3d64038e3d3a88514c451e7c325cd8d80e0f Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 28 May 2019 01:52:37 -0700 Subject: [PATCH 1/2] curses message window Fix a 'FIXME': don't follow a message with two spaces in anticipation of combining with the next one, precede the next one with two spaces when they're being combined. Keeps nethack's message window coordinates in sync with curses' internal coordinates. --- win/curses/cursmesg.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c index 13c3109ba..e006bd76f 100644 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@ -96,12 +96,15 @@ curses_message_win_puts(const char *message, boolean recursed) mesg_add_line(message); } - linespace = width - 3 - (mx - border_space); + /* -2: room for trailing ">>" (if More>> is needed) or leading " " + (if combining this message with preceding one) */ + linespace = (width - 1) - 2 - (mx - border_space); if (linespace < message_length) { if (my - border_space >= height - 1) { /* bottom of message win */ - if (++turn_lines >= height) { /* || height == 1) */ + if (++turn_lines > height + || (turn_lines == height && mx > border_space)) { /* Pause until key is hit - Esc suppresses any further messages that turn */ if (curses_more() == '\033') { @@ -119,6 +122,13 @@ curses_message_win_puts(const char *message, boolean recursed) ++turn_lines; } } + } else { /* don't need to move to next line */ + /* if we aren't at the start of the line, we're combining multiple + messages on one line; use 2-space separation */ + if (mx > border_space) { + waddstr(win, " "); + mx += 2; + } } bold = (height > 1 && !last_messages); @@ -142,14 +152,6 @@ curses_message_win_puts(const char *message, boolean recursed) free(tmpstr); } else { mvwprintw(win, my, mx, "%s", message), mx += message_length; - /* two spaces to separate this message from next one if they happen - to fit on the same line; (FIXME: it would be better if this was - done at start of next message rather than end of this one since - it impacts placement of "More>>") */ - if (mx < width - 2) { - if (++mx < width - 2) - ++mx; - } if (bold) curses_toggle_color_attr(win, NONE, A_BOLD, OFF); } @@ -705,10 +707,7 @@ directional_scroll(winid wid, int nlines) wscrl(win, nlines); scrollok(win, FALSE); if (wid == MESSAGE_WIN) { - if (border) - mx = 1; - else - mx = 0; + mx = border ? 1 : 0; } if (border) { box(win, 0, 0); From f478b4ec9578a73df309da65fb3b93df3670ddd7 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 28 May 2019 02:27:40 -0700 Subject: [PATCH 2/2] curses getline() After going back and forth between prompts causing message lines to be overwritten and to be skipped, this yoyo might have finally run out of string. Fingers crossed.... --- doc/fixes36.3 | 4 +++- win/curses/cursmesg.c | 14 +++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/doc/fixes36.3 b/doc/fixes36.3 index ba04dc4d3..05ed99bd2 100644 --- a/doc/fixes36.3 +++ b/doc/fixes36.3 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.24 $ $NHDT-Date: 1558921075 2019/05/27 01:37:55 $ +$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.25 $ $NHDT-Date: 1559035655 2019/05/28 09:27:35 $ This fixes36.3 file is here to capture information about updates in the 3.6.x lineage following the release of 3.6.2 in May 2019. Please note, however, @@ -57,6 +57,8 @@ curses: when display windows get reconfigured (after setting align_status, when feasible it combines short lines, resulting in N messages on fewer than N lines and leaving some of the available lines blank.] curses: plug memory leak when getting a line of input is cancelled by ESC +curses: after requesting a line of input from player, next line of message + window could end up being skipped tty: re-do one optimization used when status conditions have all been removed and remove another that tried to check whether condition text to be displayed next was the same as the existing value; sometimes new diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c index e006bd76f..d752223fa 100644 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@ -584,6 +584,9 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer) #endif curs_set(0); switch (ch) { + case ERR: /* should not happen */ + *answer = '\0'; + goto alldone; case '\033': /* DOESCAPE */ /* if there isn't any input yet, return ESC */ if (len == 0) { @@ -610,20 +613,25 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer) *p_answer = '\0'; len = 0; break; - case ERR: /* should not happen */ - *answer = '\0'; - goto alldone; case '\r': case '\n': (void) strncpy(answer, p_answer, buffer); answer[buffer - 1] = '\0'; Strcpy(toplines, tmpbuf); mesg_add_line(tmpbuf); +#if 1 + /* position at end of current line so next message will be + written on next line regardless of whether it could fit here */ + mx = border_space ? (width + 1) : (width - 1); + wmove(win, my, mx); +#else /* after various other changes, this resulted in getline() + * prompt+answer being following by a blank message line */ if (++my > maxy) { scroll_window(MESSAGE_WIN); my--; } mx = border_space; +#endif /*0*/ goto alldone; case '\177': /* DEL/Rubout */ case KEY_DC: /* delete-character */