update for HEAD-2003021201
[reactos.git] / subsys / win32k / eng / mouse.c
index a865521..44136f6 100644 (file)
@@ -43,76 +43,76 @@ static LONG mouse_x, mouse_y;
 static UINT mouse_width = 0, mouse_height = 0;
 
 static UCHAR DefaultCursor[256] = {
-  0x00, 0x00, 0x00, 0x00, 
-  0x00, 0x00, 0x00, 0x00, 
-  0x00, 0x00, 0x00, 0x00, 
-  0x00, 0x00, 0x00, 0x00, 
-  0x00, 0x00, 0x00, 0x00, 
-  0x00, 0x00, 0x00, 0x00, 
   0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 
-  0x00, 0x00, 0x00, 0x00, 
-  0x00, 0x00, 0x00, 0x00, 
-  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, 
+  0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00,
+  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};
 
 /* FUNCTIONS *****************************************************************/
 
-INT 
-MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1, 
+INT
+MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
                       LONG HazardY1, LONG HazardX2, LONG HazardY2)
 /*
  * FUNCTION: Notify the mouse driver that drawing is about to begin in
@@ -122,23 +122,23 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
   RECTL MouseRect;
   LONG tmp;
 
-  if (SurfObj == NULL) 
+  if (SurfObj == NULL)
     {
       return(FALSE);
     }
 
-  if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE) 
+  if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
     {
       return(FALSE);
     }
 
-  if (HazardX1 > HazardX2) 
-    { 
-      tmp = HazardX2; HazardX2 = HazardX1; HazardX1 = tmp; 
+  if (HazardX1 > HazardX2)
+    {
+      tmp = HazardX2; HazardX2 = HazardX1; HazardX1 = tmp;
     }
-  if (HazardY1 > HazardY2) 
-    { 
-      tmp = HazardY2; HazardY2 = HazardY1; HazardY1 = tmp; 
+  if (HazardY1 > HazardY2)
+    {
+      tmp = HazardY2; HazardY2 = HazardY1; HazardY1 = tmp;
     }
 
   if (((mouse_x + mouse_width) >= HazardX1)  && (mouse_x <= HazardX2) &&
@@ -154,7 +154,7 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
   return(TRUE);
 }
 
-INT 
+INT
 MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
 /*
  * FUNCTION: Notify the mouse driver that drawing has finished on a surface.
@@ -162,12 +162,12 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
 {
   RECTL MouseRect;
 
-  if (SurfObj == NULL) 
+  if (SurfObj == NULL)
     {
       return(FALSE);
     }
 
-  if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE) 
+  if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
     {
       return(FALSE);
     }
@@ -177,7 +177,7 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
       SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect);
       SafetySwitch = FALSE;
     }
-  
+
   SafetySwitch2 = FALSE;
 
   return(TRUE);
@@ -195,13 +195,13 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
   PDC dc;
   PSURFOBJ SurfObj;
   PSURFGDI SurfGDI;
-  RECTL MouseRect; 
+  RECTL MouseRect;
   MSG Msg;
   ULONG j;
   LARGE_INTEGER LargeTickCount;
   ULONG TickCount;
   static ULONG ButtonsDown = 0;
-  const UINT MouseButtonDownMessage[3] = 
+  const UINT MouseButtonDownMessage[3] =
     {WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONDOWN};
   const UINT MouseButtonUpMessage[3] =
     {WM_RBUTTONUP, WM_MBUTTONUP, WM_LBUTTONUP};
@@ -218,7 +218,8 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
   dc = DC_HandleToPtr(hDC);
   SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
   SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
-  
+  DC_ReleasePtr( hDC );
+
   /* Compile the total mouse movement change and dispatch button events. */
   for (i = 0; i < InputCount; i++)
     {
@@ -232,7 +233,7 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
       Msg.pt.x = mouse_x + mouse_cx;
       Msg.pt.y = mouse_y + mouse_cy;
       MsqInsertSystemMessage(&Msg);
-      
+
       for (j = 0; j < 3; j++)
        {
          ULONG Flag = MouseButtonFlag[j];
@@ -245,8 +246,8 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
              MsqInsertSystemMessage(&Msg);
            }
          if (!(Data[i].ButtonData & (1 << j)) && (ButtonsDown & Flag))
-           {         
-             ButtonsDown &= ~Flag;        
+           {
+             ButtonsDown &= ~Flag;
 
              Msg.wParam = ButtonsDown;
              Msg.message = MouseButtonUpMessage[j];
@@ -257,9 +258,9 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
 
   /* If the mouse moved then move the pointer. */
   if (mouse_cx != 0 || mouse_cy != 0)
-    {     
+    {
       mouse_x += mouse_cx;
-      mouse_y += mouse_cy;      
+      mouse_y += mouse_cy;
 
       mouse_x = max(mouse_x, 0);
       mouse_y = max(mouse_y, 0);
@@ -268,36 +269,46 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
 
       if (SafetySwitch == FALSE && SafetySwitch2 == FALSE)
        {
-         SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect); 
+         SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect);
        }
     }
 }
 
-VOID 
+VOID
 EnableMouse(HDC hDisplayDC)
 {
-  PDC dc = DC_HandleToPtr(hDisplayDC);
-  PSURFOBJ SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
-  PSURFGDI SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
+  PDC dc;
+  PSURFOBJ SurfObj;
+  PSURFGDI SurfGDI;
   HBITMAP hMouseSurf;
   PSURFOBJ MouseSurf;
   SIZEL MouseSize;
   RECTL MouseRect;
 
-  /* 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;
+  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;
+  }
+  else{
+       MouseEnabled = FALSE;
+  }
 }