Beispiel #1
0
/*
 * 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 */
Beispiel #2
0
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 */
Beispiel #3
0
/*
 * 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 */
Beispiel #4
0
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 */