|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.