[ros-diffs] [fireball] 47640: - Remove my implementation of SWM cursor icons which turned out to be similar to creating an elephant from a fly. Instead use a much simpler, updated and fail-proof implementation by Giannis Adamopoulos. Arwinss is back on track.
fireball at svn.reactos.org
fireball at svn.reactos.org
Sun Jun 6 23:40:12 CEST 2010
- Previous message: [ros-diffs] [cgutman] 47639: Forgot to remove this ASSERT for r47636
- Next message: [ros-diffs] [tkreuzer] 47641: [WIN32K] Rewrite the bitmap API. There were a lot of bugs. NtGdiCreateBitmap allowed a negative height, leading to either topdown or bottomup bitmaps, a behaviour that Windows doesn't have. The function copied the bitmap bits directly from the caller to the bitmap using RtlCopyMemory, ignoring different scanline length and direction (resulting in bitmaps being upside down), not SEH protected. This function (IntSetBitmapBits) is replaced by a better solution UnsafeSetBitmapBits, that takes these things into account. The name is chosen to give a hint that the function can/should be SEH protected. IntSetBitmapBits is still there, as its retarded behaviour is actually required in some places. There were also IntCreateBitmap and IntGdiCreateBitmap, now both being replaced by GreCreateBitmap. The code that set the palette is removed, as it's already done in SURFACE_AllocSurface, here gpalRGB is replaced with gpalBGR, fixing some inverted color issues. The alignment correction in SURFACE_bSetBitmapBits is reapplied, now that the callers are behaving as they are supposed to do.
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: fireball
Date: Sun Jun 6 23:40:11 2010
New Revision: 47640
URL: http://svn.reactos.org/svn/reactos?rev=47640&view=rev
Log:
- Remove my implementation of SWM cursor icons which turned out to be similar to creating an elephant from a fly. Instead use a much simpler, updated and fail-proof implementation by Giannis Adamopoulos. Arwinss is back on track.
Modified:
branches/arwinss/reactos/dll/win32/winent.drv/mouse.c
branches/arwinss/reactos/dll/win32/winent.drv/userdrv.c
branches/arwinss/reactos/dll/win32/winent.drv/winent.h
branches/arwinss/reactos/include/reactos/win32k/rosuser.h
branches/arwinss/reactos/subsystems/win32/win32k/gre/cursoricon.c
branches/arwinss/reactos/subsystems/win32/win32k/include/cursor.h
branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h
branches/arwinss/reactos/subsystems/win32/win32k/include/swm.h
branches/arwinss/reactos/subsystems/win32/win32k/main/cursor.c
branches/arwinss/reactos/subsystems/win32/win32k/main/init.c
branches/arwinss/reactos/subsystems/win32/win32k/swm/winman.c
branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db
Modified: branches/arwinss/reactos/dll/win32/winent.drv/mouse.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winent.drv/mouse.c?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/dll/win32/winent.drv/mouse.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winent.drv/mouse.c [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -1,5 +1,5 @@
/*
- * X11 mouse driver
+ * NTDRV mouse driver
*
* Copyright 1998 Ulrich Weigand
* Copyright 2007 Henri Verbeet
@@ -69,41 +69,8 @@
MOUSEEVENTF_XUP
};
-static HWND cursor_window;
static BYTE TrackSysKey = 0; /* determine whether ALT key up will cause a WM_SYSKEYUP
or a WM_KEYUP message */
-
-VOID create_cursor( HANDLE handle );
-
-/***********************************************************************
- * set_window_cursor
- */
-void set_window_cursor( HWND hwnd, HCURSOR handle )
-{
- struct ntdrv_win_data *data;
-
- if (!(data = NTDRV_get_win_data( hwnd ))) return;
-
- if (!handle)
- {
- // FIXME: Special case for removing the cursor
- FIXME("TODO: Cursor should be removed!\n");
- data->cursor = handle;
- return;
- }
-
- /* Try to set the cursor */
- if (!SwmDefineCursor(hwnd, handle))
- {
- /* This cursor doesn't exist yet, create it */
- create_cursor(handle);
-
- /* Set it for this window */
- SwmDefineCursor(hwnd, handle);
- }
-
- data->cursor = handle;
-}
/***********************************************************************
* get_key_state
@@ -165,12 +132,6 @@
cursor = (reply->count >= 0) ? wine_server_ptr_handle(reply->cursor) : 0;
}
SERVER_END_REQ;
-
- if (hwnd)
- {
- struct ntdrv_win_data *data = NTDRV_get_win_data( hwnd );
- if (data && cursor != data->cursor) set_window_cursor( hwnd, cursor );
- }
}
/***********************************************************************
@@ -233,7 +194,6 @@
/* get the window handle from cursor position */
hwnd = SwmGetWindowFromPoint(pt.x, pt.y);
- cursor_window = hwnd;
if (flags & MOUSEEVENTF_MOVE)
{
@@ -424,208 +384,24 @@
}
/***********************************************************************
- * get_bitmap_width_bytes
- *
- * Return number of bytes taken by a scanline of 16-bit aligned Windows DDB
- * data.
- * from user32/cursoricon.c:168
- */
-static int get_bitmap_width_bytes( int width, int bpp )
-{
- switch(bpp)
- {
- case 1:
- return 2 * ((width+15) / 16);
- case 4:
- return 2 * ((width+3) / 4);
- case 24:
- width *= 3;
- /* fall through */
- case 8:
- return width + (width & 1);
- case 16:
- case 15:
- return width * 2;
- case 32:
- return width * 4;
- default:
- WARN("Unknown depth %d, please report.\n", bpp );
- }
- return -1;
-}
-
-VOID CDECL RosDrv_GetIconInfo(CURSORICONINFO *ciconinfo, PICONINFO iconinfo)
-{
- INT height;
- BITMAP bitmap;
- PVOID pbits;
- static const WORD ICON_HOTSPOT = 0x4242; /* From user32/cursoricon.c:128 */
-
- //TRACE("%p => %dx%d, %d bpp\n", ciconinfo,
- // ciconinfo->nWidth, ciconinfo->nHeight, ciconinfo->bBitsPerPixel);
-
- if ( (ciconinfo->ptHotSpot.x == ICON_HOTSPOT) &&
- (ciconinfo->ptHotSpot.y == ICON_HOTSPOT) )
- {
- iconinfo->fIcon = TRUE;
- iconinfo->xHotspot = ciconinfo->nWidth / 2;
- iconinfo->yHotspot = ciconinfo->nHeight / 2;
+ * DestroyCursorIcon (NTDRV.@)
+ */
+void CDECL RosDrv_DestroyCursorIcon( HCURSOR handle )
+{
+}
+
+void CDECL RosDrv_SetCursor( HCURSOR handle )
+{
+ ICONINFO iconinfo;
+
+ if(handle == NULL)
+ {
+ RosUserSetCursor(NULL);
}
else
{
- iconinfo->fIcon = FALSE;
- iconinfo->xHotspot = ciconinfo->ptHotSpot.x;
- iconinfo->yHotspot = ciconinfo->ptHotSpot.y;
- }
-
- height = ciconinfo->nHeight;
-
- if (ciconinfo->bBitsPerPixel > 1)
- {
- pbits = (char *)(ciconinfo + 1) + ciconinfo->nHeight * get_bitmap_width_bytes (ciconinfo->nWidth,1);
-
- iconinfo->hbmColor = CreateBitmap( ciconinfo->nWidth, ciconinfo->nHeight,
- ciconinfo->bPlanes, ciconinfo->bBitsPerPixel,
- pbits);
- if(GetObjectW(iconinfo->hbmColor, sizeof(bitmap), &bitmap))
- RosGdiCreateBitmap(NULL, iconinfo->hbmColor, &bitmap, pbits);
- }
- else
- {
- iconinfo->hbmColor = 0;
- height *= 2;
- }
-
- pbits = (char *)(ciconinfo + 1);
-
- /* Create the mask bitmap */
- iconinfo->hbmMask = CreateBitmap ( ciconinfo->nWidth, height,
- 1, 1, pbits);
- if( GetObjectW(iconinfo->hbmMask, sizeof(bitmap), &bitmap))
- {
- RosGdiCreateBitmap(NULL, iconinfo->hbmMask, &bitmap, pbits);
- }
-}
-
-/***********************************************************************
- * create_cursor
- *
- * Create a client cursor from a Windows one.
- */
-VOID create_cursor( HANDLE handle )
-{
- HDC hdc;
- ICONINFO icon;
- BITMAP bm;
-
- //if (!handle) return get_empty_cursor();
-
- if (!(hdc = CreateCompatibleDC( 0 ))) return;
- if (!GetIconInfo( handle, &icon ))
- {
- DeleteDC( hdc );
- return;
- }
-
- GetObjectW( icon.hbmMask, sizeof(bm), &bm );
- if (!icon.hbmColor) bm.bmHeight /= 2;
-
- /* make sure hotspot is valid */
- if (icon.xHotspot >= bm.bmWidth || icon.yHotspot >= bm.bmHeight)
- {
- icon.xHotspot = bm.bmWidth / 2;
- icon.yHotspot = bm.bmHeight / 2;
- }
-
- // help for debugging
-#if 0
- {
- BITMAPINFO *info;
- unsigned int *color_bits = NULL;
- unsigned char *mask_bits = NULL;
- int width = bm.bmWidth;
- int height = bm.bmHeight;
- unsigned int width_bytes = (width + 31) / 32 * 4;
- BITMAP bitmap;
-
-
- if (!(info = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( BITMAPINFO, bmiColors[256] ))))
- return;
-
- info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- info->bmiHeader.biWidth = width;
- info->bmiHeader.biHeight = -height;
- info->bmiHeader.biPlanes = 1;
- info->bmiHeader.biBitCount = 1;
- info->bmiHeader.biCompression = BI_RGB;
- info->bmiHeader.biSizeImage = width_bytes * height;
- info->bmiHeader.biXPelsPerMeter = 0;
- info->bmiHeader.biYPelsPerMeter = 0;
- info->bmiHeader.biClrUsed = 0;
- info->bmiHeader.biClrImportant = 0;
-
- if (!(mask_bits = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto done;
- if (!GetDIBits( hdc, icon.hbmMask, 0, height, mask_bits, info, DIB_RGB_COLORS )) goto done;
-
- /* HACK: Create the mask bitmap */
- DeleteObject( icon.hbmMask );
- icon.hbmMask = CreateBitmap ( width, height,
- 1, 1, NULL);
- if( GetObjectW(icon.hbmMask, sizeof(bitmap), &bitmap))
- {
- RosGdiCreateBitmap(NULL, icon.hbmMask, &bitmap, NULL);
- mask_bits[0] = 0xFF; mask_bits[1] = 0xFF; mask_bits[2] = 0xFF;
- SetDIBits( hdc, icon.hbmMask, 0, height, mask_bits, info, DIB_RGB_COLORS );
- }
-
- info->bmiHeader.biBitCount = 32;
- info->bmiHeader.biSizeImage = width * height * 4;
- if (!(color_bits = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto done;
- GetDIBits( hdc, icon.hbmColor, 0, height, color_bits, info, DIB_RGB_COLORS );
-
-done:
- HeapFree( GetProcessHeap(), 0, info );
- HeapFree( GetProcessHeap(), 0, color_bits );
- HeapFree( GetProcessHeap(), 0, mask_bits );
- }
-#endif
-
- /* Create the cursor icon */
- RosUserCreateCursorIcon( &icon, handle );
-
- //DeleteObject( icon.hbmMask );
- DeleteDC( hdc );
-}
-
-/***********************************************************************
- * DestroyCursorIcon (NTDRV.@)
- */
-void CDECL RosDrv_DestroyCursorIcon( HCURSOR handle )
-{
- ICONINFO IconInfo = {0};
-
- FIXME( "Destroying cursor %p\n", handle );
-
- /* Destroy kernel mode part of the cursor icon */
- RosUserDestroyCursorIcon( &IconInfo, handle );
-
- /* Destroy usermode-created bitmaps */
- // FIXME: Will it delete kernelmode bitmaps?!
- // HACK
- //if (IconInfo.hbmColor) DeleteObject( IconInfo.hbmColor );
- //if (IconInfo.hbmMask) DeleteObject( IconInfo.hbmMask );
-}
-
-void CDECL RosDrv_SetCursor( HCURSOR handle )
-{
-
- // HACK
- if (!cursor_window)
- {
- cursor_window = SwmGetWindowFromPoint(200, 200);
- }
-
- if (cursor_window) SendNotifyMessageW( cursor_window, WM_NTDRV_SET_CURSOR, 0, (LPARAM)handle );
- FIXME("handle %x, cursor_window %x\n", handle, cursor_window);
-}
-
+ GetIconInfo(handle, &iconinfo);
+ RosUserSetCursor(&iconinfo);
+ }
+}
+
Modified: branches/arwinss/reactos/dll/win32/winent.drv/userdrv.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winent.drv/userdrv.c?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/dll/win32/winent.drv/userdrv.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winent.drv/userdrv.c [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -763,9 +763,6 @@
{
switch(msg)
{
- case WM_NTDRV_SET_CURSOR:
- set_window_cursor( hwnd, (HCURSOR)lparam );
- return 0;
default:
FIXME( "got window msg %x hwnd %p wp %lx lp %lx\n", msg, hwnd, wparam, lparam );
return 0;
Modified: branches/arwinss/reactos/dll/win32/winent.drv/winent.h
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winent.drv/winent.h?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/dll/win32/winent.drv/winent.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winent.drv/winent.h [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -14,12 +14,6 @@
NTDRV_GET_GLX_DRAWABLE, /* get current glx drawable for a DC */
NTDRV_SYNC_PIXMAP, /* sync the dibsection to its pixmap */
NTDRV_FLUSH_GL_DRAWABLE /* flush changes made to the gl drawable */
-};
-
-/* NT driver private messages, must be in the range 0x80001000..0x80001fff */
-enum ntdrv_window_messages
-{
- WM_NTDRV_SET_CURSOR = 0x80001000
};
struct ntdrv_escape_set_drawable
Modified: branches/arwinss/reactos/include/reactos/win32k/rosuser.h
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/include/reactos/win32k/rosuser.h?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/include/reactos/win32k/rosuser.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/include/reactos/win32k/rosuser.h [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -46,6 +46,7 @@
BOOL NTAPI
RosUserClipCursor( LPCRECT clip );
+#if 0
void NTAPI
RosUserSetCursor( ICONINFO* IconInfo );
@@ -56,6 +57,11 @@
VOID APIENTRY
RosUserDestroyCursorIcon(ICONINFO* IconInfoUnsafe,
HCURSOR Handle);
+#endif
+
+VOID
+APIENTRY
+RosUserSetCursor( ICONINFO* IconInfoUnsafe );
LONG
APIENTRY
@@ -167,9 +173,6 @@
VOID NTAPI
SwmAddDesktopWindow(HWND hWnd, UINT Width, UINT Height);
-BOOL NTAPI
-SwmDefineCursor(HWND hWnd, HCURSOR hCursor);
-
VOID NTAPI
SwmRemoveWindow(HWND hWnd);
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/cursoricon.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gre/cursoricon.c?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/cursoricon.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/cursoricon.c [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -13,7 +13,7 @@
extern PDEVOBJ PrimarySurface;
VOID NTAPI
-GreMovePointer(
+IntEngMovePointer(
IN SURFOBJ *pso,
IN LONG x,
IN LONG y,
@@ -27,8 +27,30 @@
SURFACE_UnlockBitmapBits(pSurf);
}
+VOID
+NTAPI
+GreMovePointer(
+ HDC hdc,
+ LONG x,
+ LONG y)
+{
+ PRECTL prcl;
+ SURFOBJ *pso;
+
+ pso = EngLockSurface(PrimarySurface.pSurface);
+
+ /* Store the cursor exclude position in the PDEV */
+ prcl = &(GDIDEV(pso)->Pointer.Exclude);
+
+ /* Call Eng/Drv function */
+ IntEngMovePointer(pso, x, y, prcl);
+
+ EngUnlockSurface(pso);
+}
+
+
ULONG NTAPI
-GreSetPointerShape(
+IntSetPointerShape(
IN SURFOBJ *pso,
IN SURFOBJ *psoMask,
IN SURFOBJ *psoColor,
@@ -90,37 +112,23 @@
return ulResult;
}
-
-
-BOOL
+ULONG
NTAPI
-GreSetCursor(ICONINFO* NewCursor, PSYSTEM_CURSORINFO CursorInfo)
+GreSetPointerShape(
+ HDC hdc,
+ HBITMAP hbmMask,
+ HBITMAP hbmColor,
+ LONG xHot,
+ LONG yHot,
+ LONG x,
+ LONG y)
{
SURFOBJ *pso;
- HBITMAP hbmMask, hbmColor;
PSURFACE psurfMask, psurfColor;
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;
- }
-
- CursorInfo->ShowingCursor = TRUE;
-
- hbmMask = NewCursor->hbmMask;
- hbmColor = NewCursor->hbmColor;
/* Lock the mask bitmap */
if (hbmMask)
@@ -133,7 +141,7 @@
{
/* We have one, lock it */
psurfColor = SURFACE_ShareLock(hbmColor);
-
+
if (psurfColor)
{
/* Create an XLATEOBJ, no mono support */
@@ -144,14 +152,14 @@
else
psurfColor = NULL;
- Status = GreSetPointerShape(pso,
+ Status = IntSetPointerShape(pso,
psurfMask ? &psurfMask->SurfObj : NULL,
psurfColor ? &psurfColor->SurfObj : NULL,
XlateObj,
- NewCursor->xHotspot,
- NewCursor->yHotspot,
- CursorInfo->CursorPos.x,
- CursorInfo->CursorPos.y,
+ xHot,
+ yHot,
+ x,
+ y,
&(GDIDEV(pso)->Pointer.Exclude),
SPS_CHANGE);
Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/cursor.h
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/include/cursor.h?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/cursor.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/cursor.h [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -31,8 +31,5 @@
extern SYSTEM_CURSORINFO CursorInfo;
-VOID NTAPI USER_InitCursorIcons();
-VOID USER_LockCursorIcons();
-VOID USER_UnlockCursorIcons();
PCURSORICONENTRY NTAPI USER_GetCursorIcon(HCURSOR Handle);
Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- 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] Sun Jun 6 23:40:11 2010
@@ -366,15 +366,23 @@
/* Mouse pointer */
-BOOL NTAPI
-GreSetCursor(ICONINFO* NewCursor, PSYSTEM_CURSORINFO CursorInfo);
-
-VOID NTAPI
+ULONG
+NTAPI
+GreSetPointerShape(
+ HDC hdc,
+ HBITMAP hbmMask,
+ HBITMAP hbmColor,
+ LONG xHot,
+ LONG yHot,
+ LONG x,
+ LONG y);
+
+VOID
+NTAPI
GreMovePointer(
- SURFOBJ *pso,
+ HDC hdc,
LONG x,
- LONG y,
- RECTL *prcl);
+ LONG y);
INT FASTCALL
MouseSafetyOnDrawStart(SURFOBJ *pso,
Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/swm.h
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/include/swm.h?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/swm.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/swm.h [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -17,6 +17,6 @@
PSWM_WINDOW NTAPI SwmFindByHwnd(HWND hWnd);
VOID NTAPI SwmAcquire(VOID);
VOID NTAPI SwmRelease(VOID);
-
+HDC SwmGetScreenDC();
#endif
Modified: branches/arwinss/reactos/subsystems/win32/win32k/main/cursor.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/main/cursor.c?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/main/cursor.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/main/cursor.c [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -10,10 +10,6 @@
#define NDEBUG
#include <debug.h>
-/* Cursor icons list */
-LIST_ENTRY CursorIcons;
-ERESOURCE CursorIconsLock;
-
SYSTEM_CURSORINFO CursorInfo;
extern PDEVOBJ PrimarySurface;
@@ -22,8 +18,6 @@
APIENTRY
RosUserGetCursorPos(LPPOINT pt)
{
- NTSTATUS Status = STATUS_SUCCESS;
-
_SEH2_TRY
{
ProbeForWrite(pt, sizeof(POINT), 1);
@@ -31,11 +25,11 @@
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Status = _SEH2_GetExceptionCode();
+ _SEH2_YIELD(return FALSE);
}
_SEH2_END;
- return NT_SUCCESS(Status);
+ return TRUE;
}
static void NTAPI clip_point_to_rect(LPCRECT rect, LPPOINT pt)
@@ -51,7 +45,6 @@
RosUserSetCursorPos(INT x, INT y)
{
POINT pos;
- SURFOBJ *pso;
pos.x = x;
pos.y = y;
@@ -63,9 +56,10 @@
if (CursorInfo.ShowingCursor)
{
- pso = EngLockSurface(PrimarySurface.pSurface);
- GreMovePointer(pso, pos.x, pos.y, &(GDIDEV(pso)->Pointer.Exclude));
- EngUnlockSurface(pso);
+ HDC hDCscreen = SwmGetScreenDC();
+ if (!hDCscreen) return FALSE;
+
+ GreMovePointer(hDCscreen, pos.x, pos.y);
}
CursorInfo.CursorPos = pos;
@@ -77,7 +71,6 @@
APIENTRY
RosUserClipCursor( LPCRECT UnsafeRect )
{
- NTSTATUS Status = STATUS_SUCCESS;
RECT Rect;
if (!UnsafeRect)
@@ -93,15 +86,10 @@
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Status = _SEH2_GetExceptionCode();
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ _SEH2_YIELD(return FALSE);
}
_SEH2_END;
-
- if (!NT_SUCCESS(Status))
- {
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
CursorInfo.IsClipped = TRUE;
CursorInfo.ClipRect = Rect;
@@ -111,166 +99,66 @@
return TRUE;
}
+VOID UserSetCursor( ICONINFO* IconInfo )
+{
+ HDC hDCscreen;
+
+ hDCscreen = SwmGetScreenDC();
+ if (!hDCscreen) return;
+
+ if (!IconInfo)
+ {
+ if (CursorInfo.ShowingCursor == FALSE)
+ return;
+
+ DPRINT("Removing pointer!\n");
+ /* Remove the cursor if it was displayed */
+ GreMovePointer(hDCscreen, -1, -1);
+
+ CursorInfo.ShowingCursor = FALSE;
+ return;
+ }
+
+ IconInfo->hbmMask = GDI_MapUserHandle(IconInfo->hbmMask);
+ IconInfo->hbmColor = GDI_MapUserHandle(IconInfo->hbmColor);
+
+ DPRINT("hbmMask = 0x%x, hbmColor = 0x%x\n", IconInfo->hbmMask, IconInfo->hbmColor);
+
+ GreSetPointerShape( hDCscreen,
+ IconInfo->hbmMask,
+ IconInfo->hbmColor,
+ IconInfo->xHotspot,
+ IconInfo->yHotspot,
+ CursorInfo.CursorPos.x,
+ CursorInfo.CursorPos.y);
+
+ CursorInfo.ShowingCursor = TRUE;
+}
+
VOID
APIENTRY
RosUserSetCursor( ICONINFO* IconInfoUnsafe )
{
ICONINFO IconInfo;
- NTSTATUS Status = STATUS_SUCCESS;
- /* Special case for removing a pointer */
- if (!IconInfoUnsafe)
+ if(IconInfoUnsafe == NULL)
{
- GreSetCursor(NULL, &CursorInfo);
- return;
+ UserSetCursor(NULL);
}
+ else
+ {
+ _SEH2_TRY
+ {
+ ProbeForRead(IconInfoUnsafe, sizeof(ICONINFO), 1);
+ RtlCopyMemory(&IconInfo, IconInfoUnsafe , sizeof(ICONINFO));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ _SEH2_YIELD(return;)
+ }
+ _SEH2_END;
- _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);
+ UserSetCursor(&IconInfo);
}
}
-VOID
-APIENTRY
-RosUserCreateCursorIcon(ICONINFO* IconInfoUnsafe,
- HCURSOR Handle)
-{
- PCURSORICONENTRY pCursorIcon;
-
- // FIXME: SEH!
-
- /* Allocate an entry in the cursor icons list */
- pCursorIcon = ExAllocatePool(PagedPool, sizeof(CURSORICONENTRY));
- RtlZeroMemory(pCursorIcon, sizeof(CURSORICONENTRY));
-
- /* Save the usermode handle and other fields */
- pCursorIcon->Self = Handle;
- pCursorIcon->IconInfo = *IconInfoUnsafe;
- pCursorIcon->hbmMaskUser = IconInfoUnsafe->hbmMask;
- pCursorIcon->hbmColorUser = IconInfoUnsafe->hbmColor;
-
- /* Map handles */
- pCursorIcon->IconInfo.hbmMask = GDI_MapUserHandle(pCursorIcon->IconInfo.hbmMask);
- if (pCursorIcon->IconInfo.hbmColor)
- pCursorIcon->IconInfo.hbmColor = GDI_MapUserHandle(pCursorIcon->IconInfo.hbmColor);
-
- /* Make those bitmaps "system" objects */
- GDIOBJ_SetOwnership(pCursorIcon->IconInfo.hbmMask, NULL);
- if (pCursorIcon->IconInfo.hbmColor)
- GDIOBJ_SetOwnership(pCursorIcon->IconInfo.hbmColor, NULL);
-
- /* Acquire lock */
- USER_LockCursorIcons();
-
- /* Add it to the list */
- InsertTailList(&CursorIcons, &pCursorIcon->Entry);
-
- /* Release lock */
- USER_UnlockCursorIcons();
-}
-
-VOID
-APIENTRY
-RosUserDestroyCursorIcon(ICONINFO* IconInfoUnsafe,
- HCURSOR Handle)
-{
- PLIST_ENTRY Current;
- PCURSORICONENTRY pCursorIcon;
-
- /* Acquire lock */
- USER_LockCursorIcons();
-
- /* Traverse the list to find our mapping */
- Current = CursorIcons.Flink;
- while(Current != &CursorIcons)
- {
- pCursorIcon = CONTAINING_RECORD(Current, CURSORICONENTRY, Entry);
-
- /* Check if it's our entry */
- if (pCursorIcon->Self == Handle)
- {
- /* Remove it from the list */
- RemoveEntryList(Current);
-
- /* Get handles back to the user for proper disposal */
- IconInfoUnsafe->hbmColor = pCursorIcon->hbmColorUser;
- IconInfoUnsafe->hbmMask = pCursorIcon->hbmMaskUser;
-
- // TODO: Go through all windows and remove this cursor from them!
- DPRINT1("Hitting a TODO!\n");
-
- /* Free memory */
- ExFreePool(pCursorIcon);
- break;
- }
-
- /* Advance to the next pair */
- Current = Current->Flink;
- }
-
- /* Release lock */
- USER_UnlockCursorIcons();
-}
-
-PCURSORICONENTRY
-NTAPI
-USER_GetCursorIcon(HCURSOR Handle)
-{
- PLIST_ENTRY Current;
- PCURSORICONENTRY pCursorIcon;
-
- /* Traverse the list to find our mapping */
- Current = CursorIcons.Flink;
- while(Current != &CursorIcons)
- {
- pCursorIcon = CONTAINING_RECORD(Current, CURSORICONENTRY, Entry);
-
- /* Check if it's our entry */
- if (pCursorIcon->Self == Handle) return pCursorIcon;
-
- /* Advance to the next pair */
- Current = Current->Flink;
- }
-
- return NULL;
-}
-
-VOID NTAPI
-USER_InitCursorIcons()
-{
- NTSTATUS Status;
-
- /* Initialize cursor icons list and a spinlock */
- InitializeListHead(&CursorIcons);
- Status = ExInitializeResourceLite(&CursorIconsLock);
- if (!NT_SUCCESS(Status))
- DPRINT1("Initializing cursor icons lock failed with Status 0x%08X\n", Status);
-}
-
-VOID USER_LockCursorIcons()
-{
- /* Acquire lock */
- KeEnterCriticalRegion();
- ExAcquireResourceExclusiveLite(&CursorIconsLock, TRUE);
-}
-
-VOID USER_UnlockCursorIcons()
-{
- /* Release lock */
- ExReleaseResourceLite(&CursorIconsLock);
- KeLeaveCriticalRegion();
-}
Modified: branches/arwinss/reactos/subsystems/win32/win32k/main/init.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/main/init.c?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/main/init.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/main/init.c [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -357,9 +357,6 @@
/* Initialize handle-mapping */
GDI_InitHandleMapping();
- /* Initialize cursor icons */
- USER_InitCursorIcons();
-
/* Create stock objects */
CreateStockBitmap();
PALETTE_Init();
Modified: branches/arwinss/reactos/subsystems/win32/win32k/swm/winman.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/swm/winman.c?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/swm/winman.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/swm/winman.c [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -35,7 +35,6 @@
LIST_ENTRY SwmWindows;
ERESOURCE SwmLock;
HDC SwmDc; /* Screen DC for copying operations */
-PCURSORICONENTRY SwmLastCursor;
/* FUNCTIONS *****************************************************************/
@@ -87,6 +86,14 @@
GDIOBJ_SetOwnership(SwmDc, NULL);
}
+HDC SwmGetScreenDC()
+{
+ /* Lazily create a global screen DC */
+ if (!SwmDc) SwmCreateScreenDc();
+
+ return SwmDc;
+}
+
VOID
NTAPI
SwmInvalidateRegion(PSWM_WINDOW Window, struct region *Region, rectangle_t *Rect)
@@ -785,37 +792,11 @@
if (point_in_region(Window->Visible, x, y))
{
- /* Acquire CI lock */
- USER_LockCursorIcons();
-
- /* Check if cursor needs to be changed */
- if (Window->Cursor != SwmLastCursor)
- {
- if (Window->Cursor)
- {
- /* Set the new cursor */
- DPRINT1("Setting cursor bitmap %p for hwnd %p\n", Window->Cursor->IconInfo.hbmMask, Window->hwnd);
- GreSetCursor(&Window->Cursor->IconInfo, &CursorInfo);
- }
- else
- {
- /* This window should have no cursor */
- GreSetCursor(NULL, &CursorInfo);
- }
-
- /* Update the last cursor */
- SwmLastCursor = Window->Cursor;
- }
-
- /* Release CI lock */
- USER_UnlockCursorIcons();
-
/* Release the lock */
SwmRelease();
return Window->hwnd;
}
-
/* Advance to the next window */
Current = Current->Flink;
}
@@ -826,63 +807,6 @@
return 0;
}
-BOOL
-NTAPI
-SwmDefineCursor(HWND hWnd, HCURSOR hCursor)
-{
- PCURSORICONENTRY pCursorIcon;
- PSWM_WINDOW pSwmWindow;
-
- /* Acquire CI lock */
- USER_LockCursorIcons();
-
- /* Try to find this cursor */
- pCursorIcon = USER_GetCursorIcon(hCursor);
-
- /* Release CI lock */
- USER_UnlockCursorIcons();
-
- if (!pCursorIcon) return FALSE;
-
- /* Acquire the SWM lock */
- SwmAcquire();
-
- if (!hWnd)
- {
- /* Special case for setting default cursor */
- DPRINT1("Setting cursor bitmap uh%p\n", pCursorIcon->hbmMaskUser);
- GreSetCursor(&pCursorIcon->IconInfo, &CursorInfo);
-
- /* Update current cursor */
- SwmLastCursor = hCursor;
-
- /* Release the SWM lock */
- SwmRelease();
-
- return TRUE;
- }
-
- /* Now find the window */
- pSwmWindow = SwmFindByHwnd(hWnd);
-
- /* Success is returned in this case */
- if (!pSwmWindow)
- {
- /* Release the SWM lock */
- SwmRelease();
-
- return TRUE;
- }
-
- /* Set a cursor for this window */
- pSwmWindow->Cursor = pCursorIcon;
-
- /* Release the SWM lock */
- SwmRelease();
-
- return TRUE;
-}
-
VOID
NTAPI
SwmInitialize()
@@ -900,10 +824,7 @@
DPRINT1("Failure initializing SWM resource!\n");
}
- /* Cursor is hidden by default */
- SwmLastCursor = NULL;
-
- SwmTest();
+ //SwmTest();
}
VOID
Modified: branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db?rev=47640&r1=47639&r2=47640&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db [iso-8859-1] Sun Jun 6 23:40:11 2010
@@ -64,12 +64,10 @@
RosGdiSwapBuffers 1
RosGdiUnrealizePalette 1
RosUserConnectCsrss 0
-RosUserCreateCursorIcon 2
-RosUserDestroyCursorIcon 2
+RosUserSetCursor 1
RosUserGetCursorPos 1
RosUserSetCursorPos 2
RosUserClipCursor 1
-RosUserSetCursor 1
RosUserChangeDisplaySettings 5
RosUserEnumDisplayMonitors 3
RosUserEnumDisplaySettings 4
@@ -88,7 +86,6 @@
RosUserGetAsyncKeyState 1
SwmAddWindow 2
SwmAddDesktopWindow 3
-SwmDefineCursor 2
SwmRemoveWindow 1
SwmSetForeground 1
SwmPosChanging 2
- Previous message: [ros-diffs] [cgutman] 47639: Forgot to remove this ASSERT for r47636
- Next message: [ros-diffs] [tkreuzer] 47641: [WIN32K] Rewrite the bitmap API. There were a lot of bugs. NtGdiCreateBitmap allowed a negative height, leading to either topdown or bottomup bitmaps, a behaviour that Windows doesn't have. The function copied the bitmap bits directly from the caller to the bitmap using RtlCopyMemory, ignoring different scanline length and direction (resulting in bitmaps being upside down), not SEH protected. This function (IntSetBitmapBits) is replaced by a better solution UnsafeSetBitmapBits, that takes these things into account. The name is chosen to give a hint that the function can/should be SEH protected. IntSetBitmapBits is still there, as its retarded behaviour is actually required in some places. There were also IntCreateBitmap and IntGdiCreateBitmap, now both being replaced by GreCreateBitmap. The code that set the palette is removed, as it's already done in SURFACE_AllocSurface, here gpalRGB is replaced with gpalBGR, fixing some inverted color issues. The alignment correction in SURFACE_bSetBitmapBits is reapplied, now that the callers are behaving as they are supposed to do.
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Ros-diffs
mailing list