Sync with trunk r64222.
[reactos.git] / subsystems / ntvdm / hardware / mouse.c
index 63399d9..9c5c84e 100644 (file)
@@ -13,6 +13,9 @@
 #include "mouse.h"
 #include "ps2.h"
 
+// HACK: For the PS/2 bypass and MOUSE.COM driver direct call
+#include "dos/mouse32.h"
+
 /* PRIVATE VARIABLES **********************************************************/
 
 static MOUSE_MODE Mode, PreviousMode;
@@ -28,6 +31,8 @@ static SHORT HorzCounter;
 static SHORT VertCounter;
 static CHAR ScrollCounter;
 
+static BYTE PS2Port = 1;
+
 /* PRIVATE FUNCTIONS **********************************************************/
 
 static VOID MouseResetConfig(VOID)
@@ -56,8 +61,8 @@ static VOID MouseReset(VOID)
     MouseId = 0;
 
     /* Send the Basic Assurance Test success code and the device ID */
-    KeyboardQueuePush(MOUSE_BAT_SUCCESS);
-    KeyboardQueuePush(MouseId);
+    PS2QueuePush(PS2Port, MOUSE_BAT_SUCCESS);
+    PS2QueuePush(PS2Port, MouseId);
 }
 
 #if 0
@@ -116,34 +121,32 @@ static VOID MouseGetPacket(PMOUSE_PACKET Packet)
 }
 #endif
 
-/* PUBLIC FUNCTIONS ***********************************************************/
-
-VOID MouseUpdatePosition(PCOORD NewPosition)
+/*static*/ VOID MouseUpdatePosition(PCOORD NewPosition)
 {
     /* Update the counters */
-    HorzCounter += ((NewPosition->X - Position.X) * WidthMm * Resolution) / WidthPixels;
+    HorzCounter += ((NewPosition->X - Position.X) * WidthMm  * Resolution) / WidthPixels;
     VertCounter += ((NewPosition->Y - Position.Y) * HeightMm * Resolution) / HeightPixels;
 
     /* Update the position */
     Position = *NewPosition;
 }
 
-VOID MouseUpdateButtons(ULONG NewButtonState)
+/*static*/ VOID MouseUpdateButtons(ULONG NewButtonState)
 {
     ButtonState = NewButtonState;
 }
 
-VOID MouseScroll(LONG Direction)
+/*static*/ VOID MouseScroll(LONG Direction)
 {
     ScrollCounter += Direction;
 }
 
-COORD MouseGetPosition(VOID)
+/*static*/ COORD MouseGetPosition(VOID)
 {
     return Position;
 }
 
-VOID MouseCommand(BYTE Command)
+static VOID WINAPI MouseCommand(LPVOID Param, BYTE Command)
 {
     switch (Command)
     {
@@ -151,7 +154,7 @@ VOID MouseCommand(BYTE Command)
         case 0xE6:
         {
             Scaling = FALSE;
-            KeyboardQueuePush(MOUSE_ACK);
+            PS2QueuePush(PS2Port, MOUSE_ACK);
             break;
         }
 
@@ -159,7 +162,7 @@ VOID MouseCommand(BYTE Command)
         case 0xE7:
         {
             Scaling = TRUE;
-            KeyboardQueuePush(MOUSE_ACK);
+            PS2QueuePush(PS2Port, MOUSE_ACK);
             break;
         }
 
@@ -185,7 +188,7 @@ VOID MouseCommand(BYTE Command)
             MouseResetCounters();
             Mode = MOUSE_STREAMING_MODE;
 
-            KeyboardQueuePush(MOUSE_ACK);
+            PS2QueuePush(PS2Port, MOUSE_ACK);
             break;
         }
 
@@ -205,9 +208,9 @@ VOID MouseCommand(BYTE Command)
                 /* Restore the previous mode */
                 MouseResetCounters();
                 Mode = PreviousMode;
-                KeyboardQueuePush(MOUSE_ACK);
+                PS2QueuePush(PS2Port, MOUSE_ACK);
             }
-            else KeyboardQueuePush(MOUSE_ERROR);
+            else PS2QueuePush(PS2Port, MOUSE_ERROR);
 
             break;
         }
@@ -224,7 +227,7 @@ VOID MouseCommand(BYTE Command)
             MouseResetCounters();
             Mode = MOUSE_WRAP_MODE;
 
-            KeyboardQueuePush(MOUSE_ACK);
+            PS2QueuePush(PS2Port, MOUSE_ACK);
             break;
         }
 
@@ -234,15 +237,15 @@ VOID MouseCommand(BYTE Command)
             MouseResetCounters();
             Mode = MOUSE_REMOTE_MODE;
 
-            KeyboardQueuePush(MOUSE_ACK);
+            PS2QueuePush(PS2Port, MOUSE_ACK);
             break;
         }
 
         /* Get Mouse ID */
         case 0xF2:
         {
-            KeyboardQueuePush(MOUSE_ACK);
-            KeyboardQueuePush(MouseId);
+            PS2QueuePush(PS2Port, MOUSE_ACK);
+            PS2QueuePush(PS2Port, MouseId);
             break;
         }
 
@@ -258,7 +261,7 @@ VOID MouseCommand(BYTE Command)
         case 0xF4:
         {
             Reporting = TRUE;
-            KeyboardQueuePush(MOUSE_ACK);
+            PS2QueuePush(PS2Port, MOUSE_ACK);
             break;
         }
 
@@ -266,7 +269,7 @@ VOID MouseCommand(BYTE Command)
         case 0xF5:
         {
             Reporting = FALSE;
-            KeyboardQueuePush(MOUSE_ACK);
+            PS2QueuePush(PS2Port, MOUSE_ACK);
             break;
         }
 
@@ -297,12 +300,26 @@ VOID MouseCommand(BYTE Command)
         /* Unknown command */
         default:
         {
-            KeyboardQueuePush(MOUSE_ERROR);
+            PS2QueuePush(PS2Port, MOUSE_ERROR);
         }
     }
 }
 
-BOOLEAN MouseInit(VOID)
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+VOID MouseEventHandler(PMOUSE_EVENT_RECORD MouseEvent)
+{
+    // FIXME: Sync our private data
+
+    // HACK: Bypass PS/2 and instead, notify the MOUSE.COM driver directly
+    MouseBiosUpdatePosition(&MouseEvent->dwMousePosition);
+    MouseBiosUpdateButtons(LOWORD(MouseEvent->dwButtonState));
+
+    // PS2QueuePush(PS2Port, Data);
+    // PicInterruptRequest(12);
+}
+
+BOOLEAN MouseInit(BYTE PS2Connector)
 {
     HWND hWnd;
     HDC hDC;
@@ -324,6 +341,10 @@ BOOLEAN MouseInit(VOID)
     /* Release the device context */
     ReleaseDC(hWnd, hDC);
 
+    /* Finish to plug the mouse to the specified PS/2 port */
+    PS2Port = PS2Connector;
+    PS2SetDeviceCmdProc(PS2Port, NULL, MouseCommand);
+
     MouseReset();
     return TRUE;
 }