* CURICON_PROCESS structs starting at CurIcon->ProcessList.
*/
-#include <w32k.h>
+#include <win32k.h>
#define NDEBUG
#include <debug.h>
SYSTEM_CURSORINFO gSysCursorInfo;
-BOOL FASTCALL
+BOOL
InitCursorImpl()
{
ExInitializePagedLookasideList(&gProcessLookasideList,
return TRUE;
}
-PSYSTEM_CURSORINFO FASTCALL
+PSYSTEM_CURSORINFO
IntGetSysCursorInfo()
{
return &gSysCursorInfo;
return NULL;
}
- ASSERT(USER_BODY_TO_HEADER(CurIcon)->RefCount >= 1);
+ ASSERT(CurIcon->head.cLockObj >= 1);
return CurIcon;
}
{
UserReferenceObject(NewCursor);
- CurInfo->ShowingCursor = CURSOR_SHOWING;
+ CurInfo->ShowingCursor = 1;
CurInfo->CurrentCursorObject = NewCursor;
/* Call GDI to set the new screen cursor */
return hOldCursor;
}
+BOOL UserSetCursorPos( INT x, INT y, BOOL SendMouseMoveMsg)
+{
+ PWINDOW_OBJECT DesktopWindow;
+ PSYSTEM_CURSORINFO CurInfo;
+ HDC hDC;
+ MSG Msg;
+
+ if(!(hDC = IntGetScreenDC()))
+ {
+ return FALSE;
+ }
+
+ CurInfo = IntGetSysCursorInfo();
+
+ DesktopWindow = UserGetDesktopWindow();
+
+ if (DesktopWindow)
+ {
+ if(x >= DesktopWindow->Wnd->rcClient.right)
+ x = DesktopWindow->Wnd->rcClient.right - 1;
+ if(y >= DesktopWindow->Wnd->rcClient.bottom)
+ y = DesktopWindow->Wnd->rcClient.bottom - 1;
+ }
+
+ if(x < 0)
+ x = 0;
+ if(y < 0)
+ y = 0;
+
+ //Clip cursor position
+ if(CurInfo->CursorClipInfo.IsClipped)
+ {
+ if(x >= (LONG)CurInfo->CursorClipInfo.Right)
+ x = (LONG)CurInfo->CursorClipInfo.Right - 1;
+ if(x < (LONG)CurInfo->CursorClipInfo.Left)
+ x = (LONG)CurInfo->CursorClipInfo.Left;
+ if(y >= (LONG)CurInfo->CursorClipInfo.Bottom)
+ y = (LONG)CurInfo->CursorClipInfo.Bottom - 1;
+ if(y < (LONG)CurInfo->CursorClipInfo.Top)
+ y = (LONG)CurInfo->CursorClipInfo.Top;
+ }
+
+ //Store the new cursor position
+ gpsi->ptCursor.x = x;
+ gpsi->ptCursor.y = 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;
+ Msg.lParam = MAKELPARAM(x, y);
+ Msg.pt = gpsi->ptCursor;
+ MsqInsertSystemMessage(&Msg);
+
+ return TRUE;
+}
+
+/* Called from NtUserCallOneParam with Routine ONEPARAM_ROUTINE_SHOWCURSOR
+ * User32 macro NtUserShowCursor */
+int UserShowCursor(BOOL bShow)
+{
+ PSYSTEM_CURSORINFO CurInfo = IntGetSysCursorInfo();
+ HDC hdcScreen;
+
+ if (!(hdcScreen = IntGetScreenDC()))
+ {
+ return 0; /* No mouse */
+ }
+
+ if (bShow == FALSE)
+ {
+ /* Check if were diplaying a cursor */
+ if (CurInfo->ShowingCursor == 1)
+ {
+ /* Remove the pointer */
+ GreMovePointer(hdcScreen, -1, -1);
+ DPRINT("Removing pointer!\n");
+ }
+ CurInfo->ShowingCursor--;
+ }
+ else
+ {
+ if (CurInfo->ShowingCursor == 0)
+ {
+ /*Show the pointer*/
+ GreMovePointer(hdcScreen, gpsi->ptCursor.x, gpsi->ptCursor.y);
+ }
+ CurInfo->ShowingCursor++;
+ }
+
+ return CurInfo->ShowingCursor;
+}
+
/*
* We have to register that this object is in use by the current
* process. The only way to do that seems to be to walk the list
return NULL;
}
-PCURICON_OBJECT FASTCALL
+PCURICON_OBJECT
IntCreateCurIconHandle()
{
PCURICON_OBJECT CurIcon;
HANDLE hCurIcon;
- CurIcon = UserCreateObject(gHandleTable, &hCurIcon, otCursorIcon, sizeof(CURICON_OBJECT));
+ CurIcon = UserCreateObject(gHandleTable, NULL, &hCurIcon, otCursorIcon, sizeof(CURICON_OBJECT));
if (!CurIcon)
{
}
-/*
- * @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
*/
if ((Rect.right > Rect.left) && (Rect.bottom > Rect.top)
&& DesktopWindow && UnsafeRect != NULL)
{
- MOUSEINPUT mi;
CurInfo->CursorClipInfo.IsClipped = TRUE;
CurInfo->CursorClipInfo.Left = max(Rect.left, DesktopWindow->Wnd->rcWindow.left);
CurInfo->CursorClipInfo.Top = max(Rect.top, DesktopWindow->Wnd->rcWindow.top);
- CurInfo->CursorClipInfo.Right = min(Rect.right - 1, DesktopWindow->Wnd->rcWindow.right - 1);
- CurInfo->CursorClipInfo.Bottom = min(Rect.bottom - 1, DesktopWindow->Wnd->rcWindow.bottom - 1);
+ CurInfo->CursorClipInfo.Right = min(Rect.right, DesktopWindow->Wnd->rcWindow.right);
+ CurInfo->CursorClipInfo.Bottom = min(Rect.bottom, DesktopWindow->Wnd->rcWindow.bottom);
- mi.dx = gpsi->ptCursor.x;
- mi.dy = gpsi->ptCursor.y;
- mi.mouseData = 0;
- mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
- mi.time = 0;
- mi.dwExtraInfo = 0;
- IntMouseInput(&mi);
+ UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y, FALSE);
RETURN(TRUE);
}
}
/* 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);
}
}
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);
cyHeight,
hdcImage ? hdcImage : hdcMask,
0,
- ((diFlags & DI_MASK && !(diFlags & DI_IMAGE)) ||
- (diFlags & DI_IMAGE && hbmColor) ? 0 : IconSize.cy),
+ 0,
IconSize.cx,
IconSize.cy,
SRCCOPY,
0,
- hdcImage ? hdcMask : NULL);
+ hdcMask,
+ 0,
+ hdcImage ? 0 : IconSize.cy);
}
if (hOldMask) NtGdiSelectBitmap(hdcMask, hOldMask);
UINT istepIfAniCur,
HBRUSH hbrFlickerFreeDraw,
UINT diFlags,
- DWORD Unknown0,
- DWORD Unknown1)
+ BOOL bMetaHDC, // When TRUE, GDI functions need to be handled in User32!
+ PVOID pDIXData)
{
PCURICON_OBJECT pIcon;
BOOL Ret;
return Ret;
}
-/* Called from NtUserCallOneParam with Routine ONEPARAM_ROUTINE_SHOWCURSOR
- * User32 macro NtUserShowCursor */
-int
-APIENTRY
-UserShowCursor(BOOL bShow)
-{
- PSYSTEM_CURSORINFO CurInfo;
- HDC Screen;
- PDC dc;
- SURFOBJ *SurfObj;
- SURFACE *psurfDc;
- PDEVOBJ *ppdev;
- GDIPOINTER *pgp;
- int showpointer=0;
-
- CurInfo = IntGetSysCursorInfo();
-
- if (!(Screen = IntGetScreenDC()))
- {
- return showpointer; /* No mouse */
- }
-
- dc = DC_LockDc(Screen);
-
- if (!dc)
- {
- return showpointer; /* No mouse */
- }
-
- psurfDc = dc->dclevel.pSurface;
-
- if (!psurfDc)
- {
- DC_UnlockDc(dc);
- return showpointer; /* No Mouse */
- }
-
- SurfObj = &psurfDc->SurfObj;
- if (SurfObj == NULL)
- {
- DC_UnlockDc(dc);
- return showpointer; /* No mouse */
- }
-
- ppdev = GDIDEV(SurfObj);
-
- if (ppdev == NULL)
- {
- DC_UnlockDc(dc);
- return showpointer; /* No mouse */
- }
-
- pgp = &ppdev->Pointer;
-
- if (bShow == FALSE)
- {
- pgp->ShowPointer--;
- showpointer = pgp->ShowPointer;
-
- if (showpointer >= 0)
- {
- //ppdev->SafetyRemoveCount = 1;
- //ppdev->SafetyRemoveLevel = 1;
- IntEngMovePointer(SurfObj,-1,-1,NULL);
- CurInfo->ShowingCursor = 0;
- }
-
- }
- else
- {
- pgp->ShowPointer++;
- showpointer = pgp->ShowPointer;
-
- /* Show Cursor */
- if (showpointer < 0)
- {
- //ppdev->SafetyRemoveCount = 0;
- //ppdev->SafetyRemoveLevel = 0;
- IntEngMovePointer(SurfObj,-1,-1,NULL);
- CurInfo->ShowingCursor = CURSOR_SHOWING;
- }
- }
-
- DC_UnlockDc(dc);
- return showpointer;
-}