Esempio n. 1
0
int curs_kbhit(void)
{
	struct timeval timeout;
	fd_set	rfds;

	if(curs_nextgetch)
		return(1);
	if(mouse_trywait())
		return(1);
	timeout.tv_sec=0;
	timeout.tv_usec=0;
	FD_ZERO(&rfds);
	FD_SET(fileno(stdin),&rfds);

	return(select(fileno(stdin)+1,&rfds,NULL,NULL,&timeout));
}
Esempio n. 2
0
static int win32_keyboardio(int isgetch)
{
    INPUT_RECORD input;
    DWORD num=0;
    HANDLE h;
    static WORD lastch;

    if((h=GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE)
        return(0);

    while(1) {
        if(lastch) {
            if(isgetch) {
                BYTE ch;
                ch=lastch&0xff;
                lastch>>=8;
                return(ch);
            }
            else
                return(TRUE);
        }

        while(1) {
            GetNumberOfConsoleInputEvents(h, &num);
            if(num)
                break;
            if(mouse_trywait()) {
                lastch=CIO_KEY_MOUSE;
                break;
            }
            if(isgetch)
                SLEEP(1);
            else
                return(FALSE);
        }

        if(lastch)
            continue;

        if(!ReadConsoleInput(h, &input, 1, &num)
                || !num || (input.EventType!=KEY_EVENT && input.EventType!=MOUSE_EVENT))
            continue;

        switch(input.EventType) {
        case KEY_EVENT:

#ifdef DEBUG_KEY_EVENTS
            dprintf("KEY_EVENT: KeyDown=%u"
                    ,input.Event.KeyEvent.bKeyDown);
            dprintf("           RepeatCount=%u"
                    ,input.Event.KeyEvent.wRepeatCount);
            dprintf("           VirtualKeyCode=0x%04hX"
                    ,input.Event.KeyEvent.wVirtualKeyCode);
            dprintf("           VirtualScanCode=0x%04hX"
                    ,input.Event.KeyEvent.wVirtualScanCode);
            dprintf("           uChar.AsciiChar=0x%02X (%u)"
                    ,(BYTE)input.Event.KeyEvent.uChar.AsciiChar
                    ,(BYTE)input.Event.KeyEvent.uChar.AsciiChar);
            dprintf("           ControlKeyState=0x%08lX"
                    ,input.Event.KeyEvent.dwControlKeyState);
#endif

            if(input.Event.KeyEvent.bKeyDown) {
                /* Is this an AltGr key? */
                if(((input.Event.KeyEvent.dwControlKeyState & (RIGHT_ALT_PRESSED|LEFT_CTRL_PRESSED)) == (RIGHT_ALT_PRESSED|LEFT_CTRL_PRESSED))
                        && (BYTE)input.Event.KeyEvent.uChar.AsciiChar) {
                    lastch=(BYTE)input.Event.KeyEvent.uChar.AsciiChar;
                }
                /* Is this a modified char? */
                else if((input.Event.KeyEvent.dwControlKeyState & (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED|RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED|ENHANCED_KEY))
                        || (input.Event.KeyEvent.wVirtualKeyCode >= VK_F1 && input.Event.KeyEvent.wVirtualKeyCode <= VK_F24)
                        || !input.Event.KeyEvent.uChar.AsciiChar) {
                    lastch=win32_getchcode(input.Event.KeyEvent.wVirtualKeyCode, input.Event.KeyEvent.dwControlKeyState);
                }
                /* Must be a normal char then! */
                else {
                    lastch=(BYTE)input.Event.KeyEvent.uChar.AsciiChar;
                }
            } else if(input.Event.KeyEvent.wVirtualKeyCode == VK_MENU)
                lastch=(BYTE)input.Event.KeyEvent.uChar.AsciiChar;

            break;
        case MOUSE_EVENT:
            if(domouse) {
                if(input.Event.MouseEvent.dwMousePosition.X+1 != LastX || input.Event.MouseEvent.dwMousePosition.Y+1 != LastY) {
                    LastX=input.Event.MouseEvent.dwMousePosition.X+1;
                    LastY=input.Event.MouseEvent.dwMousePosition.Y+1;
                    ciomouse_gotevent(CIOLIB_MOUSE_MOVE,LastX,LastY);
                }
                if(last_state != input.Event.MouseEvent.dwButtonState) {
                    switch(input.Event.MouseEvent.dwButtonState ^ last_state) {
                    case FROM_LEFT_1ST_BUTTON_PRESSED:
                        if(input.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)
                            ciomouse_gotevent(CIOLIB_BUTTON_1_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1);
                        else
                            ciomouse_gotevent(CIOLIB_BUTTON_1_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1);
                        break;
                    case FROM_LEFT_2ND_BUTTON_PRESSED:
                        if(input.Event.MouseEvent.dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED)
                            ciomouse_gotevent(CIOLIB_BUTTON_2_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1);
                        else
                            ciomouse_gotevent(CIOLIB_BUTTON_2_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1);
                        break;
                    case RIGHTMOST_BUTTON_PRESSED:
                        if(input.Event.MouseEvent.dwButtonState & RIGHTMOST_BUTTON_PRESSED)
                            ciomouse_gotevent(CIOLIB_BUTTON_3_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1);
                        else
                            ciomouse_gotevent(CIOLIB_BUTTON_3_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1);
                        break;
                    }
                    last_state=input.Event.MouseEvent.dwButtonState;
                }
            }
        }
    }