[NTVDM]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 13 Sep 2014 15:32:07 +0000 (15:32 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 13 Sep 2014 15:32:07 +0000 (15:32 +0000)
Implement mouse buttons and cursor positioning.

svn path=/trunk/; revision=64133

reactos/subsystems/ntvdm/bios/bios32/moubios32.c
reactos/subsystems/ntvdm/bios/bios32/moubios32.h
reactos/subsystems/ntvdm/hardware/ps2.c

index 5a7b62e..f1a12a4 100644 (file)
@@ -151,6 +151,63 @@ static VOID WINAPI BiosMouseService(LPWORD Stack)
             break;
         }
 
+        /* Return Position And Button Status */
+        case 0x03:
+        {
+            setBX(DriverState.ButtonState);
+            setCX(DriverState.Position.X);
+            setDX(DriverState.Position.Y);
+
+            break;
+        }
+
+        /* Position Mouse Cursor */
+        case 0x04:
+        {
+            POINT Point;
+
+            Point.x = getCX();
+            Point.y = getDX();
+
+            ClientToScreen(GetConsoleWindow(), &Point);
+            SetCursorPos(Point.x, Point.y);
+
+            break;
+        }
+
+        /* Return Button Press Data */
+        case 0x05:
+        {
+            WORD Button = getBX();
+
+            setAX(DriverState.ButtonState);
+            setBX(DriverState.PressCount[Button]);
+            setCX(DriverState.LastPress[Button].X);
+            setDX(DriverState.LastPress[Button].Y);
+
+            /* Reset the counter */
+            DriverState.PressCount[Button] = 0;
+
+            break;
+        }
+
+        /* Return Button Release Data */
+        case 0x06:
+        {
+            WORD Button = getBX();
+
+            setAX(DriverState.ButtonState);
+            setBX(DriverState.ReleaseCount[Button]);
+            setCX(DriverState.LastRelease[Button].X);
+            setDX(DriverState.LastRelease[Button].Y);
+
+            /* Reset the counter */
+            DriverState.ReleaseCount[Button] = 0;
+
+            break;
+
+        }
+
         /* Define Graphics Cursor */
         case 0x09:
         {
@@ -203,6 +260,9 @@ static VOID WINAPI BiosMouseService(LPWORD Stack)
         /* Disable Mouse Driver */
         case 0x1F:
         {
+            setES(0x0000);
+            setBX(0x0000);
+
             DriverEnabled = FALSE;
             break;
         }
@@ -233,6 +293,34 @@ VOID MouseBiosUpdatePosition(PCOORD NewPosition)
     }
 }
 
+VOID MouseBiosUpdateButtons(WORD ButtonState)
+{
+    WORD i;
+
+    if (!DriverEnabled) return;
+
+    for (i = 0; i < NUM_MOUSE_BUTTONS; i++)
+    {
+        BOOLEAN OldState = (DriverState.ButtonState >> i) & 1;
+        BOOLEAN NewState = (ButtonState >> i) & 1;
+
+        if (NewState > OldState)
+        {
+            /* Mouse press */
+            DriverState.PressCount[i]++;
+            DriverState.LastPress[i] = DriverState.Position;
+        }
+        else if (NewState < OldState)
+        {
+            /* Mouse release */
+            DriverState.ReleaseCount[i]++;
+            DriverState.LastRelease[i] = DriverState.Position;
+        }
+    }
+
+    DriverState.ButtonState = ButtonState;
+}
+
 BOOLEAN MouseBios32Initialize(VOID)
 {
     /* Clear the state */
index f5aa951..89a943d 100644 (file)
 
 #define BIOS_MOUSE_INTERRUPT 0x33
 
+enum
+{
+    MOUSE_BUTTON_LEFT,
+    MOUSE_BUTTON_RIGHT,
+    MOUSE_BUTTON_MIDDLE,
+    NUM_MOUSE_BUTTONS
+};
+
 typedef struct _MOUSE_DRIVER_STATE
 {
     SHORT ShowCount;
     COORD Position;
     WORD Character;
+    WORD ButtonState;
+    WORD PressCount[NUM_MOUSE_BUTTONS];
+    COORD LastPress[NUM_MOUSE_BUTTONS];
+    WORD ReleaseCount[NUM_MOUSE_BUTTONS];
+    COORD LastRelease[NUM_MOUSE_BUTTONS];
 
     struct
     {
@@ -40,6 +53,7 @@ typedef struct _MOUSE_DRIVER_STATE
 /* FUNCTIONS ******************************************************************/
 
 VOID MouseBiosUpdatePosition(PCOORD NewPosition);
+VOID MouseBiosUpdateButtons(WORD ButtonStatus);
 BOOLEAN MouseBios32Initialize(VOID);
 VOID MouseBios32Cleanup(VOID);
 
index 7c1ed6d..0937ffc 100644 (file)
@@ -310,6 +310,7 @@ VOID PS2Dispatch(PINPUT_RECORD InputRecord)
         {
             /* Notify the BIOS driver */
             MouseBiosUpdatePosition(&InputRecord->Event.MouseEvent.dwMousePosition);
+            MouseBiosUpdateButtons(LOWORD(InputRecord->Event.MouseEvent.dwButtonState));
 
             // TODO: PS/2, other stuff