From 73fed3d5d8f8d4b6a57877f84cabd4ddb84f6f63 Mon Sep 17 00:00:00 2001 From: PatR Date: Thu, 16 Nov 2023 23:11:54 -0800 Subject: [PATCH] tty: menu search (':') fix 'm O' is a prime candidate for using ':' to select a menu item since you can use that to avoid scrolling through many pages, but typing ':' would immediately overwrite two or three lines of the menu with a status refresh. curses doesn't suffer from this problem. X11 and Qt show menus in separate windows do don't either. Not sure about WinGUI. I think that this may have been reported in the past, but if so I don't recall by whom, or why it wasn't addressed. --- doc/fixes3-7-0.txt | 4 +++- win/tty/getline.c | 23 ++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index b1ab56459..6d210f64f 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1294 $ $NHDT-Date: 1699813307 2023/11/12 18:21:47 $ +$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1297 $ $NHDT-Date: 1700204638 2023/11/17 07:03:58 $ General Fixes and Modified Features ----------------------------------- @@ -2024,6 +2024,8 @@ tty: if a menu used full screen and brought up another menu that wasn't full it with most of the map left blank until after the menu was dismissed tty: have dismiss pick-none menus instead of acting like '>' (not only wouldn't dismiss when not on last page, wouldn't dismiss at all) +tty: menu search via ':' would clobber part of the menu with a status line + refresh if the menu was tall enough to cover that Unix: when user name is used as default character name, keep hyphenated value intact instead stripping off dash and whatever follows as if that specified role/race/&c (worked once upon a time; broken since 3.3.0) diff --git a/win/tty/getline.c b/win/tty/getline.c index abefed260..0f3adca44 100644 --- a/win/tty/getline.c +++ b/win/tty/getline.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 getline.c $NHDT-Date: 1596498343 2020/08/03 23:45:43 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.44 $ */ +/* NetHack 3.7 getline.c $NHDT-Date: 1700204638 2023/11/17 07:03:58 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.56 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2006. */ /* NetHack may be freely redistributed. See license for details. */ @@ -28,8 +28,9 @@ extern char erase_char, kill_char; /* from appropriate tty.c file */ /* * Read a line closed with '\n' into the array char bufp[BUFSZ]. * (The '\n' is not stored. The string is closed with a '\0'.) - * Reading can be interrupted by an escape ('\033') - now the - * resulting string is "\033". + * Reading can be interrupted by an escape ('\033'). If there is already + * some text, it is removed and prompting continues as if from the start. + * However, if there is no text yet (or anymore) then "\033" is returned. */ void tty_getlin(const char *query, register char *bufp) @@ -55,8 +56,20 @@ hooked_tty_getlin( ttyDisplay->toplin = TOPLINE_SPECIAL_PROMPT; ttyDisplay->inread++; - /* issue the prompt */ + /* + * Issue the prompt. + * + * custompline() will call vpline() which calls flush_screen() which + * calls bot(). We don't want bot() modifying the screen during + * whatever this prompt is for. If the status area hasn't been + * overwritten, no update is needed, but if has been overwritten (by + * a menu or text window) we don't want status refresh to clobber that + * when the window hasn't finished yet. [Fix for menu search via ':'.] + */ + if (ttyDisplay->lastwin != WIN_STATUS) + gc.context.botl = gc.context.botlx = iflags.time_botl = FALSE; custompline(OVERRIDE_MSGTYPE | SUPPRESS_HISTORY, "%s ", query); + #ifdef EDIT_GETLIN /* bufp is input/output; treat current contents (presumed to be from previous getlin()) as default input */ @@ -90,7 +103,7 @@ hooked_tty_getlin( ttyDisplay->intr--; *bufp = 0; } - if (c == '\020') { /* ctrl-P */ + if (c == '\020') { /* ctrl-P, doesn't honor rebinding #prevmsg cmd */ if (iflags.prevmsg_window != 's') { int sav = ttyDisplay->inread;