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)); }
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; } } } }