+ if (ch == '\n'
+ || ch == '\r'
+ || ch == KEY_DOWN
+ || ch == KEY_ENTER) {
+ if (oldecho == TRUE
+ && win->_cury == win->_maxy
+ && win->_scroll)
+ wechochar(win, (chtype) '\n');
+ break;
+ }
+#ifdef KEY_EVENT
+ if (ch == KEY_EVENT)
+ break;
+#endif
+#ifdef KEY_RESIZE
+ if (ch == KEY_RESIZE)
+ break;
+#endif
+ if (ch == erasec || ch == KEY_LEFT || ch == KEY_BACKSPACE) {
+ if (str > oldstr) {
+ str = WipeOut(win, y, x, oldstr, str, oldecho);
+ }
+ } else if (ch == killc) {
+ while (str > oldstr) {
+ str = WipeOut(win, y, x, oldstr, str, oldecho);
+ }
+ } else if (ch >= KEY_MIN
+ || (str - oldstr >= maxlen)) {
+ NCURSES_SP_NAME(beep) (NCURSES_SP_ARG);
+ } else {
+ *str++ = (char) ch;
+ if (oldecho == TRUE) {
+ int oldy = win->_cury;
+ if (waddch(win, (chtype) ch) == ERR) {
+ /*
+ * We can't really use the lower-right
+ * corner for input, since it'll mess
+ * up bookkeeping for erases.
+ */
+ win->_flags &= ~_WRAPPED;
+ waddch(win, (chtype) ' ');
+ str = WipeOut(win, y, x, oldstr, str, oldecho);
+ continue;
+ } else if (win->_flags & _WRAPPED) {
+ /*
+ * If the last waddch forced a wrap &
+ * scroll, adjust our reference point
+ * for erasures.
+ */
+ if (win->_scroll
+ && oldy == win->_maxy
+ && win->_cury == win->_maxy) {
+ if (--y <= 0) {
+ y = 0;
+ }
+ }
+ win->_flags &= ~_WRAPPED;
+ }
+ wrefresh(win);
+ }
+ }
+ }
+
+ win->_curx = 0;
+ win->_flags &= ~_WRAPPED;
+ if (win->_cury < win->_maxy)
+ win->_cury++;
+ wrefresh(win);
+
+ /* Restore with a single I/O call, to fix minor asymmetry between
+ * raw/noraw, etc.
+ */
+ sp->_nl = oldnl;
+ sp->_echo = oldecho;
+ sp->_raw = oldraw;
+ sp->_cbreak = oldcbreak;
+
+ NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+
+ *str = '\0';
+ if (ch == ERR)
+ returnCode(ch);
+
+ T(("wgetnstr returns %s", _nc_visbuf(oldstr)));
+
+#ifdef KEY_EVENT
+ if (ch == KEY_EVENT)
+ returnCode(ch);
+#endif
+#ifdef KEY_RESIZE
+ if (ch == KEY_RESIZE)
+ returnCode(ch);
+#endif
+
+ returnCode(OK);
+}