diff --git a/src/conio/win32cio.c b/src/conio/win32cio.c index 512fa1146d332287a7142d8a4157bec287e0c2c6..8125e64ec04f40102f8d477589106ac68a1555b9 100644 --- a/src/conio/win32cio.c +++ b/src/conio/win32cio.c @@ -71,6 +71,7 @@ const struct vid_mode vid_modes[VID_MODES]={ static int lastch=0; static int domouse=1; static DWORD last_state=0; +static int LastX=-1, LastY=-1; static int xpos=1; static int ypos=1; @@ -133,15 +134,17 @@ int win32_kbhit(void) while(1) { if(mouse_pending()) return(1); - if(!PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &input, 1, &num) + if(!GetNumberOfConsoleInputEvents(GetStdHandle(STD_INPUT_HANDLE), &num) || !num) return(0); if(input.EventType==KEY_EVENT && input.Event.KeyEvent.bKeyDown) return(1); if(domouse) { if(input.EventType==MOUSE_EVENT) { - if(input.Event.MouseEvent.dwEventFlags==MOUSE_MOVED) { - ciomouse_gotevent(CIOLIB_MOUSE_MOVE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1); + 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) { @@ -184,8 +187,11 @@ int win32_getch(void) lastch>>=8; return(ch); } - while(!PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &input, 1, &num) - && !num && !mouse_pending()) { + + while(1) { + GetNumberOfConsoleInputEvents(GetStdHandle(STD_INPUT_HANDLE), &num) + if(num || mouse_pending()) + break; SLEEP(1); } @@ -195,7 +201,7 @@ int win32_getch(void) } if(!ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &input, 1, &num) - || !num || (input.EventType!=KEY_EVENT && input.EventType!=MOUSE_EVENT)) + || !num || (input.EventType!=KEY_EVENT && input.EventType!=MOUSE_EVENT)) continue; switch(input.EventType) { @@ -230,33 +236,33 @@ int win32_getch(void) break; case MOUSE_EVENT: if(domouse) { - if(input.EventType==MOUSE_EVENT) { - if(input.Event.MouseEvent.dwEventFlags==MOUSE_MOVED) { - ciomouse_gotevent(CIOLIB_MOUSE_MOVE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1); - } - 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; + 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; } } }