Merge 48064 from yarotows
[reactos.git] / reactos / subsystems / win32 / win32k / ntuser / cursoricon.c
index 3fe0211..b4446cd 100644 (file)
@@ -46,7 +46,7 @@ static LIST_ENTRY gCurIconList;
 
 SYSTEM_CURSORINFO gSysCursorInfo;
 
-BOOL FASTCALL
+BOOL
 InitCursorImpl()
 {
     ExInitializePagedLookasideList(&gProcessLookasideList,
@@ -70,7 +70,7 @@ InitCursorImpl()
     return TRUE;
 }
 
-PSYSTEM_CURSORINFO FASTCALL
+PSYSTEM_CURSORINFO
 IntGetSysCursorInfo()
 {
     return &gSysCursorInfo;
@@ -175,7 +175,7 @@ UserSetCursor(
     return hOldCursor;
 }
 
-BOOL UserSetCursorPos( INT x, INT y)
+BOOL UserSetCursorPos( INT x, INT y, BOOL SendMouseMoveMsg)
 {
     PWINDOW_OBJECT DesktopWindow;
     PSYSTEM_CURSORINFO CurInfo;
@@ -224,6 +224,9 @@ BOOL UserSetCursorPos( INT x, INT y)
     //Move the mouse pointer
     GreMovePointer(hDC, x, y);
 
+    if (!SendMouseMoveMsg)
+       return TRUE;
+
     //Generate a mouse move message
     Msg.message = WM_MOUSEMOVE;
     Msg.wParam = CurInfo->ButtonsDown;
@@ -342,7 +345,7 @@ IntFindExistingCurIconObject(HMODULE hModule,
     return NULL;
 }
 
-PCURICON_OBJECT FASTCALL
+PCURICON_OBJECT
 IntCreateCurIconHandle()
 {
     PCURICON_OBJECT CurIcon;
@@ -488,85 +491,6 @@ IntCleanupCurIcons(struct _EPROCESS *Process, PPROCESSINFO Win32Process)
 
 }
 
-/*
- * @implemented
- */
-HANDLE
-APIENTRY
-NtUserCreateCursorIconHandle(PICONINFO IconInfo OPTIONAL, BOOL Indirect)
-{
-    PCURICON_OBJECT CurIcon;
-    PSURFACE psurfBmp;
-    NTSTATUS Status;
-    HANDLE Ret;
-    DECLARE_RETURN(HANDLE);
-
-    DPRINT("Enter NtUserCreateCursorIconHandle\n");
-    UserEnterExclusive();
-
-    if (!(CurIcon = IntCreateCurIconHandle()))
-    {
-        SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
-        RETURN((HANDLE)0);
-    }
-
-    Ret = CurIcon->Self;
-
-    if (IconInfo)
-    {
-        Status = MmCopyFromCaller(&CurIcon->IconInfo, IconInfo, sizeof(ICONINFO));
-        if (NT_SUCCESS(Status))
-        {
-            /* Copy bitmaps and size info */
-            if (Indirect)
-            {
-                // FIXME: WTF?
-                CurIcon->IconInfo.hbmMask = BITMAP_CopyBitmap(CurIcon->IconInfo.hbmMask);
-                CurIcon->IconInfo.hbmColor = BITMAP_CopyBitmap(CurIcon->IconInfo.hbmColor);
-            }
-            if (CurIcon->IconInfo.hbmColor &&
-                    (psurfBmp = SURFACE_LockSurface(CurIcon->IconInfo.hbmColor)))
-            {
-                CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx;
-                CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy;
-                SURFACE_UnlockSurface(psurfBmp);
-                GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmColor, NULL);
-            }
-            if (CurIcon->IconInfo.hbmMask &&
-                    (psurfBmp = SURFACE_LockSurface(CurIcon->IconInfo.hbmMask)))
-            {
-                if (CurIcon->IconInfo.hbmColor == NULL)
-                {
-                    CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx;
-                    CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy >> 1;
-                }
-                SURFACE_UnlockSurface(psurfBmp);
-                GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmMask, NULL);
-            }
-
-            /* Calculate icon hotspot */
-            if (CurIcon->IconInfo.fIcon == TRUE)
-            {
-                CurIcon->IconInfo.xHotspot = CurIcon->Size.cx >> 1;
-                CurIcon->IconInfo.yHotspot = CurIcon->Size.cy >> 1;
-            }
-        }
-        else
-        {
-            SetLastNtError(Status);
-            /* FIXME - Don't exit here */
-        }
-    }
-
-    UserDereferenceObject(CurIcon);
-    RETURN(Ret);
-
-CLEANUP:
-    DPRINT("Leave NtUserCreateCursorIconHandle, ret=%i\n",_ret_);
-    UserLeave();
-    END_CLEANUP;
-}
-
 /*
  * @implemented
  */
@@ -814,7 +738,7 @@ NtUserClipCursor(
         CurInfo->CursorClipInfo.Right = min(Rect.right, DesktopWindow->Wnd->rcWindow.right);
         CurInfo->CursorClipInfo.Bottom = min(Rect.bottom, DesktopWindow->Wnd->rcWindow.bottom);
 
-        UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y);
+        UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y, FALSE);
 
         RETURN(TRUE);
     }
@@ -1027,11 +951,13 @@ NtUserSetCursorContents(
     }
 
     /* Delete old bitmaps */
-    if (CurIcon->IconInfo.hbmColor != IconInfo.hbmColor)
+    if ((CurIcon->IconInfo.hbmColor)
+               && (CurIcon->IconInfo.hbmColor != IconInfo.hbmColor))
     {
         GreDeleteObject(CurIcon->IconInfo.hbmColor);
     }
-    if (CurIcon->IconInfo.hbmMask != IconInfo.hbmMask)
+    if ((CurIcon->IconInfo.hbmMask)
+               && (CurIcon->IconInfo.hbmMask != IconInfo.hbmMask))
     {
         GreDeleteObject(CurIcon->IconInfo.hbmMask);
     }
@@ -1223,6 +1149,15 @@ NtUserSetCursorIconData(
     }
 
 done:
+       if(Ret)
+       {
+               /* This icon is shared now */
+               GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmMask, NULL);
+               if(CurIcon->IconInfo.hbmColor)
+               {
+                       GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmColor, NULL);
+               }
+       }
     UserDereferenceObject(CurIcon);
     RETURN(Ret);
 
@@ -1455,7 +1390,7 @@ UserDrawIconEx(
                           IconSize.cy,
                           SRCCOPY,
                           0,
-                          hdcMask,
+                                                 bAlpha ? 0 : hdcMask,
                           0,
                           hdcImage ? 0 : IconSize.cy);
     }