Change-Id: If881ec130833c7e7e62caa3d31e350a531f5bc8e Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-on: http://review.coreboot.org/12398 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
		
			
				
	
	
		
			322 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			322 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Public Domain Curses */
 | |
| 
 | |
| #include <curspriv.h>
 | |
| 
 | |
| RCSID("$Id: inopts.c,v 1.43 2008/07/13 16:08:18 wmcbrine Exp $")
 | |
| 
 | |
| /*man-start**************************************************************
 | |
| 
 | |
|   Name:                                                         inopts
 | |
| 
 | |
|   Synopsis:
 | |
|         int cbreak(void);
 | |
|         int nocbreak(void);
 | |
|         int echo(void);
 | |
|         int noecho(void);
 | |
|         int halfdelay(int tenths);
 | |
|         int intrflush(WINDOW *win, bool bf);
 | |
|         int keypad(WINDOW *win, bool bf);
 | |
|         int meta(WINDOW *win, bool bf);
 | |
|         int nl(void);
 | |
|         int nonl(void);
 | |
|         int nodelay(WINDOW *win, bool bf);
 | |
|         int notimeout(WINDOW *win, bool bf);
 | |
|         int raw(void);
 | |
|         int noraw(void);
 | |
|         void noqiflush(void);
 | |
|         void qiflush(void);
 | |
|         void timeout(int delay);
 | |
|         void wtimeout(WINDOW *win, int delay);
 | |
|         int typeahead(int fildes);
 | |
| 
 | |
|         int crmode(void);
 | |
|         int nocrmode(void);
 | |
| 
 | |
|   Description:
 | |
|         cbreak() and nocbreak() toggle cbreak mode. In cbreak mode,
 | |
|         characters typed by the user are made available immediately, and
 | |
|         erase/kill character processing is not performed.  In nocbreak
 | |
|         mode, typed characters are buffered until a newline or carriage
 | |
|         return. Interrupt and flow control characters are unaffected by
 | |
|         this mode. PDCurses always starts in cbreak mode.
 | |
| 
 | |
|         echo() and noecho() control whether typed characters are echoed
 | |
|         by the input routine.  Initially, input characters are echoed.
 | |
|         Subsequent calls to echo() and noecho() do not flush type-ahead.
 | |
| 
 | |
|         halfdelay() is similar to cbreak(), but allows for a time limit
 | |
|         to be specified, in tenths of a second. This causes getch() to
 | |
|         block for that period before returning ERR if no key has been
 | |
|         received.  tenths must be between 1 and 255.
 | |
| 
 | |
|         keypad() controls whether getch() returns function/special keys
 | |
|         as single key codes (e.g., the left arrow key as KEY_LEFT). Per
 | |
|         X/Open, the default for keypad mode is OFF. You'll probably want
 | |
|         it on. With keypad mode off, if a special key is pressed,
 | |
|         getch() does nothing or returns ERR.
 | |
| 
 | |
|         nodelay() controls whether wgetch() is a non-blocking call. If
 | |
|         the option is enabled, and no input is ready, wgetch() will
 | |
|         return ERR. If disabled, wgetch() will hang until input is
 | |
|         ready.
 | |
| 
 | |
|         nl() enables the translation of a carriage return into a newline
 | |
|         on input. nonl() disables this. Initially, the translation does
 | |
|         occur.
 | |
| 
 | |
|         raw() and noraw() toggle raw mode. Raw mode is similar to cbreak
 | |
|         mode, in that characters typed are immediately passed through to
 | |
|         the user program.  The difference is that in raw mode, the INTR,
 | |
|         QUIT, SUSP, and STOP characters are passed through without being
 | |
|         interpreted, and without generating a signal.
 | |
| 
 | |
|         In PDCurses, the meta() function sets raw mode on or off.
 | |
| 
 | |
|         timeout() and wtimeout() set blocking or non-blocking reads for
 | |
|         the specified window. The delay is measured in milliseconds. If
 | |
|         it's negative, a blocking read is used; if zero, then non-
 | |
|         blocking reads are done -- if no input is waiting, ERR is
 | |
|         returned immediately. If the delay is positive, the read blocks
 | |
|         for the delay period; if the period expires, ERR is returned.
 | |
| 
 | |
|         intrflush(), notimeout(), noqiflush(), qiflush() and typeahead()
 | |
|         do nothing in PDCurses, but are included for compatibility with
 | |
|         other curses implementations.
 | |
| 
 | |
|         crmode() and nocrmode() are archaic equivalents to cbreak() and
 | |
|         nocbreak(), respectively.
 | |
| 
 | |
|   Return Value:
 | |
|         All functions return OK on success and ERR on error.
 | |
| 
 | |
|   Portability                                X/Open    BSD    SYS V
 | |
|         cbreak                                  Y       Y       Y
 | |
|         nocbreak                                Y       Y       Y
 | |
|         echo                                    Y       Y       Y
 | |
|         noecho                                  Y       Y       Y
 | |
|         halfdelay                               Y       -       Y
 | |
|         intrflush                               Y       -       Y
 | |
|         keypad                                  Y       -       Y
 | |
|         meta                                    Y       -       Y
 | |
|         nl                                      Y       Y       Y
 | |
|         nonl                                    Y       Y       Y
 | |
|         nodelay                                 Y       -       Y
 | |
|         notimeout                               Y       -       Y
 | |
|         raw                                     Y       Y       Y
 | |
|         noraw                                   Y       Y       Y
 | |
|         noqiflush                               Y       -       Y
 | |
|         qiflush                                 Y       -       Y
 | |
|         timeout                                 Y       -       Y
 | |
|         wtimeout                                Y       -       Y
 | |
|         typeahead                               Y       -       Y
 | |
|         crmode                                  -
 | |
|         nocrmode                                -
 | |
| 
 | |
| **man-end****************************************************************/
 | |
| 
 | |
| int cbreak(void)
 | |
| {
 | |
|     PDC_LOG(("cbreak() - called\n"));
 | |
| 
 | |
|     SP->cbreak = TRUE;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int nocbreak(void)
 | |
| {
 | |
|     PDC_LOG(("nocbreak() - called\n"));
 | |
| 
 | |
|     SP->cbreak = FALSE;
 | |
|     SP->delaytenths = 0;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int echo(void)
 | |
| {
 | |
|     PDC_LOG(("echo() - called\n"));
 | |
| 
 | |
|     SP->echo = TRUE;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int noecho(void)
 | |
| {
 | |
|     PDC_LOG(("noecho() - called\n"));
 | |
| 
 | |
|     SP->echo = FALSE;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int halfdelay(int tenths)
 | |
| {
 | |
|     PDC_LOG(("halfdelay() - called\n"));
 | |
| 
 | |
|     if (tenths < 1 || tenths > 255)
 | |
|         return ERR;
 | |
| 
 | |
|     SP->delaytenths = tenths;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int intrflush(WINDOW *win, bool bf)
 | |
| {
 | |
|     PDC_LOG(("intrflush() - called\n"));
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int keypad(WINDOW *win, bool bf)
 | |
| {
 | |
|     PDC_LOG(("keypad() - called\n"));
 | |
| 
 | |
|     if (!win)
 | |
|         return ERR;
 | |
| 
 | |
|     win->_use_keypad = bf;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int meta(WINDOW *win, bool bf)
 | |
| {
 | |
|     PDC_LOG(("meta() - called\n"));
 | |
| 
 | |
|     SP->raw_inp = bf;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int nl(void)
 | |
| {
 | |
|     PDC_LOG(("nl() - called\n"));
 | |
| 
 | |
|     SP->autocr = TRUE;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int nonl(void)
 | |
| {
 | |
|     PDC_LOG(("nonl() - called\n"));
 | |
| 
 | |
|     SP->autocr = FALSE;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int nodelay(WINDOW *win, bool flag)
 | |
| {
 | |
|     PDC_LOG(("nodelay() - called\n"));
 | |
| 
 | |
|     if (!win)
 | |
|         return ERR;
 | |
| 
 | |
|     win->_nodelay = flag;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int notimeout(WINDOW *win, bool flag)
 | |
| {
 | |
|     PDC_LOG(("notimeout() - called\n"));
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int raw(void)
 | |
| {
 | |
|     PDC_LOG(("raw() - called\n"));
 | |
| 
 | |
|     PDC_set_keyboard_binary(TRUE);
 | |
|     SP->raw_inp = TRUE;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| int noraw(void)
 | |
| {
 | |
|     PDC_LOG(("noraw() - called\n"));
 | |
| 
 | |
|     PDC_set_keyboard_binary(FALSE);
 | |
|     SP->raw_inp = FALSE;
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| void noqiflush(void)
 | |
| {
 | |
|     PDC_LOG(("noqiflush() - called\n"));
 | |
| }
 | |
| 
 | |
| void qiflush(void)
 | |
| {
 | |
|     PDC_LOG(("qiflush() - called\n"));
 | |
| }
 | |
| 
 | |
| int typeahead(int fildes)
 | |
| {
 | |
|     PDC_LOG(("typeahead() - called\n"));
 | |
| 
 | |
|     return OK;
 | |
| }
 | |
| 
 | |
| void wtimeout(WINDOW *win, int delay)
 | |
| {
 | |
|     PDC_LOG(("wtimeout() - called\n"));
 | |
| 
 | |
|     if (!win)
 | |
|         return;
 | |
| 
 | |
|     if (delay < 0)
 | |
|     {
 | |
|         /* This causes a blocking read on the window, so turn on delay
 | |
|            mode */
 | |
| 
 | |
|         win->_nodelay = FALSE;
 | |
|         win->_delayms = 0;
 | |
|     }
 | |
|     else if (!delay)
 | |
|     {
 | |
|         /* This causes a non-blocking read on the window, so turn off
 | |
|            delay mode */
 | |
| 
 | |
|         win->_nodelay = TRUE;
 | |
|         win->_delayms = 0;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         /* This causes the read on the window to delay for the number of
 | |
|            milliseconds. Also forces the window into non-blocking read
 | |
|            mode */
 | |
| 
 | |
|         /*win->_nodelay = TRUE;*/
 | |
|         win->_delayms = delay;
 | |
|     }
 | |
| }
 | |
| 
 | |
| void timeout(int delay)
 | |
| {
 | |
|     PDC_LOG(("timeout() - called\n"));
 | |
| 
 | |
|     wtimeout(stdscr, delay);
 | |
| }
 | |
| 
 | |
| int crmode(void)
 | |
| {
 | |
|     PDC_LOG(("crmode() - called\n"));
 | |
| 
 | |
|     return cbreak();
 | |
| }
 | |
| 
 | |
| int nocrmode(void)
 | |
| {
 | |
|     PDC_LOG(("nocrmode() - called\n"));
 | |
| 
 | |
|     return nocbreak();
 | |
| }
 |