fix github pull request #197 - curses CR handling

Fixes #197
Fixes #195

Add a call to nonl() to tell curses not to convert carriage return (^M)
to newline.  Line input accepts both ^J and ^M as end of line/end of
input, but the core's command processing treats ^M as "unknown command"
(by default; someone could use the BIND option to assign some command
to that character).  The end result is that accidentally pressing the
<return> or <enter> key (or Ctrl+M key combination) won't make the hero
run towards the bottom of the screen as if the user had typed ^J.  The
curses docs also claim that it allows more optimization during screen
updating by making ^J work as plain linefeed rather than ^M^J newline.

The tty interface can achieve this (the 'do not convert ^M to ^J part',
not the 'more optimization' part) by issuing the command 'stty -icrnl'
(on Unix or sufficiently Unix-like system) prior to running nethack,
but that has no effect when using the curses interface (at least with
ncurses on OSX where I've tested it).

A better fix would be to look up the current terminal settings at
program startup and only call nonl() if -crnl was in effect so that
curses and tty would behave the same in this regard, but curses is
supposed to let us avoid those sorts of messy details....
This commit is contained in:
PatR
2019-06-08 08:55:44 -07:00
parent 7ea69225e9
commit a64a2f85f4
2 changed files with 8 additions and 1 deletions

View File

@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.44 $ $NHDT-Date: 1559998716 2019/06/08 12:58:36 $
$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.45 $ $NHDT-Date: 1560009340 2019/06/08 15:55:40 $
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,
@@ -98,6 +98,11 @@ curses: when display windows get reconfigured (after setting align_status,
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
curses: don't convert ^M (or <return> or <enter> key) into ^J; both ^J and ^M
indicate end of input when typing a line of text but as nethack
commands, ^J means run toward bottom of screen (when number_pad is
off) and ^M is not bound to any command, so accidental <return> won't
cause the hero to try to move
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

View File

@@ -143,6 +143,8 @@ curses_init_nhwindows(int *argcp UNUSED,
#endif
noecho();
raw();
nonl(); /* don't force ^M into newline (^J); input accepts them both
* but as a command, accidental <enter> won't run South */
meta(stdscr, TRUE);
orig_cursor = curs_set(0);
keypad(stdscr, TRUE);