Annotation of qemu/roms/ipxe/src/hci/mucurses/kb.c, revision 1.1.1.1

1.1       root        1: #include <curses.h>
                      2: #include <stddef.h>
                      3: #include <unistd.h>
                      4: #include "mucurses.h"
                      5: 
                      6: /** @file
                      7:  *
                      8:  * MuCurses keyboard input handling functions
                      9:  */
                     10: 
                     11: #define INPUT_DELAY            200 // half-blocking delay timer resolution (ms)
                     12: #define INPUT_DELAY_TIMEOUT    1000 // half-blocking delay timeout
                     13: 
                     14: int m_delay; /* 
                     15:                < 0 : blocking read
                     16:                0   : non-blocking read
                     17:                > 0 : timed blocking read
                     18:             */
                     19: bool m_echo;
                     20: bool m_cbreak;
                     21: 
                     22: static int _wgetc ( WINDOW *win ) {
                     23:        int timer, c;
                     24: 
                     25:        if ( win == NULL )
                     26:                return ERR;
                     27: 
                     28:        timer = INPUT_DELAY_TIMEOUT;
                     29:        while ( ! win->scr->peek( win->scr ) ) {
                     30:                if ( m_delay == 0 ) // non-blocking read
                     31:                        return ERR;
                     32:                if ( timer > 0 ) {  // time-limited blocking read
                     33:                        if ( m_delay > 0 )
                     34:                                timer -= INPUT_DELAY;
                     35:                        mdelay( INPUT_DELAY );
                     36:                } else { return ERR; } // non-blocking read
                     37:        }
                     38: 
                     39:        c = win->scr->getc( win->scr );
                     40: 
                     41:        if ( m_echo && ( c >= 32 && c <= 126 ) ) // printable ASCII characters
                     42:                _wputch( win, (chtype) ( c | win->attrs ), WRAP );
                     43: 
                     44:        return c;
                     45: }
                     46: 
                     47: /**
                     48:  * Pop a character from the FIFO into a window
                     49:  *
                     50:  * @v *win     window in which to echo input
                     51:  * @ret c      char from input stream
                     52:  */
                     53: int wgetch ( WINDOW *win ) {
                     54:        int c;
                     55: 
                     56:        c = _wgetc( win );
                     57: 
                     58:        if ( m_echo ) {
                     59:                if ( c >= KEY_MIN ) {
                     60:                        switch(c) {
                     61:                        case KEY_LEFT :
                     62:                        case KEY_BACKSPACE :
                     63:                                _wcursback( win );
                     64:                                wdelch( win );
                     65:                                break;
                     66:                        default :
                     67:                                beep();
                     68:                                break;
                     69:                        }
                     70:                } else {
                     71:                        _wputch( win, (chtype)( c | win->attrs ), WRAP );
                     72:                }
                     73:        }
                     74: 
                     75:        return c;
                     76: }
                     77: 
                     78: /**
                     79:  * Read at most n characters from the FIFO into a window
                     80:  *
                     81:  * @v *win     window in which to echo input
                     82:  * @v *str     pointer to string in which to store result
                     83:  * @v n                maximum number of characters to read into string (inc. NUL)
                     84:  * @ret rc     return status code
                     85:  */
                     86: int wgetnstr ( WINDOW *win, char *str, int n ) {
                     87:        char *_str;
                     88:        int c;
                     89: 
                     90:        if ( n == 0 ) {
                     91:                str = '\0';
                     92:                return OK;
                     93:        }
                     94: 
                     95:        _str = str;
                     96: 
                     97:        while ( ( c = _wgetc( win ) ) != ERR ) {
                     98:                /* termination enforcement - don't let us go past the
                     99:                   end of the allocated buffer... */
                    100:                if ( n == 0 && ( c >= 32 && c <= 126 ) ) {
                    101:                        _wcursback( win );
                    102:                        wdelch( win );
                    103:                } else {
                    104:                        if ( c >= KEY_MIN ) {
                    105:                                switch(c) {
                    106:                                case KEY_LEFT :
                    107:                                case KEY_BACKSPACE :
                    108:                                        _wcursback( win );
                    109:                                        wdelch( win );
                    110:                                        break;
                    111:                                case KEY_ENTER :
                    112:                                        *_str = '\0';
                    113:                                        return OK;
                    114:                                default :
                    115:                                        beep();
                    116:                                        break;
                    117:                                }
                    118:                        }
                    119:                        if ( c >= 32 && c <= 126 ) {
                    120:                                *(_str++) = c; n--;
                    121:                        }
                    122:                }
                    123:        }
                    124: 
                    125:        return ERR;
                    126: }
                    127: 
                    128: 
                    129: /**
                    130:  *
                    131:  */
                    132: int echo ( void ) {
                    133:        m_echo = TRUE;
                    134:        return OK;
                    135: }
                    136: 
                    137: /**
                    138:  *
                    139:  */
                    140: int noecho ( void ) {
                    141:        m_echo = FALSE;
                    142:        return OK;
                    143: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.