Author: fireball
Date: Tue Jul 28 16:12:29 2009
New Revision: 42270
URL:
http://svn.reactos.org/svn/reactos?rev=42270&view=rev
Log:
Giannis Adamopoulos
- Bring in mouse pointer functions to engpoint.c from trunk.
- Implement kernelmode part of mouse cursor support.
Added:
branches/arwinss/reactos/subsystems/win32/win32k/gre/cursoricon.c (with props)
branches/arwinss/reactos/subsystems/win32/win32k/include/cursor.h (with props)
branches/arwinss/reactos/subsystems/win32/win32k/main/cursor.c (with props)
Modified:
branches/arwinss/reactos/subsystems/win32/win32k/eng/engpoint.c
branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h
branches/arwinss/reactos/subsystems/win32/win32k/include/win32kp.h
branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db
branches/arwinss/reactos/subsystems/win32/win32k/win32k.rbuild
Modified: branches/arwinss/reactos/subsystems/win32/win32k/eng/engpoint.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/eng/engpoint.c [iso-8859-1]
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/eng/engpoint.c [iso-8859-1] Tue Jul
28 16:12:29 2009
@@ -12,35 +12,399 @@
#define NDEBUG
#include <debug.h>
+#define TAG_MOUSE TAG('M', 'O', 'U', 'S') /* mouse
*/
+#define GDIDEV(SurfObj) ((PDEVOBJ *)((SurfObj)->hdev))
+
/* PUBLIC FUNCTIONS **********************************************************/
+GDIPOINTER Pointer;
+POINTL ptlPointer;
+
VOID
-APIENTRY
+IntHideMousePointer(
+ PDEVOBJ *ppdev,
+ SURFOBJ *psoDest)
+{
+ GDIPOINTER *pgp;
+ POINTL pt;
+ RECTL rclDest;
+ POINTL ptlSave;
+
+ ASSERT(ppdev);
+ ASSERT(psoDest);
+
+ pgp = &Pointer;
+
+ if (!pgp->Enabled)
+ {
+ return;
+ }
+
+ pgp->Enabled = FALSE;
+
+ if (!pgp->psurfSave)
+ {
+ return;
+ }
+
+ /* Calculate cursor coordinates */
+ pt.x = ptlPointer.x - pgp->HotSpot.x;
+ pt.y = ptlPointer.y - pgp->HotSpot.y;
+
+ rclDest.left = max(pt.x, 0);
+ rclDest.top = max(pt.y, 0);
+ rclDest.right = min(pt.x + pgp->Size.cx, psoDest->sizlBitmap.cx);
+ rclDest.bottom = min(pt.y + pgp->Size.cy, psoDest->sizlBitmap.cy);
+
+ ptlSave.x = rclDest.left - pt.x;
+ ptlSave.y = rclDest.top - pt.y;
+
+ GrepBitBltEx(psoDest,
+ pgp->psurfSave,
+ NULL,
+ NULL,
+ NULL,
+ &rclDest,
+ &ptlSave,
+ &ptlSave,
+ NULL,
+ NULL,
+ ROP3_TO_ROP4(SRCCOPY),
+ FALSE);
+}
+
+VOID
+IntShowMousePointer(PDEVOBJ *ppdev, SURFOBJ *psoDest)
+{
+ GDIPOINTER *pgp;
+ POINTL pt;
+ RECTL rclSurf, rclPointer;
+
+ ASSERT(ppdev);
+ ASSERT(psoDest);
+
+
+ pgp = &Pointer;
+
+ if (pgp->Enabled)
+ {
+ return;
+ }
+
+ pgp->Enabled = TRUE;
+
+ /* Calculate pointer coordinates */
+ pt.x = ptlPointer.x - pgp->HotSpot.x;
+ pt.y = ptlPointer.y - pgp->HotSpot.y;
+
+ /* Calculate the rect on the surface */
+ rclSurf.left = max(pt.x, 0);
+ rclSurf.top = max(pt.y, 0);
+ rclSurf.right = min(pt.x + pgp->Size.cx, psoDest->sizlBitmap.cx);
+ rclSurf.bottom = min(pt.y + pgp->Size.cy, psoDest->sizlBitmap.cy);
+
+ /* Calculate the rect in the pointer bitmap */
+ rclPointer.left = rclSurf.left - pt.x;
+ rclPointer.top = rclSurf.top - pt.y;
+ rclPointer.right = min(pgp->Size.cx, psoDest->sizlBitmap.cx - pt.x);
+ rclPointer.bottom = min(pgp->Size.cy, psoDest->sizlBitmap.cy - pt.y);
+
+ /* Copy the pixels under the cursor to temporary surface. */
+ GrepBitBltEx(pgp->psurfSave,
+ psoDest,
+ NULL,
+ NULL,
+ NULL,
+ &rclPointer,
+ (POINTL*)&rclSurf,
+ NULL,
+ NULL,
+ NULL,
+ ROP3_TO_ROP4(SRCCOPY),
+ FALSE);
+
+ /* Blt the pointer on the screen. */
+ if (pgp->psurfColor)
+ {
+ GrepBitBltEx(psoDest,
+ pgp->psurfColor,
+ pgp->psurfMask,
+ NULL,
+ pgp->XlateObject,
+ &rclSurf,
+ (POINTL*)&rclPointer,
+ (POINTL*)&rclPointer,
+ NULL,
+ NULL,
+ R4_MASK,
+ FALSE);
+ }
+ else
+ {
+ GrepBitBltEx(psoDest,
+ pgp->psurfMask,
+ NULL,
+ NULL,
+ pgp->XlateObject,
+ &rclSurf,
+ (POINTL*)&rclPointer,
+ NULL,
+ NULL,
+ NULL,
+ ROP3_TO_ROP4(SRCAND),
+ FALSE);
+
+ rclPointer.top += pgp->Size.cy;
+
+ GrepBitBltEx(psoDest,
+ pgp->psurfMask,
+ NULL,
+ NULL,
+ pgp->XlateObject,
+ &rclSurf,
+ (POINTL*)&rclPointer,
+ NULL,
+ NULL,
+ NULL,
+ ROP3_TO_ROP4(SRCINVERT),
+ FALSE);
+ }
+}
+
+/*
+ * @implemented
+ */
+ULONG APIENTRY
+EngSetPointerShape(
+ IN SURFOBJ *pso,
+ IN SURFOBJ *psoMask,
+ IN SURFOBJ *psoColor,
+ IN XLATEOBJ *pxlo,
+ IN LONG xHot,
+ IN LONG yHot,
+ IN LONG x,
+ IN LONG y,
+ IN RECTL *prcl,
+ IN FLONG fl)
+{
+ PDEVOBJ *ppdev;
+ GDIPOINTER *pgp;
+ PBYTE Bits;
+ SIZEL Size;
+ LONG lDelta;
+ HBITMAP hbmp;
+
+ ASSERT(pso);
+
+ ppdev = GDIDEV(pso);
+ pgp = &Pointer;
+
+ IntHideMousePointer(ppdev, pso);
+
+ if (pgp->psurfColor)
+ {
+ /* FIXME: let GDI allocate/free memory */
+ EngFreeMem(pgp->psurfColor->pvBits);
+ pgp->psurfColor->pvBits = 0;
+
+ EngDeleteSurface(pgp->psurfColor->hsurf);
+ //SURFACE_ShareUnlockSurface(pgp->psurfColor);
+ pgp->psurfColor = NULL;
+ }
+
+ if (pgp->psurfMask)
+ {
+ /* FIXME: let GDI allocate/free memory */
+ EngFreeMem(pgp->psurfMask->pvBits);
+ pgp->psurfMask->pvBits = 0;
+
+ EngDeleteSurface(pgp->psurfMask->hsurf);
+ //SURFACE_ShareUnlockSurface(pgp->psurfMask);
+ pgp->psurfMask = NULL;
+ }
+
+ if (pgp->psurfSave != NULL)
+ {
+ EngDeleteSurface(pgp->psurfSave->hsurf);
+ //SURFACE_ShareUnlockSurface(pgp->psurfSave);
+ pgp->psurfSave = NULL;
+ }
+
+ if (pgp->XlateObject != NULL)
+ {
+ EngDeleteXlate(pgp->XlateObject);
+ pgp->XlateObject = NULL;
+ }
+
+ /* See if we are being asked to hide the pointer. */
+ if (psoMask == NULL)
+ {
+ return SPS_ACCEPT_NOEXCLUDE;
+ }
+
+ pgp->HotSpot.x = xHot;
+ pgp->HotSpot.y = yHot;
+
+ if (x != -1)
+ {
+ ptlPointer.x = x;
+ ptlPointer.y = y;
+ }
+
+ pgp->Size.cx = abs(psoMask->lDelta) << 3;
+ pgp->Size.cy = (psoMask->cjBits / abs(psoMask->lDelta)) >> 1;
+
+ if (psoColor != NULL)
+ {
+ /* FIXME: let GDI allocate/free memory */
+ Bits = EngAllocMem(0, psoColor->cjBits, TAG_MOUSE);
+ if (Bits == NULL)
+ {
+ return SPS_ERROR;
+ }
+
+ memcpy(Bits, psoColor->pvBits, psoColor->cjBits);
+
+ hbmp = EngCreateBitmap(pgp->Size,
+ psoColor->lDelta,
+ psoColor->iBitmapFormat,
+ psoColor->lDelta < 0 ? 0 : BMF_TOPDOWN,
+ Bits);
+
+ pgp->psurfColor = EngLockSurface(hbmp);
+ }
+ else
+ {
+ pgp->psurfColor = NULL;
+ }
+
+ Size.cx = pgp->Size.cx;
+ Size.cy = pgp->Size.cy << 1;
+ Bits = EngAllocMem(0, psoMask->cjBits, TAG_MOUSE);
+ if (Bits == NULL)
+ {
+ return SPS_ERROR;
+ }
+
+ memcpy(Bits, psoMask->pvBits, psoMask->cjBits);
+
+ hbmp = EngCreateBitmap(Size,
+ psoMask->lDelta,
+ psoMask->iBitmapFormat,
+ psoMask->lDelta < 0 ? 0 : BMF_TOPDOWN,
+ Bits);
+
+ pgp->psurfMask = EngLockSurface(hbmp);
+
+ /* Create an XLATEOBJ that will be used for drawing masks.
+ * FIXME: We should get this in pxlo parameter! */
+ if (pxlo == NULL)
+ {
+ HPALETTE BWPalette, DestPalette;
+ ULONG BWColors[] = {0, 0xFFFFFF};
+
+ BWPalette = EngCreatePalette(PAL_INDEXED, sizeof(BWColors) / sizeof(ULONG),
+ BWColors, 0, 0, 0);
+
+ DestPalette = ppdev->DevInfo.hpalDefault;
+ pgp->XlateObject = IntEngCreateXlate(0, 0,
+ DestPalette, BWPalette);
+ EngDeletePalette(BWPalette);
+ }
+ else
+ {
+ pgp->XlateObject = pxlo;
+ }
+
+ /* Create surface for saving the pixels under the cursor. */
+ switch (pso->iBitmapFormat)
+ {
+ case BMF_1BPP:
+ lDelta = pgp->Size.cx >> 3;
+ break;
+ case BMF_4BPP:
+ lDelta = pgp->Size.cx >> 1;
+ break;
+ case BMF_8BPP:
+ lDelta = pgp->Size.cx;
+ break;
+ case BMF_16BPP:
+ lDelta = pgp->Size.cx << 1;
+ break;
+ case BMF_24BPP:
+ lDelta = pgp->Size.cx * 3;
+ break;
+ case BMF_32BPP:
+ lDelta = pgp->Size.cx << 2;
+ break;
+ default:
+ lDelta = 0;
+ break;
+ }
+
+ hbmp = EngCreateBitmap(pgp->Size,
+ lDelta,
+ pso->iBitmapFormat,
+ BMF_TOPDOWN | BMF_NOZEROINIT,
+ NULL);
+
+ pgp->psurfSave = EngLockSurface(hbmp);
+
+ if (x != -1)
+ {
+ IntShowMousePointer(ppdev, pso);
+
+ if (prcl != NULL)
+ {
+ prcl->left = x - pgp->HotSpot.x;
+ prcl->top = y - pgp->HotSpot.x;
+ prcl->right = prcl->left + pgp->Size.cx;
+ prcl->bottom = prcl->top + pgp->Size.cy;
+ }
+ } else if (prcl != NULL)
+ prcl->left = prcl->top = prcl->right = prcl->bottom = -1;
+
+ return SPS_ACCEPT_NOEXCLUDE;
+}
+
+/*
+ * @implemented
+ */
+
+VOID APIENTRY
EngMovePointer(
- IN SURFOBJ *pso,
- IN LONG x,
- IN LONG y,
- IN RECTL *prcl)
+ IN SURFOBJ *pso,
+ IN LONG x,
+ IN LONG y,
+ IN RECTL *prcl)
{
- UNIMPLEMENTED;
-}
-
-ULONG
-APIENTRY
-EngSetPointerShape(
- IN SURFOBJ *pso,
- IN SURFOBJ *psoMask,
- IN SURFOBJ *psoColor,
- IN XLATEOBJ *pxlo,
- IN LONG xHot,
- IN LONG yHot,
- IN LONG x,
- IN LONG y,
- IN RECTL *prcl,
- IN FLONG fl)
-{
- UNIMPLEMENTED;
- return 0;
+ PDEVOBJ *ppdev;
+ GDIPOINTER *pgp;
+
+ ASSERT(pso);
+
+ ppdev = GDIDEV(pso);
+ ASSERT(ppdev);
+
+ pgp = &Pointer;
+
+ IntHideMousePointer(ppdev, pso);
+
+ ptlPointer.x = x;
+ ptlPointer.y = y;
+
+ if (x != -1)
+ {
+ IntShowMousePointer(ppdev, pso);
+ if (prcl != NULL)
+ {
+ prcl->left = x - pgp->HotSpot.x;
+ prcl->top = y - pgp->HotSpot.x;
+ prcl->right = prcl->left + pgp->Size.cx;
+ prcl->bottom = prcl->top + pgp->Size.cy;
+ }
+ } else if (prcl != NULL)
+ prcl->left = prcl->top = prcl->right = prcl->bottom = -1;
}
BOOL
Added: branches/arwinss/reactos/subsystems/win32/win32k/gre/cursoricon.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/cursoricon.c (added)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/cursoricon.c [iso-8859-1] Tue Jul
28 16:12:29 2009
@@ -1,0 +1,220 @@
+/*
+ * PROJECT: ReactOS Win32K
+ * LICENSE: LGPL - See COPYING in the top level directory
+ * FILE: subsystems/win32/win32k/gre/cursoricon.c
+ * PURPOSE: ReactOS cursor support routines
+ * PROGRAMMERS: Giannis Adamopoulos
+ */
+
+#include <win32k.h>
+#define NDEBUG
+#include <debug.h>
+
+extern PDEVOBJ PrimarySurface;
+
+VOID NTAPI
+GreMovePointer(
+ IN SURFOBJ *pso,
+ IN LONG x,
+ IN LONG y,
+ IN RECTL *prcl)
+{
+ SURFACE_LockBitmapBits(pso);
+ GDIDEVFUNCS(pso).MovePointer(pso, x, y, prcl);
+ SURFACE_UnlockBitmapBits(pso);
+}
+
+
+ULONG NTAPI
+GreSetPointerShape(
+ IN SURFOBJ *pso,
+ IN SURFOBJ *psoMask,
+ IN SURFOBJ *psoColor,
+ IN XLATEOBJ *pxlo,
+ IN LONG xHot,
+ IN LONG yHot,
+ IN LONG x,
+ IN LONG y,
+ IN RECTL *prcl,
+ IN FLONG fl)
+{
+ ULONG ulResult = SPS_DECLINE;
+ PFN_DrvSetPointerShape pfnSetPointerShape;
+ PPDEVOBJ ppdev = &PrimarySurface;
+
+ pfnSetPointerShape = GDIDEVFUNCS(pso).SetPointerShape;
+
+ SURFACE_LockBitmapBits(pso);
+ if (pfnSetPointerShape)
+ {
+ ulResult = pfnSetPointerShape(pso,
+ psoMask,
+ psoColor,
+ pxlo,
+ xHot,
+ yHot,
+ x,
+ y,
+ prcl,
+ fl);
+ }
+
+ /* Check if the driver accepted it */
+ if (ulResult == SPS_ACCEPT_NOEXCLUDE)
+ {
+ /* Set MovePointer to the driver function */
+ ppdev->pfnMovePointer = GDIDEVFUNCS(pso).MovePointer;
+ }
+ else
+ {
+ /* Set software pointer */
+ ulResult = EngSetPointerShape(pso,
+ psoMask,
+ psoColor,
+ pxlo,
+ xHot,
+ yHot,
+ x,
+ y,
+ prcl,
+ fl);
+ /* Set MovePointer to the eng function */
+ ppdev->pfnMovePointer = EngMovePointer;
+ }
+
+ SURFACE_UnlockBitmapBits(pso);
+
+ return ulResult;
+}
+
+
+
+BOOL
+NTAPI
+GreSetCursor(ICONINFO* NewCursor, PSYSTEM_CURSORINFO CursorInfo)
+{
+ SURFOBJ *pso;
+ SURFOBJ *MaskBmpObj = NULL;
+ HBITMAP hMask = 0;
+ SURFOBJ *soMask = NULL, *soColor = NULL;
+ XLATEOBJ *XlateObj = NULL;
+ ULONG Status;
+
+ pso = EngLockSurface(PrimarySurface.pSurface);
+
+ if (!NewCursor)
+ {
+ if (CursorInfo->ShowingCursor)
+ {
+ DPRINT("Removing pointer!\n");
+ /* Remove the cursor if it was displayed */
+ GreMovePointer(pso, -1, -1, NULL);
+ }
+
+ CursorInfo->ShowingCursor = 0;
+
+ EngUnlockSurface(pso);
+
+ return TRUE;
+ }
+
+ MaskBmpObj = EngLockSurface((HSURF)NewCursor->hbmMask);
+ if (MaskBmpObj)
+ {
+ const int maskBpp = BitsPerFormat(MaskBmpObj->iBitmapFormat);
+ EngUnlockSurface(MaskBmpObj);
+ if (maskBpp != 1)
+ {
+ DPRINT1("SetCursor: The Mask bitmap must have 1BPP!\n");
+ EngUnlockSurface(pso);
+ return FALSE;
+ }
+
+ if ((PrimarySurface.DevInfo.flGraphicsCaps2 & GCAPS2_ALPHACURSOR) &&
+ pso->iBitmapFormat >= BMF_16BPP &&
+ pso->iBitmapFormat <= BMF_32BPP)
+ {
+ /* FIXME - Create a color pointer, only 32bit bitmap, set alpha bits!
+ Do not pass a mask bitmap to DrvSetPointerShape()!
+ Create a XLATEOBJ that describes the colors of the bitmap. */
+ DPRINT1("SetCursor: (Colored) alpha cursors are not supported!\n");
+ }
+ else
+ {
+ if(NewCursor->hbmColor)
+ {
+ /* FIXME - Create a color pointer, create only one 32bit bitmap!
+ Do not pass a mask bitmap to DrvSetPointerShape()!
+ Create a XLATEOBJ that describes the colors of the bitmap.
+ (16bit bitmaps are propably allowed) */
+ DPRINT1("SetCursor: Cursors with colors are not supported!\n");
+ }
+ else
+ {
+ MaskBmpObj = EngLockSurface((HSURF)NewCursor->hbmMask);
+ if(MaskBmpObj)
+ {
+ RECTL DestRect = {0, 0, MaskBmpObj->sizlBitmap.cx,
MaskBmpObj->sizlBitmap.cy};
+ POINTL SourcePoint = {0, 0};
+
+ /*
+ * NOTE: For now we create the cursor in top-down bitmap,
+ * because VMware driver rejects it otherwise. This should
+ * be fixed later.
+ */
+ hMask = EngCreateBitmap(
+ MaskBmpObj->sizlBitmap, abs(MaskBmpObj->lDelta),
+ MaskBmpObj->iBitmapFormat, BMF_TOPDOWN,
+ NULL);
+ if ( !hMask )
+ {
+ EngUnlockSurface(MaskBmpObj);
+ EngUnlockSurface(pso);
+ return FALSE;
+ }
+ soMask = EngLockSurface((HSURF)hMask);
+ EngCopyBits(soMask, MaskBmpObj, NULL, NULL,
+ &DestRect, &SourcePoint);
+ EngUnlockSurface(MaskBmpObj);
+ }
+ }
+ }
+ CursorInfo->ShowingCursor = TRUE;
+ CursorInfo->CurrentCursorObject = *NewCursor;
+ }
+ else
+ {
+ CursorInfo->ShowingCursor = FALSE;
+ }
+
+ Status = GreSetPointerShape(pso,
+ soMask,
+ soColor,
+ XlateObj,
+ NewCursor->xHotspot,
+ NewCursor->yHotspot,
+ CursorInfo->CursorPos.x,
+ CursorInfo->CursorPos.y,
+ NULL,
+ SPS_CHANGE);
+
+ if (Status != SPS_ACCEPT_NOEXCLUDE)
+ {
+ DPRINT1("GreSetPointerShape returned %lx\n", Status);
+ }
+
+ if(hMask)
+ {
+ EngUnlockSurface(soMask);
+ EngDeleteSurface((HSURF)hMask);
+ }
+ if(XlateObj)
+ {
+ EngDeleteXlate(XlateObj);
+ }
+
+ EngUnlockSurface(pso);
+
+ return TRUE;
+}
+
Propchange: branches/arwinss/reactos/subsystems/win32/win32k/gre/cursoricon.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: branches/arwinss/reactos/subsystems/win32/win32k/include/cursor.h
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/cursor.h (added)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/cursor.h [iso-8859-1] Tue Jul
28 16:12:29 2009
@@ -1,0 +1,22 @@
+
+typedef struct _SYSTEM_CURSORINFO
+{
+ BOOL Enabled;
+ RECT ClipRect;
+ BOOL IsClipped;
+ ICONINFO CurrentCursorObject;
+ BOOL ShowingCursor;
+ POINT CursorPos;
+} SYSTEM_CURSORINFO, *PSYSTEM_CURSORINFO;
+
+typedef struct _GDIPOINTER
+{
+ BOOL Enabled;
+ SIZEL Size;
+ POINTL HotSpot;
+ XLATEOBJ *XlateObject;
+ SURFOBJ *psurfColor;
+ SURFOBJ *psurfMask;
+ SURFOBJ *psurfSave;
+ RECTL Exclude; /* required publicly for SPS_ACCEPT_EXCLUDE */
+} GDIPOINTER, *PGDIPOINTER;
Propchange: branches/arwinss/reactos/subsystems/win32/win32k/include/cursor.h
------------------------------------------------------------------------------
svn:eol-style = native
Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h [iso-8859-1]
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h [iso-8859-1] Tue Jul 28
16:12:29 2009
@@ -212,5 +212,15 @@
BRUSHOBJ* pbo, LONG x, LONG y, LONG deltax, LONG deltay,
POINTL* Translate);
+BOOL NTAPI
+GreSetCursor(ICONINFO* NewCursor, PSYSTEM_CURSORINFO CursorInfo);
+
+VOID NTAPI
+GreMovePointer(
+ SURFOBJ *pso,
+ LONG x,
+ LONG y,
+ RECTL *prcl);
+
#endif
Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/win32kp.h
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/win32kp.h [iso-8859-1]
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/win32kp.h [iso-8859-1] Tue
Jul 28 16:12:29 2009
@@ -46,6 +46,7 @@
#include <floatobj.h>
#include <xformobj.h>
#include <xlateobj.h>
+#include <cursor.h>
#include <gre.h>
#include "winesup.h"
Added: branches/arwinss/reactos/subsystems/win32/win32k/main/cursor.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/main/cursor.c (added)
+++ branches/arwinss/reactos/subsystems/win32/win32k/main/cursor.c [iso-8859-1] Tue Jul 28
16:12:29 2009
@@ -1,0 +1,135 @@
+/*
+ * PROJECT: ReactOS Win32K
+ * LICENSE: LGPL - See COPYING in the top level directory
+ * FILE: subsystems/win32/win32k/main/cursor.c
+ * PURPOSE: ReactOS cursor support routines
+ * PROGRAMMERS: Giannis Adamopoulos
+ */
+
+#include <win32k.h>
+#define NDEBUG
+#include <debug.h>
+
+static SYSTEM_CURSORINFO CursorInfo;
+
+extern PDEVOBJ PrimarySurface;
+
+BOOL
+APIENTRY
+RosUserGetCursorPos(LPPOINT pt)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ _SEH2_TRY
+ {
+ ProbeForWrite(pt, sizeof(POINT), 1);
+ *pt = CursorInfo.CursorPos;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ return NT_SUCCESS(Status);
+}
+
+static void NTAPI clip_point_to_rect(LPCRECT rect, LPPOINT pt)
+{
+ if (pt->x < rect->left) pt->x = rect->left;
+ else if (pt->x >= rect->right) pt->x = rect->right - 1;
+ if (pt->y < rect->top) pt->y = rect->top;
+ else if (pt->y >= rect->bottom) pt->y = rect->bottom - 1;
+}
+
+BOOL
+APIENTRY
+RosUserSetCursorPos(INT x, INT y)
+{
+ POINT pos;
+ SURFOBJ *pso;
+
+ pos.x = x;
+ pos.y = y;
+
+ if(CursorInfo.IsClipped)
+ {
+ clip_point_to_rect(&CursorInfo.ClipRect, &pos);
+ }
+
+ if (CursorInfo.ShowingCursor)
+ {
+ pso = EngLockSurface(PrimarySurface.pSurface);
+ GreMovePointer(pso, pos.x, pos.y, NULL);
+ EngUnlockSurface(pso);
+ }
+
+ CursorInfo.CursorPos = pos;
+
+ return TRUE;
+}
+
+BOOL
+APIENTRY
+RosUserClipCursor( LPCRECT UnsafeRect )
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ RECT Rect;
+
+ if (!UnsafeRect)
+ {
+ CursorInfo.IsClipped = FALSE;
+ return TRUE;
+ }
+
+ _SEH2_TRY
+ {
+ ProbeForRead(UnsafeRect, sizeof(RECT), 1);
+ RtlCopyMemory(&Rect, UnsafeRect , sizeof(RECT));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ CursorInfo.IsClipped = TRUE;
+ CursorInfo.ClipRect = Rect;
+
+ RosUserSetCursorPos(CursorInfo.CursorPos.x, CursorInfo.CursorPos.y);
+
+ return TRUE;
+}
+
+VOID
+APIENTRY
+RosUserSetCursor( ICONINFO* IconInfoUnsafe )
+{
+ ICONINFO IconInfo;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ _SEH2_TRY
+ {
+ ProbeForRead(IconInfoUnsafe, sizeof(ICONINFO), 1);
+ RtlCopyMemory(&IconInfo, IconInfoUnsafe , sizeof(ICONINFO));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if (NT_SUCCESS(Status))
+ {
+ IconInfo.hbmMask = GDI_MapUserHandle(IconInfo.hbmMask);
+ IconInfo.hbmColor = GDI_MapUserHandle(IconInfo.hbmColor);
+ GreSetCursor(&IconInfo, &CursorInfo);
+ }
+}
+
Propchange: branches/arwinss/reactos/subsystems/win32/win32k/main/cursor.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db [iso-8859-1] Tue Jul 28
16:12:29 2009
@@ -61,4 +61,8 @@
RosGdiRoundRect 7
RosGdiSwapBuffers 1
RosGdiUnrealizePalette 1
-RosUserConnectCsrss 0
+RosUserConnectCsrss 0
+RosUserGetCursorPos 1
+RosUserSetCursorPos 2
+RosUserClipCursor 1
+RosUserSetCursor 1
Modified: branches/arwinss/reactos/subsystems/win32/win32k/win32k.rbuild
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/win32k.rbuild [iso-8859-1]
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/win32k.rbuild [iso-8859-1] Tue Jul 28
16:12:29 2009
@@ -106,12 +106,14 @@
<file>surfobj.c</file>
<file>xformobj.c</file>
<file>xlateobj.c</file>
+ <file>cursoricon.c</file>
</directory>
<directory name="main">
<file>csr.c</file>
<file>err.c</file>
<file>init.c</file>
<file>usrheap.c</file>
+ <file>cursor.c</file>
</directory>
<directory name="wine">
<file>atom.c</file>