[NTVDM]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Fri, 17 Apr 2015 03:11:18 +0000 (03:11 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Fri, 17 Apr 2015 03:11:18 +0000 (03:11 +0000)
Fix several mouse range-related issues.

svn path=/trunk/; revision=67220

reactos/subsystems/mvdm/ntvdm/dos/mouse32.c

index 0cbaec7..a6a6ae2 100644 (file)
@@ -42,11 +42,19 @@ extern VOID WINAPI BiosMouseIrq(LPWORD Stack);
 
 static VOID PaintMouseCursor(VOID)
 {
+    COORD Position = DriverState.Position;
+
+    /* Apply the clipping rectangle */
+    if (Position.X < DriverState.MinX) Position.X = DriverState.MinX;
+    if (Position.X > DriverState.MaxX) Position.X = DriverState.MaxX;
+    if (Position.Y < DriverState.MinY) Position.Y = DriverState.MinY;
+    if (Position.Y > DriverState.MaxY) Position.Y = DriverState.MaxY;
+
     if (Bda->VideoMode <= 3)
     {
         WORD Character;
-        WORD CellX = DriverState.Position.X / 8;
-        WORD CellY = DriverState.Position.Y / 8;
+        WORD CellX = Position.X / 8;
+        WORD CellY = Position.Y / 8;
         DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Bda->VideoPage * Bda->VideoPageSize);
 
         EmulatorReadMemory(&EmulatorContext,
@@ -74,10 +82,18 @@ static VOID PaintMouseCursor(VOID)
 
 static VOID EraseMouseCursor(VOID)
 {
+    COORD Position = DriverState.Position;
+
+    /* Apply the clipping rectangle */
+    if (Position.X < DriverState.MinX) Position.X = DriverState.MinX;
+    if (Position.X > DriverState.MaxX) Position.X = DriverState.MaxX;
+    if (Position.Y < DriverState.MinY) Position.Y = DriverState.MinY;
+    if (Position.Y > DriverState.MaxY) Position.Y = DriverState.MaxY;
+
     if (Bda->VideoMode <= 3)
     {
-        WORD CellX = DriverState.Position.X / 8;
-        WORD CellY = DriverState.Position.Y / 8;
+        WORD CellX = Position.X / 8;
+        WORD CellY = Position.Y / 8;
         DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Bda->VideoPage * Bda->VideoPageSize);
 
         EmulatorWriteMemory(&EmulatorContext,
@@ -121,8 +137,8 @@ static VOID FromMouseCoordinates(PCOORD Position)
         Resolution.Y *= 8;
     }
 
-    Position->X = (((Position->X - DriverState.MinX) * Resolution.X) / Width);
-    Position->Y = (((Position->Y - DriverState.MinY) * Resolution.Y) / Height);
+    Position->X = ((Position->X - DriverState.MinX) * Resolution.X) / Width;
+    Position->Y = ((Position->Y - DriverState.MinY) * Resolution.Y) / Height;
 }
 
 static VOID CallMouseUserHandlers(USHORT CallMask)
@@ -231,13 +247,6 @@ static inline VOID DosUpdatePosition(PCOORD NewPosition)
 
     if (DriverState.ShowCount > 0) EraseMouseCursor();
     DriverState.Position = *NewPosition;
-
-    /* Apply the clipping rectangle */
-    if (DriverState.Position.X < DriverState.MinX) DriverState.Position.X = DriverState.MinX;
-    if (DriverState.Position.X > DriverState.MaxX) DriverState.Position.X = DriverState.MaxX;
-    if (DriverState.Position.Y < DriverState.MinY) DriverState.Position.Y = DriverState.MinY;
-    if (DriverState.Position.Y > DriverState.MaxY) DriverState.Position.Y = DriverState.MaxY;
-
     if (DriverState.ShowCount > 0) PaintMouseCursor();
 
     /* Call the mouse handlers */
@@ -494,18 +503,38 @@ static VOID WINAPI DosMouseService(LPWORD Stack)
         /* Define Horizontal Cursor Range */
         case 0x07:
         {
-            DPRINT("Setting mouse horizontal range: %u - %u\n", getCX(), getDX());
-            DriverState.MinX = getCX();
-            DriverState.MaxX = getDX();
+            WORD Min = getCX();
+            WORD Max = getDX();
+
+            if (!VgaGetDoubleVisionState(NULL, NULL))
+            {
+                /* Text mode */
+                Min &= ~0x07;
+                Max |= 0x07;
+            }
+
+            DPRINT("Setting mouse horizontal range: %u - %u\n", Min, Max);
+            DriverState.MinX = Min;
+            DriverState.MaxX = Max;
             break;
         }
 
         /* Define Vertical Cursor Range */
         case 0x08:
         {
-            DPRINT("Setting mouse vertical range: %u - %u\n", getCX(), getDX());
-            DriverState.MinY = getCX();
-            DriverState.MaxY = getDX();
+            WORD Min = getCX();
+            WORD Max = getDX();
+
+            if (!VgaGetDoubleVisionState(NULL, NULL))
+            {
+                /* Text mode */
+                Min &= ~0x07;
+                Max |= 0x07;
+            }
+
+            DPRINT("Setting mouse vertical range: %u - %u\n", Min, Max);
+            DriverState.MinY = Min;
+            DriverState.MaxY = Max;
             break;
         }