int __timeout(int delay) { #ifdef DEBUG __CTRACE(__CTRACE_MISC, "__timeout()\n"); #endif /* Check if we need to restart ... */ if (_cursesi_screen->endwin) __restartwin(); if (_cursesi_screen->notty == TRUE) return OK; _cursesi_screen->ovmin = _cursesi_screen->cbreakt.c_cc[VMIN]; _cursesi_screen->ovtime = _cursesi_screen->cbreakt.c_cc[VTIME]; _cursesi_screen->rawt.c_cc[VMIN] = 0; _cursesi_screen->rawt.c_cc[VTIME] = delay; _cursesi_screen->cbreakt.c_cc[VMIN] = 0; _cursesi_screen->cbreakt.c_cc[VTIME] = delay; _cursesi_screen->baset.c_cc[VMIN] = 0; _cursesi_screen->baset.c_cc[VTIME] = delay; if (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ? TCSASOFT | TCSANOW : TCSANOW, _cursesi_screen->curt)) { __restore_termios(); return ERR; } return OK; }
int __nodelay(void) { #ifdef DEBUG __CTRACE(__CTRACE_MISC, "__nodelay()\n"); #endif /* Check if we need to restart ... */ if (_cursesi_screen->endwin) __restartwin(); if (_cursesi_screen->notty == TRUE) return OK; _cursesi_screen->rawt.c_cc[VMIN] = 0; _cursesi_screen->rawt.c_cc[VTIME] = 0; _cursesi_screen->cbreakt.c_cc[VMIN] = 0; _cursesi_screen->cbreakt.c_cc[VTIME] = 0; _cursesi_screen->baset.c_cc[VMIN] = 0; _cursesi_screen->baset.c_cc[VTIME] = 0; if (tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSANOW, _cursesi_screen->curt)) { __restore_termios(); return ERR; } return OK; }
/* * wgetch -- * Read in a character from the window. */ int wgetch(WINDOW *win) { int inp, weset; int c; FILE *infd = _cursesi_screen->infd; #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "wgetch: win(%p)\n", win); #endif if (!(win->flags & __SCROLLOK) && (win->flags & __FULLWIN) && win->curx == win->maxx - 1 && win->cury == win->maxy - 1 && __echoit) return (ERR); if (is_wintouched(win)) wrefresh(win); #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "wgetch: __echoit = %d, " "__rawmode = %d, __nl = %d, flags = %#.4x, delay = %d\n", __echoit, __rawmode, _cursesi_screen->nl, win->flags, win->delay); #endif if (_cursesi_screen->resized) { _cursesi_screen->resized = 0; #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "wgetch returning KEY_RESIZE\n"); #endif return KEY_RESIZE; } if (_cursesi_screen->unget_pos) { #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "wgetch returning char at %d\n", _cursesi_screen->unget_pos); #endif _cursesi_screen->unget_pos--; c = _cursesi_screen->unget_list[_cursesi_screen->unget_pos]; if (__echoit) waddch(win, (chtype) c); return c; } if (__echoit && !__rawmode) { cbreak(); weset = 1; } else weset = 0; __save_termios(); if (win->flags & __KEYPAD) { switch (win->delay) { case -1: inp = inkey (win->flags & __NOTIMEOUT ? 0 : 1, 0); break; case 0: if (__nodelay() == ERR) return ERR; inp = inkey(0, 0); break; default: inp = inkey(win->flags & __NOTIMEOUT ? 0 : 1, win->delay); break; } } else { switch (win->delay) { case -1: if (__delay() == ERR) return ERR; break; case 0: if (__nodelay() == ERR) return ERR; break; default: if (__timeout(win->delay) == ERR) return ERR; break; } c = fgetc(infd); if (feof(infd)) { clearerr(infd); __restore_termios(); return ERR; /* we have timed out */ } if (ferror(infd)) { clearerr(infd); inp = ERR; } else { inp = c; } } #ifdef DEBUG if (inp > 255) /* we have a key symbol - treat it differently */ /* XXXX perhaps __unctrl should be expanded to include * XXXX the keysyms in the table.... */ __CTRACE(__CTRACE_INPUT, "wgetch assembled keysym 0x%x\n", inp); else __CTRACE(__CTRACE_INPUT, "wgetch got '%s'\n", unctrl(inp)); #endif if (win->delay > -1) { if (__delay() == ERR) return ERR; } __restore_termios(); if ((__echoit) && (inp < KEY_MIN)) waddch(win, (chtype) inp); if (weset) nocbreak(); if (_cursesi_screen->nl && inp == 13) inp = 10; return ((inp < 0) || (inp == ERR) ? ERR : inp); }