From 77da2fdc6552cd01655c7c2192b03d6c66180fe3 Mon Sep 17 00:00:00 2001 From: PatR Date: Fri, 13 Apr 2018 04:32:05 -0700 Subject: [PATCH] tty EDIT_GETLIN fix for wrapped prompt When a getlin() response is being typed, it wraps to second line if the cursor tries to go past COLNO-1, but if a previous response is treated as part of the prompt, using pline() to write prompt+space+text wraps at a whole word boundary. tty's getlin() assumes that the screen position can be derived from that prompt+space+text_so_far but that doesn't match if wrapping at a word boundary leaves blank space at end of the top line. When a prompt is accompanied by default answer, output the answer separately instead of pretending it is part of the prompt. Line-wrap should occur at same point as when it was originally typed and avoid the confusion about how far to back up when deleting characters. This hasn't been exhaustively tested but it seems to work correctly for ordinary input, input erased one character at a time, and input killed all at once. One thing which definitely hasn't been tested is having the prompt itself be so long that it needs to wrap. --- doc/fixes36.1 | 4 ++++ win/tty/getline.c | 14 ++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/doc/fixes36.1 b/doc/fixes36.1 index 37a7ce57c..558341fce 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -632,6 +632,10 @@ gas spore explosion killing a gas spore which triggers a recursive explosion if multiple bands of blank lines were squeezed out of DUMPLOG's map, spurious blank lines appeared in the final map output cursor positioning autodescribe of a statue while hallucinating was blank +tty+EDIT_GETLIN: if prompt plus existing output buffer contents (result of + a prior getlin() used as default input) was long enough to wrap to + second line, the wrap point could be different from when the previous + input was typed, resulting it strange erase-char/kill-chars behavior Platform- and/or Interface-Specific Fixes diff --git a/win/tty/getline.c b/win/tty/getline.c index 058912186..f471d853f 100644 --- a/win/tty/getline.c +++ b/win/tty/getline.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 getline.c $NHDT-Date: 1522796701 2018/04/03 23:05:01 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.34 $ */ +/* NetHack 3.6 getline.c $NHDT-Date: 1523619111 2018/04/13 11:31:51 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.35 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -56,13 +56,19 @@ getlin_hook_proc hook; cw->flags &= ~WIN_STOP; ttyDisplay->toplin = 3; /* special prompt state */ ttyDisplay->inread++; + + /* issue the prompt */ + custompline(OVERRIDE_MSGTYPE | SUPPRESS_HISTORY, "%s ", query); #ifdef EDIT_GETLIN - custompline(OVERRIDE_MSGTYPE | SUPPRESS_HISTORY, "%s %s", query, bufp); + /* bufp is input/output; treat current contents (presumed to be from + previous getlin()) as default input */ + addtopl(obufp); bufp = eos(obufp); #else - custompline(OVERRIDE_MSGTYPE | SUPPRESS_HISTORY, "%s ", query); - *obufp = 0; + /* !EDIT_GETLIN: bufp is output only; init it to empty */ + *bufp = '\0'; #endif + for (;;) { (void) fflush(stdout); Strcat(strcat(strcpy(toplines, query), " "), obufp);