From e84a0625dcc3163f74ee02dbaa193853b5ad5b89 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 6 Jul 2019 16:41:04 -0700 Subject: [PATCH] curses moving left with ^H Typing ^H actually passed a 16-bit value back to the core which got interpreted as ^G after the extra bits were discarded. I don't think any previous changes to the curses interface caused this. It's astonishing that no one ever noticed; the world must be full of numpad users. --- doc/fixes36.3 | 3 ++- win/curses/cursmesg.c | 2 +- win/curses/cursmisc.c | 7 +++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/doc/fixes36.3 b/doc/fixes36.3 index 52aa675e4..e9dd29e5f 100644 --- a/doc/fixes36.3 +++ b/doc/fixes36.3 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.84 $ $NHDT-Date: 1562203850 2019/07/04 01:30:50 $ +$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.85 $ $NHDT-Date: 1562456458 2019/07/06 23:40:58 $ 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, @@ -169,6 +169,7 @@ curses: when map window was clipped, the 'scrollbars' shown to indicate which the 2nd and 3rd fifths (for example) were currently within view curses: support users's setting for erase char and kill char when getting a line of input with 'popup_dialog' Off (already supported for popup On) +curses: attempting to use ^H to rush left actually executed ^G (#wizgenesis) curses+'perm_invent': entries were wrapping without any control; usually not noticeable because next entry overwrote, but visible for final entry when whole inventory fit within the available height; looked ok with diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c index 7c83ac423..dfca09397 100644 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@ -661,7 +661,7 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer) goto alldone; case '\177': /* DEL/Rubout */ case KEY_DC: /* delete-character */ - case '\b': /* ^H (Backspace: '\011') */ + case '\b': /* ^H (Backspace: '\010') */ case KEY_BACKSPACE: if (len < 1) { len = 1; diff --git a/win/curses/cursmisc.c b/win/curses/cursmisc.c index 5dcbe6d92..4ac85c0a3 100644 --- a/win/curses/cursmisc.c +++ b/win/curses/cursmisc.c @@ -792,6 +792,13 @@ curses_convert_keys(int key) /* Handle arrow keys */ switch (key) { + case KEY_BACKSPACE: + /* we can't distinguish between a separate backspace key and + explicit Ctrl+H intended to rush to the left; without this, + a value for ^H greater than 255 is passed back to core's + readchar() and stripping the value down to 0..255 yields ^G! */ + ret = C('H'); + break; case KEY_LEFT: if (iflags.num_pad) { ret = '4';