]> granicus.if.org Git - nethack/commitdiff
curses erase char and kill char
authorPatR <rankin@nethack.org>
Fri, 28 Jun 2019 00:18:07 +0000 (17:18 -0700)
committerPatR <rankin@nethack.org>
Fri, 28 Jun 2019 00:18:07 +0000 (17:18 -0700)
Support user's terminal settings for erase char and for kill char.
Erase char is typically <delete> or <backspace>, both of which are
already explicitly handled so probably no effect there.  Kill char
(generally ^U these days) will be honored unless it is a printable
character (don't know whether there are any troglodytes out there
who still use '@' for that...).  The current handling for ESC works
the same if there is any input to kill, but yields 'cancelled' when
there isn't.

That's for message window getline(), which operates char-by-char.
The popup getline() uses a curses routine to get an entire string
and already honors kill char but treats ESC as input of ^[.

doc/fixes36.3
win/curses/cursmain.c
win/curses/cursmesg.c

index 8d778b1c9ae3688147db14d8ebb96ab03342a701..1bd82a925f61114345d49cb99d034139e74048d4 100644 (file)
@@ -1,4 +1,4 @@
-$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.71 $ $NHDT-Date: 1561457861 2019/06/25 10:17:41 $
+$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.72 $ $NHDT-Date: 1561681080 2019/06/28 00:18:00 $
 
 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,
@@ -156,6 +156,8 @@ curses: when map window was clipped, the 'scrollbars' shown to indicate which
        "*--------------" for horizontal (and comparable '*' with multiple '|'
        underneath for vertical) when it meant to show "---******------" if
        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+'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
index 0b36d5622e37a181d18bf8e1307c5f9b45cbba9d..5b424a8e278d22948ff6de111d040a778acfe484 100644 (file)
@@ -9,6 +9,15 @@
 #include "color.h"
 #include "wincurs.h"
 
+/* define this if not linking with <foo>tty.o|.obj for some reason */
+#ifdef CURSES_DEFINE_ERASE_CHAR
+char erase_char, kill_char;
+#else
+/* defined in sys/<foo>/<foo>tty.o|.obj which gets linked into
+   tty-only, tty+curses, and curses-only binaries */
+extern char erase_char, kill_char;
+#endif
+
 extern long curs_mesg_suppress_turn; /* from cursmesg.c */
 
 /* Public functions for curses NetHack interface */
@@ -183,6 +192,10 @@ curses_init_nhwindows(int *argcp UNUSED,
     if ((term_rows < 15) || (term_cols < 40)) {
         panic("Terminal too small.  Must be minumum 40 width and 15 height");
     }
+    /* during line input, deletes the most recently typed character */
+    erase_char = erasechar(); /* <delete>/<rubout> or possibly <backspace> */
+    /* during line input, deletes all typed characters */
+    kill_char = killchar(); /* ^U (back in prehistoric times, '@') */
 
     curses_create_main_windows();
     curses_init_mesg_history();
index 992d5741fea8334bb37460b05ede068f40bb7508..ce46ebfae4b3156e1e5c6d93da30ce453605f2c2 100644 (file)
@@ -9,6 +9,10 @@
 #include "cursmesg.h"
 #include <ctype.h>
 
+/* defined in sys/<foo>/<foo>tty.c or cursmain.c as last resort;
+   set up by curses_init_nhwindows() */
+extern char erase_char, kill_char;
+
 /*
  * Note: references to "More>>" mean ">>", the curses rendition of "--More--".
  */
@@ -591,19 +595,19 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer)
 #else
         ch = getch();
 #endif
-#if 0   /* [erase_char (delete one character) and kill_char (delete all
-         * characters) are from tty and not currently set up for curses] */
-        if (ch == erase_char) {
+        curs_set(0);
+
+        if (erase_char && ch == erase_char) {
             ch = '\177'; /* match switch-case below */
 
         /* honor kill_char if it's ^U or similar, but not if it's '@' */
-        } else if (ch == kill_char && (ch < ' ' || ch >= '\177')) { /*ASCII*/
+        } else if (kill_char && ch == kill_char
+                   && (ch < ' ' || ch >= '\177')) { /*ASCII*/
             if (len == 0) /* nothing to kill; just start over */
                 continue;
             ch = '\033'; /* get rid of all current input, then start over */
         }
-#endif
-        curs_set(0);
+
         switch (ch) {
         case ERR: /* should not happen */
             *answer = '\0';