/* * SVr4/XSI Curses specify that hardware echo is turned off in initscr, and not * restored during the curses session. The library simulates echo in software. * (The behavior is unspecified if the application enables hardware echo). * * The newterm function also initializes terminal settings, and since initscr * is supposed to behave as if it calls newterm, we do it here. */ static NCURSES_INLINE int _nc_initscr(void) { int result = ERR; /* for extended XPG4 conformance requires cbreak() at this point */ /* (SVr4 curses does this anyway) */ if (cbreak() == OK) { TTY buf; buf = cur_term->Nttyb; #ifdef TERMIOS buf.c_lflag &= ~(ECHO | ECHONL); buf.c_iflag &= ~(ICRNL | INLCR | IGNCR); buf.c_oflag &= ~(ONLCR); #elif HAVE_SGTTY_H buf.sg_flags &= ~(ECHO | CRMOD); #else memset(&buf, 0, sizeof(buf)); #endif if ((result = _nc_set_tty_mode(&buf)) == OK) cur_term->Nttyb = buf; } return result; }
nocbreak(void) { int result = ERR; T((T_CALLED("nocbreak()"))); if (SP != 0 && cur_term != 0) { TTY buf; BEFORE("nocbreak"); _nc_setmode(O_TEXT); buf = cur_term->Nttyb; #ifdef TERMIOS buf.c_lflag |= ICANON; buf.c_iflag |= ICRNL; #else buf.sg_flags &= ~CBREAK; #endif if ((result = _nc_set_tty_mode(&buf)) == OK) { SP->_cbreak = 0; cur_term->Nttyb = buf; } AFTER("nocbreak"); } returnCode(result); }
raw(void) { int result = ERR; T((T_CALLED("raw()"))); if (SP != 0 && cur_term != 0) { TTY buf; BEFORE("raw"); _nc_setmode(O_BINARY); buf = cur_term->Nttyb; #ifdef TERMIOS buf.c_lflag &= ~(ICANON | ISIG | IEXTEN); buf.c_iflag &= ~(COOKED_INPUT); buf.c_cc[VMIN] = 1; buf.c_cc[VTIME] = 0; #else buf.sg_flags |= RAW; #endif if ((result = _nc_set_tty_mode(&buf)) == OK) { SP->_raw = TRUE; SP->_cbreak = 1; cur_term->Nttyb = buf; } AFTER("raw"); } returnCode(result); }
cbreak(void) { int result = ERR; T((T_CALLED("cbreak()"))); if (SP != 0 && cur_term != 0) { TTY buf; BEFORE("cbreak"); _nc_setmode(O_BINARY); buf = cur_term->Nttyb; #ifdef TERMIOS buf.c_lflag &= ~ICANON; buf.c_iflag &= ~ICRNL; buf.c_lflag |= ISIG; buf.c_cc[VMIN] = 1; buf.c_cc[VTIME] = 0; #else buf.sg_flags |= CBREAK; #endif if ((result = _nc_set_tty_mode(&buf)) == OK) { SP->_cbreak = 1; cur_term->Nttyb = buf; } AFTER("cbreak"); } returnCode(result); }
noraw(void) { int result = ERR; T((T_CALLED("noraw()"))); if (SP != 0 && cur_term != 0) { TTY buf; BEFORE("noraw"); _nc_setmode(O_TEXT); buf = cur_term->Nttyb; #ifdef TERMIOS buf.c_lflag |= ISIG | ICANON | (cur_term->Ottyb.c_lflag & IEXTEN); buf.c_iflag |= COOKED_INPUT; #else buf.sg_flags &= ~(RAW | CBREAK); #endif if ((result = _nc_set_tty_mode(&buf)) == OK) { SP->_raw = FALSE; SP->_cbreak = 0; cur_term->Nttyb = buf; } AFTER("noraw"); } returnCode(result); }
reset_shell_mode(void) { T((T_CALLED("reset_shell_mode()"))); if (cur_term != 0) { if (SP) { _nc_keypad(FALSE); _nc_flush(); NC_BUFFERED(FALSE); } returnCode(_nc_set_tty_mode(&cur_term->Ottyb)); } returnCode(ERR); }
reset_prog_mode(void) { T((T_CALLED("reset_prog_mode()"))); if (cur_term != 0) { if (_nc_set_tty_mode(&cur_term->Nttyb) == OK) { if (SP) { if (SP->_keypad_on) _nc_keypad(TRUE); NC_BUFFERED(TRUE); } returnCode(OK); } } returnCode(ERR); }
/* * SVr4/XSI Curses specify that hardware echo is turned off in initscr, and not * restored during the curses session. The library simulates echo in software. * (The behavior is unspecified if the application enables hardware echo). * * The newterm function also initializes terminal settings, and since initscr * is supposed to behave as if it calls newterm, we do it here. */ static inline int _nc_initscr(void) { /* for extended XPG4 conformance requires cbreak() at this point */ /* (SVr4 curses does this anyway) */ cbreak(); #ifdef TERMIOS cur_term->Nttyb.c_lflag &= ~(ECHO | ECHONL); cur_term->Nttyb.c_iflag &= ~(ICRNL | INLCR | IGNCR); cur_term->Nttyb.c_oflag &= ~(ONLCR); #else cur_term->Nttyb.sg_flags &= ~(ECHO | CRMOD); #endif return _nc_set_tty_mode(&cur_term->Nttyb); }
NCURSES_SP_NAME(reset_shell_mode) (NCURSES_SP_DCL0) { int rc = ERR; TERMINAL *termp = TerminalOf(SP_PARM); T((T_CALLED("reset_shell_mode(%p)"), (void *) SP_PARM)); if (termp != 0) { #ifdef USE_TERM_DRIVER rc = CallDriver_2(SP_PARM, mode, FALSE, FALSE); #else if (SP_PARM) { _nc_keypad(SP_PARM, FALSE); _nc_flush(); NC_BUFFERED(SP_PARM, FALSE); } rc = _nc_set_tty_mode(&termp->Ottyb); #endif } returnCode(rc); }
qiflush(void) { int result = ERR; T((T_CALLED("qiflush()"))); if (cur_term != 0) { TTY buf; BEFORE("qiflush"); buf = cur_term->Nttyb; #ifdef TERMIOS buf.c_lflag &= ~(NOFLSH); result = _nc_set_tty_mode(&buf); #else /* FIXME */ #endif if (result == OK) cur_term->Nttyb = buf; AFTER("qiflush"); } returnVoid; }
NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_DCL0) { int rc = ERR; TERMINAL *termp = TerminalOf(SP_PARM); T((T_CALLED("reset_prog_mode(%p)"), (void *) SP_PARM)); if (termp != 0) { #ifdef USE_TERM_DRIVER rc = CallDriver_2(SP_PARM, mode, TRUE, FALSE); #else if (_nc_set_tty_mode(&termp->Nttyb) == OK) { if (SP_PARM) { if (SP_PARM->_keypad_on) _nc_keypad(SP_PARM, TRUE); NC_BUFFERED(SP_PARM, TRUE); } rc = OK; } #endif } returnCode(rc); }
NCURSES_SP_NAME(noqiflush) (NCURSES_SP_DCL0) { int result = ERR; T((T_CALLED("noqiflush()"))); if (cur_term != 0) { TTY buf; BEFORE("noqiflush"); buf = cur_term->Nttyb; #ifdef TERMIOS buf.c_lflag |= NOFLSH; result = _nc_set_tty_mode(&buf); #else /* FIXME */ #endif if (result == OK) { cur_term->Nttyb = buf; } AFTER("noqiflush"); } returnVoid; }
resetty(void) { T((T_CALLED("resetty()"))); returnCode(_nc_set_tty_mode(&buf)); }
wgetn_wstr(WINDOW *win, wint_t *str, int maxlen) { SCREEN *sp = _nc_screen_of(win); TTY buf; bool oldnl, oldecho, oldraw, oldcbreak; wint_t erasec; wint_t killc; wint_t *oldstr = str; wint_t *tmpstr = str; wint_t ch; int y, x, code; T((T_CALLED("wgetn_wstr(%p,%p, %d)"), win, str, maxlen)); if (!win) returnCode(ERR); _nc_get_tty_mode(&buf); oldnl = sp->_nl; oldecho = sp->_echo; oldraw = sp->_raw; oldcbreak = sp->_cbreak; nl(); noecho(); noraw(); cbreak(); erasec = (wint_t) erasechar(); killc = (wint_t) killchar(); getyx(win, y, x); if (is_wintouched(win) || (win->_flags & _HASMOVED)) wrefresh(win); while ((code = wget_wch(win, &ch)) != ERR) { /* * Map special characters into key-codes. */ if (ch == '\r') ch = '\n'; if (ch == '\n') { code = KEY_CODE_YES; ch = KEY_ENTER; } if (ch < KEY_MIN) { if (ch == erasec) { ch = KEY_BACKSPACE; code = KEY_CODE_YES; } if (ch == killc) { ch = KEY_EOL; code = KEY_CODE_YES; } } if (code == KEY_CODE_YES) { /* * Some terminals (the Wyse-50 is the most common) generate a \n * from the down-arrow key. With this logic, it's the user's * choice whether to set kcud=\n for wget_wch(); terminating * *getn_wstr() with \n should work either way. */ if (ch == KEY_DOWN || ch == KEY_ENTER) { if (oldecho == TRUE && win->_cury == win->_maxy && win->_scroll) wechochar(win, (chtype) '\n'); break; } if (ch == KEY_LEFT || ch == KEY_BACKSPACE) { if (tmpstr > oldstr) { tmpstr = WipeOut(win, y, x, oldstr, tmpstr, oldecho); } } else if (ch == KEY_EOL) { while (tmpstr > oldstr) { tmpstr = WipeOut(win, y, x, oldstr, tmpstr, oldecho); } } else { beep(); } } else if (maxlen >= 0 && tmpstr - oldstr >= maxlen) { beep(); } else { *tmpstr++ = ch; *tmpstr = 0; if (oldecho == TRUE) { int oldy = win->_cury; if (wadd_wint(win, tmpstr - 1) == 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) ' '); tmpstr = WipeOut(win, y, x, oldstr, tmpstr, 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; (void) _nc_set_tty_mode(&buf); *tmpstr = 0; if (code == ERR) { if (tmpstr == oldstr) { *tmpstr++ = WEOF; *tmpstr = 0; } returnCode(ERR); } T(("wgetn_wstr returns %s", _nc_viswibuf(oldstr))); returnCode(OK); }
wgetnstr_events(WINDOW *win, char *str, int maxlen, EVENTLIST_1st(_nc_eventlist * evl)) { SCREEN *sp = _nc_screen_of(win); TTY buf; bool oldnl, oldecho, oldraw, oldcbreak; char erasec; char killc; char *oldstr; int ch; int y, x; T((T_CALLED("wgetnstr(%p,%p, %d)"), win, str, maxlen)); if (!win) returnCode(ERR); _nc_get_tty_mode(&buf); oldnl = sp->_nl; oldecho = sp->_echo; oldraw = sp->_raw; oldcbreak = sp->_cbreak; nl(); noecho(); noraw(); cbreak(); erasec = erasechar(); killc = killchar(); oldstr = str; getyx(win, y, x); if (is_wintouched(win) || (win->_flags & _HASMOVED)) wrefresh(win); while ((ch = wgetch_events(win, evl)) != ERR) { /* * Some terminals (the Wyse-50 is the most common) generate * a \n from the down-arrow key. With this logic, it's the * user's choice whether to set kcud=\n for wgetch(); * terminating *getstr() with \n should work either way. */ 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 || (maxlen >= 0 && str - oldstr >= maxlen)) { beep(); } 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; _nc_set_tty_mode(&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); }