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

@@ -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);