I forgot to remove debug code in MouseGDICallBack.
[reactos.git] / reactos / subsys / win32k / eng / mouse.c
index e3499c7..9e2c00e 100644 (file)
@@ -1,6 +1,6 @@
 /*
- *  ReactOS kernel
- *  Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
+ *  ReactOS W32 Subsystem
+ *  Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: mouse.c,v 1.16 2003/01/24 23:25:34 ei Exp $
+/* $Id: mouse.c,v 1.25 2003/05/18 19:30:55 ea Exp $
  *
  * PROJECT:          ReactOS kernel
  * PURPOSE:          Mouse
 
 #include <windows.h>
 #include <ddk/ntddk.h>
+#include <ddk/ntddmou.h>
 #include <win32k/dc.h>
-#include "../../drivers/input/include/mouse.h"
 #include "objects.h"
 #include "include/msgqueue.h"
+#include "include/object.h"
+#include "include/winsta.h"
+#include <include/mouse.h>
+
+#define NDEBUG
+#include <debug.h>
 
 /* GLOBALS *******************************************************************/
 
@@ -41,9 +47,61 @@ static BOOLEAN SafetySwitch2 = FALSE;
 static BOOLEAN MouseEnabled = FALSE;
 static LONG mouse_x, mouse_y;
 static UINT mouse_width = 0, mouse_height = 0;
+static ULONG PointerStatus;
 
 static UCHAR DefaultCursor[256] = {
+  0x3F, 0xFF, 0xFF, 0xFF,
+  0x1F, 0xFF, 0xFF, 0xFF,
+  0x0F, 0xFF, 0xFF, 0xFF,
+  0x07, 0xFF, 0xFF, 0xFF,
+  0x03, 0xFF, 0xFF, 0xFF,
+  0x01, 0xFF, 0xFF, 0xFF,
+  0x00, 0xFF, 0xFF, 0xFF,
+  0x00, 0x7F, 0xFF, 0xFF,
+  0x00, 0x3F, 0xFF, 0xFF,
+  0x00, 0x1F, 0xFF, 0xFF,
+  0x00, 0x0F, 0xFF, 0xFF,
+  0x00, 0xFF, 0xFF, 0xFF,
+  0x00, 0xFF, 0xFF, 0xFF,
+  0x18, 0x7F, 0xFF, 0xFF,
+  0x38, 0x7F, 0xFF, 0xFF,
+  0x7C, 0x3F, 0xFF, 0xFF,
+  0xFC, 0x3F, 0xFF, 0xFF,
+  0xFE, 0x1F, 0xFF, 0xFF,
+  0xFE, 0x1F, 0xFF, 0xFF,
+  0xFF, 0x3F, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF,
+
   0x00, 0x00, 0x00, 0x00,
+  0x40, 0x00, 0x00, 0x00,
+  0x60, 0x00, 0x00, 0x00,
+  0x70, 0x00, 0x00, 0x00,
+  0x78, 0x00, 0x00, 0x00,
+  0x7C, 0x00, 0x00, 0x00,
+  0x7E, 0x00, 0x00, 0x00,
+  0x7F, 0x00, 0x00, 0x00,
+  0x7F, 0x80, 0x00, 0x00,
+  0x7F, 0xC0, 0x00, 0x00,
+  0x7E, 0x00, 0x00, 0x00,
+  0x76, 0x00, 0x00, 0x00,
+  0x76, 0x00, 0x00, 0x00,
+  0x43, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00,
+  0x01, 0x80, 0x00, 0x00,
+  0x01, 0x80, 0x00, 0x00,
+  0x00, 0xC0, 0x00, 0x00,
+  0x00, 0xC0, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00,
@@ -56,62 +114,11 @@ static UCHAR DefaultCursor[256] = {
   0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00,
-  0x00, 0xC0, 0x00, 0x00,
-  0x00, 0xC0, 0x00, 0x00,
-  0x01, 0x80, 0x00, 0x00,
-  0x01, 0x80, 0x00, 0x00,
-  0x03, 0x00, 0x00, 0x00,
-  0x43, 0x00, 0x00, 0x00,
-  0x66, 0x00, 0x00, 0x00,
-  0x76, 0x00, 0x00, 0x00,
-  0x7E, 0x00, 0x00, 0x00,
-  0x7F, 0xC0, 0x00, 0x00,
-  0x7F, 0x80, 0x00, 0x00,
-  0x7F, 0x00, 0x00, 0x00,
-  0x7E, 0x00, 0x00, 0x00,
-  0x7C, 0x00, 0x00, 0x00,
-  0x78, 0x00, 0x00, 0x00,
-  0x70, 0x00, 0x00, 0x00,
-  0x60, 0x00, 0x00, 0x00,
-  0x40, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00,
-
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0x3F, 0xFF, 0xFF,
-  0xFE, 0x1F, 0xFF, 0xFF,
-  0xFE, 0x1F, 0xFF, 0xFF,
-  0xFC, 0x3F, 0xFF, 0xFF,
-  0x7C, 0x3F, 0xFF, 0xFF,
-  0x38, 0x7F, 0xFF, 0xFF,
-  0x18, 0x7F, 0xFF, 0xFF,
-  0x00, 0xFF, 0xFF, 0xFF,
-  0x00, 0xFF, 0xFF, 0xFF,
-  0x00, 0x0F, 0xFF, 0xFF,
-  0x00, 0x1F, 0xFF, 0xFF,
-  0x00, 0x3F, 0xFF, 0xFF,
-  0x00, 0x7F, 0xFF, 0xFF,
-  0x00, 0xFF, 0xFF, 0xFF,
-  0x01, 0xFF, 0xFF, 0xFF,
-  0x03, 0xFF, 0xFF, 0xFF,
-  0x07, 0xFF, 0xFF, 0xFF,
-  0x0F, 0xFF, 0xFF, 0xFF,
-  0x1F, 0xFF, 0xFF, 0xFF,
-  0x3F, 0xFF, 0xFF, 0xFF};
+  0x00, 0x00, 0x00, 0x00};
 
 /* FUNCTIONS *****************************************************************/
 
-INT
+INT STDCALL
 MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
                       LONG HazardY1, LONG HazardX2, LONG HazardY2)
 /*
@@ -122,6 +129,10 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
   RECTL MouseRect;
   LONG tmp;
 
+
+  /* Mouse is not allowed to move if GDI is busy drawing */
+  SafetySwitch2 = TRUE;
+
   if (SurfObj == NULL)
     {
       return(FALSE);
@@ -132,6 +143,12 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
       return(FALSE);
     }
 
+  if (SPS_ACCEPT_NOEXCLUDE == PointerStatus)
+    {
+      /* Hardware cursor, no need to remove it */
+      return(FALSE);
+    }
+
   if (HazardX1 > HazardX2)
     {
       tmp = HazardX2; HazardX2 = HazardX1; HazardX1 = tmp;
@@ -144,17 +161,14 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
   if (((mouse_x + mouse_width) >= HazardX1)  && (mouse_x <= HazardX2) &&
       ((mouse_y + mouse_height) >= HazardY1) && (mouse_y <= HazardY2))
     {
-      SurfGDI->MovePointer(SurfObj, -1, -1, &MouseRect);
       SafetySwitch = TRUE;
+      SurfGDI->MovePointer(SurfObj, -1, -1, &MouseRect);
     }
 
-  /* Mouse is not allowed to move if GDI is busy drawing */
-  SafetySwitch2 = TRUE;
-
   return(TRUE);
 }
 
-INT
+INT FASTCALL
 MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
 /*
  * FUNCTION: Notify the mouse driver that drawing has finished on a surface.
@@ -164,11 +178,20 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
 
   if (SurfObj == NULL)
     {
+      SafetySwitch2 = FALSE;
       return(FALSE);
     }
 
   if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
     {
+      SafetySwitch2 = FALSE;
+      return(FALSE);
+    }
+
+  if (SPS_ACCEPT_NOEXCLUDE == PointerStatus)
+    {
+      /* Hardware cursor, it wasn't removed so need to restore it */
+      SafetySwitch2 = FALSE;
       return(FALSE);
     }
 
@@ -183,7 +206,7 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
   return(TRUE);
 }
 
-VOID
+VOID /* STDCALL */
 MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
 /*
  * FUNCTION: Call by the mouse driver when input events occur.
@@ -197,84 +220,98 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
   PSURFGDI SurfGDI;
   RECTL MouseRect;
   MSG Msg;
-  ULONG j;
   LARGE_INTEGER LargeTickCount;
   ULONG TickCount;
   static ULONG ButtonsDown = 0;
-  const UINT MouseButtonDownMessage[3] =
-    {WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONDOWN};
-  const UINT MouseButtonUpMessage[3] =
-    {WM_RBUTTONUP, WM_MBUTTONUP, WM_LBUTTONUP};
-  const ULONG MouseButtonFlag[3] = {MK_RBUTTON, MK_MBUTTON, MK_LBUTTON};
 
   KeQueryTickCount(&LargeTickCount);
   TickCount = LargeTickCount.u.LowPart;
 
   if (hDC == 0)
-    {
-      return;
-    }
+  {
+    return;
+  }
 
   dc = DC_HandleToPtr(hDC);
-  SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
-  SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
+  SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface);
+  SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
   DC_ReleasePtr( hDC );
 
   /* Compile the total mouse movement change and dispatch button events. */
   for (i = 0; i < InputCount; i++)
+  {
+    mouse_cx += Data[i].LastX;
+    mouse_cy += Data[i].LastY;
+
+    Msg.wParam = ButtonsDown;
+    Msg.lParam = MAKELPARAM(mouse_x + mouse_cx, mouse_y + mouse_cy);
+    Msg.message = WM_MOUSEMOVE;
+    Msg.time = TickCount;
+    Msg.pt.x = mouse_x + mouse_cx;
+    Msg.pt.y = mouse_y + mouse_cy;
+    if ((0 != Data[i].LastX) || (0 != Data[i].LastY))
     {
-      mouse_cx += Data[i].LastX;
-      mouse_cy += Data[i].LastY;
-
-      Msg.wParam = ButtonsDown;
-      Msg.lParam = MAKELPARAM(mouse_x + mouse_cx, mouse_y + mouse_cy);
-      Msg.message = WM_MOUSEMOVE;
-      Msg.time = TickCount;
-      Msg.pt.x = mouse_x + mouse_cx;
-      Msg.pt.y = mouse_y + mouse_cy;
       MsqInsertSystemMessage(&Msg);
+    }
+
+    if (Data[i].ButtonFlags != 0)
+    {
+      if ((Data[i].ButtonFlags & MOUSE_LEFT_BUTTON_DOWN) > 0)
+      {
+       Msg.wParam  = MK_LBUTTON;
+        Msg.message = WM_LBUTTONDOWN;
+      }
+      if ((Data[i].ButtonFlags & MOUSE_MIDDLE_BUTTON_DOWN) > 0)
+      {
+       Msg.wParam  = MK_MBUTTON;
+        Msg.message = WM_MBUTTONDOWN;
+      }
+      if ((Data[i].ButtonFlags & MOUSE_RIGHT_BUTTON_DOWN) > 0)
+      {
+       Msg.wParam  = MK_RBUTTON;
+        Msg.message = WM_RBUTTONDOWN;
+      }
+
+      if ((Data[i].ButtonFlags & MOUSE_LEFT_BUTTON_UP) > 0)
+      {
+       Msg.wParam  = MK_LBUTTON;
+        Msg.message = WM_LBUTTONUP;
+      }
+      if ((Data[i].ButtonFlags & MOUSE_MIDDLE_BUTTON_UP) > 0)
+      {
+       Msg.wParam  = MK_MBUTTON;
+        Msg.message = WM_MBUTTONUP;
+      }
+      if ((Data[i].ButtonFlags & MOUSE_RIGHT_BUTTON_UP) > 0)
+      {
+       Msg.wParam  = MK_RBUTTON;
+        Msg.message = WM_RBUTTONUP;
+      }
 
-      for (j = 0; j < 3; j++)
-       {
-         ULONG Flag = MouseButtonFlag[j];
-         if (Data[i].ButtonData & (1 << j) && !(ButtonsDown & Flag))
-           {
-             ButtonsDown |= Flag;
-
-             Msg.wParam = ButtonsDown;
-             Msg.message = MouseButtonDownMessage[j];
-             MsqInsertSystemMessage(&Msg);
-           }
-         if (!(Data[i].ButtonData & (1 << j)) && (ButtonsDown & Flag))
-           {
-             ButtonsDown &= ~Flag;
-
-             Msg.wParam = ButtonsDown;
-             Msg.message = MouseButtonUpMessage[j];
-             MsqInsertSystemMessage(&Msg);
-           }
-       }
+      MsqInsertSystemMessage(&Msg);
     }
+  }
 
   /* If the mouse moved then move the pointer. */
-  if (mouse_cx != 0 || mouse_cy != 0)
+  if ((mouse_cx != 0 || mouse_cy != 0) && MouseEnabled)
+  {
+    mouse_x += mouse_cx;
+    mouse_y += mouse_cy;
+
+    mouse_x = max(mouse_x, 0);
+    mouse_y = max(mouse_y, 0);
+    mouse_x = min(mouse_x, 620);
+    mouse_y = min(mouse_y, 460);
+
+
+    if (SafetySwitch == FALSE && SafetySwitch2 == FALSE)
     {
-      mouse_x += mouse_cx;
-      mouse_y += mouse_cy;
-
-      mouse_x = max(mouse_x, 0);
-      mouse_y = max(mouse_y, 0);
-      mouse_x = min(mouse_x, 620);
-      mouse_y = min(mouse_y, 460);
-
-      if (SafetySwitch == FALSE && SafetySwitch2 == FALSE)
-       {
-         SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect);
-       }
+      SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect);
     }
+  }
 }
 
-VOID
+VOID FASTCALL
 EnableMouse(HDC hDisplayDC)
 {
   PDC dc;
@@ -285,30 +322,41 @@ EnableMouse(HDC hDisplayDC)
   SIZEL MouseSize;
   RECTL MouseRect;
 
-  dc = DC_HandleToPtr(hDisplayDC);
-  if( dc ){
-       SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
-       SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
-       DC_ReleasePtr( hDisplayDC );
-
-       /* Create the default mouse cursor. */
-       mouse_width = 32;
-       mouse_height = 32;
-       MouseSize.cx = 32;
-       MouseSize.cy = 64;
-       hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, 0, DefaultCursor);
-       MouseSurf = (PSURFOBJ)AccessUserObject(hMouseSurf);
-
-       /* Tell the display driver to set the pointer shape. */
-       SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL, 0, 0, 320, 240,
-                                  &MouseRect, 0);
-
-       mouse_x = 320;
-       mouse_y = 240;
-       MouseEnabled = TRUE;
+  if( hDisplayDC )
+  {
+    dc = DC_HandleToPtr(hDisplayDC);
+    SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface);
+    SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
+    DC_ReleasePtr( hDisplayDC );
+
+    /* Create the default mouse cursor. */
+    mouse_width = 32;
+    mouse_height = 32;
+    MouseSize.cx = 32;
+    MouseSize.cy = 64;
+    hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, BMF_TOPDOWN, DefaultCursor);
+    MouseSurf = (PSURFOBJ)AccessUserObject((ULONG) hMouseSurf);
+
+    /* Tell the display driver to set the pointer shape. */
+#if 0
+    mouse_x = SurfObj->sizlBitmap.cx / 2;
+    mouse_y = SurfObj->sizlBitmap.cy / 2;
+#else
+    mouse_x = 320;
+    mouse_y = 240;
+#endif
+    PointerStatus = SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL,
+                                             0, 0, mouse_x, mouse_y, &MouseRect,
+                                             SPS_CHANGE);
+
+    MouseEnabled = (SPS_ACCEPT_EXCLUDE == PointerStatus ||
+                    SPS_ACCEPT_NOEXCLUDE == PointerStatus);
+
+    EngDeleteSurface(hMouseSurf);
   }
-  else{
-       MouseEnabled = FALSE;
+  else
+  {
+    MouseEnabled = FALSE;
   }
 }
-
+/* EOF */