/* * BIOSKeyboardHit - read the keyboard */ vi_key BIOSGetKeyboard( int *scan ) { INPUT_RECORD ir; DWORD rd, ss; WORD vk; BOOL has_alt, has_shift, has_ctrl, has_capsl; map *ev, what; vi_key key; do { ReadConsoleInput( InputHandle, &ir, 1, &rd ); } while( !eventWeWant( &ir ) ); if( ir.EventType == MOUSE_EVENT ) { return( VI_KEY( MOUSEEVENT ) ); } vk = ir.Event.KeyEvent.wVirtualKeyCode; key = (unsigned char)ir.Event.KeyEvent.uChar.AsciiChar; ss = ir.Event.KeyEvent.dwControlKeyState; has_shift = ((ss & SHIFT_PRESSED) ? TRUE : FALSE); has_ctrl = ((ss & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED)) ? TRUE : FALSE); has_alt = ((ss & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED)) ? TRUE : FALSE); has_capsl = ((ss & CAPSLOCK_ON) ? TRUE : FALSE); what.vk = vk; ev = bsearch( &what, events, sizeof( events ) / sizeof( events[0] ), sizeof( what ), CompareEvents ); if( ev != NULL ) { if( has_ctrl && has_alt ) { // it handles AltGr + key } else if( has_ctrl ) { key = ev->ctrl; } else if( has_alt ) { key = ev->alt; // Caps lock has efect to keys which generate character // don't apply to extended keys as down, up, page down, // page up, insert, end, delete, .... } else if( has_shift ^ ( key && has_capsl ) ) { if( key == 0 ) { key = ev->shift; } } else { if( key == 0 ) { key = ev->reg; } } } if( key == 0 ) { // ignore unknown keys key = VI_KEY( DUMMY ); } if( scan != NULL ) { *scan = 0; } return( key ); } /* BIOSGetKeyboard */
EVENT intern getanyevent( void ) { INPUT_RECORD ir; DWORD rd,ss; WORD vk; EVENT ascii; BOOL has_alt, has_shift, has_ctrl; map *ev,what; EVENT evnt; for( ;; ) { PeekConsoleInput( InputHandle, &ir, 1, &rd ); if( rd == 0 ) return( EV_NO_EVENT ); ReadConsoleInput( InputHandle, &ir, 1, &rd ); if( eventWeWant( &ir ) ) { if( ir.EventType != MOUSE_EVENT ) break; evnt = mouseevent(); if( evnt > EV_NO_EVENT ) return( evnt ); } } vk = ir.Event.KeyEvent.wVirtualKeyCode; ascii = ir.Event.KeyEvent.uChar.AsciiChar; ss = ir.Event.KeyEvent.dwControlKeyState; has_shift = ss & SHIFT_PRESSED; has_ctrl = ss & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED); has_alt = ss & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED); setshiftstate( has_shift, has_ctrl, has_alt ); what.vk = vk; ev = bsearch( &what, events, sizeof( events )/sizeof( map ), sizeof( what ), CompareEvents ); if( ev != NULL ) { if( has_shift ) { ascii = ev->shift; } else if( has_ctrl ) { ascii = ev->ctrl; } else if( has_alt ) { ascii = ev->alt; } else { ascii = ev->reg; } } else if( ascii == 0 ) { ascii = EV_NO_EVENT; } if( ascii > EV_NO_EVENT ) { uihidemouse(); } return( ascii ); } /* getanyevent */
/* * BIOSKeyboardHit - test if a key is waiting */ bool BIOSKeyboardHit( void ) { DWORD rd; INPUT_RECORD ir; bool rc; for( ;; ) { PeekConsoleInput( InputHandle, &ir, 1, &rd ); if( rd == 0 ) { rc = FALSE; break; } if( eventWeWant( &ir ) ) { rc = TRUE; break; } ReadConsoleInput( InputHandle, &ir, 1, &rd ); } return( rc ); } /* BIOSKeyboardHit */
void intern waitforevent( void ) { DWORD rd; INPUT_RECORD ir; while( 1 ) { while( 1 ) { PeekConsoleInput( InputHandle, &ir, 1, &rd ); if( rd > 0 ) { if( eventWeWant( &ir ) ) { return; } ReadConsoleInput( InputHandle, &ir, 1, &rd ); } else { break; } } WaitForSingleObject( InputHandle, -1 ); } } /* waitforevent */