From 9457b015d695a0a86e75b91a37016da294782e48 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 14 Mar 2008 00:05:58 +0000 Subject: [PATCH] - Simplify IntSetCursor - Make NtUserSetCursor hide Cursor on hCursor = NULL - Don't set the cursor pos if the cursor is hidden in IntMouseInput - remove 2 useless ASSERTs - Dereference old cursor- Make the screensaver lib hide the cursor directly after creating it (the window never recieves a WM_SETCURSOR) partly fixes bug 2965 See issue #2965 for more details. svn path=/trunk/; revision=32676 --- reactos/lib/sdk/scrnsave/scrnsave.c | 1 + .../win32/win32k/ntuser/cursoricon.c | 95 +++++++++++-------- .../subsystems/win32/win32k/ntuser/input.c | 5 +- 3 files changed, 58 insertions(+), 43 deletions(-) diff --git a/reactos/lib/sdk/scrnsave/scrnsave.c b/reactos/lib/sdk/scrnsave/scrnsave.c index 3473f2841b5..72b8d3d483a 100644 --- a/reactos/lib/sdk/scrnsave/scrnsave.c +++ b/reactos/lib/sdk/scrnsave/scrnsave.c @@ -189,6 +189,7 @@ static int LaunchScreenSaver(HWND hParent) if (hMainWindow) { ShowWindow(hMainWindow, SW_SHOW); + SetCursor(NULL); while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg); diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index 3bc669b342d..2d0431d670e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -125,59 +125,54 @@ IntSetCursor(PWINSTATION_OBJECT WinSta, PCURICON_OBJECT NewCursor, { return Ret; } - else + + if(!(Screen = IntGetScreenDC())) { - if(!(Screen = IntGetScreenDC())) - { - return (HCURSOR)0; - } - /* FIXME use the desktop's HDC instead of using ScreenDeviceContext */ - dc = DC_LockDc(Screen); - - if (!dc) - { - return Ret; - } - dcbmp = dc->w.hBitmap; - DevInfo = (PDEVINFO)&((GDIDEVICE *)dc->pPDev)->DevInfo; - DC_UnlockDc(dc); - - BitmapObj = BITMAPOBJ_LockBitmap(dcbmp); - if ( !BitmapObj ) - return (HCURSOR)0; - SurfObj = &BitmapObj->SurfObj; - ASSERT(SurfObj); + return (HCURSOR)0; } + /* FIXME use the desktop's HDC instead of using ScreenDeviceContext */ + dc = DC_LockDc(Screen); - if (!NewCursor && (CurInfo->CurrentCursorObject || ForceChange)) + if (!dc) { - if (NULL != CurInfo->CurrentCursorObject) - { - UserDereferenceObject(CurInfo->CurrentCursorObject); - if (CurInfo->ShowingCursor) - { - /* Remove the cursor if it was displayed */ - IntEngMovePointer(SurfObj, -1, -1, &GDIDEV(SurfObj)->Pointer.Exclude); - } - } - - GDIDEV(SurfObj)->Pointer.Status = SPS_ACCEPT_NOEXCLUDE; - - CurInfo->CurrentCursorObject = NewCursor; /* i.e. CurrentCursorObject = NULL */ - CurInfo->ShowingCursor = 0; - BITMAPOBJ_UnlockBitmap(BitmapObj); return Ret; } + dcbmp = dc->w.hBitmap; + DevInfo = (PDEVINFO)&((GDIDEVICE *)dc->pPDev)->DevInfo; + DC_UnlockDc(dc); + + BitmapObj = BITMAPOBJ_LockBitmap(dcbmp); + if (!BitmapObj) + return (HCURSOR)0; + SurfObj = &BitmapObj->SurfObj; if (!NewCursor) { + if (CurInfo->CurrentCursorObject || ForceChange) + { + if (CurInfo->CurrentCursorObject) + { + UserDereferenceObject(CurInfo->CurrentCursorObject); + if (CurInfo->ShowingCursor) + { + DPRINT1("Removing pointer!\n"); + /* Remove the cursor if it was displayed */ + IntEngMovePointer(SurfObj, -1, -1, &GDIDEV(SurfObj)->Pointer.Exclude); + } + } + + GDIDEV(SurfObj)->Pointer.Status = SPS_ACCEPT_NOEXCLUDE; + + CurInfo->CurrentCursorObject = NewCursor; /* i.e. CurrentCursorObject = NULL */ + CurInfo->ShowingCursor = 0; + } + BITMAPOBJ_UnlockBitmap(BitmapObj); return Ret; } /* TODO: Fixme. Logic is screwed above */ - ASSERT(NewCursor); MaskBmpObj = BITMAPOBJ_LockBitmap(NewCursor->IconInfo.hbmMask); if (MaskBmpObj) { @@ -251,6 +246,12 @@ IntSetCursor(PWINSTATION_OBJECT WinSta, PCURICON_OBJECT NewCursor, CurInfo->CurrentCursorObject = NULL; } + /* OldCursor is not in use anymore */ + if (OldCursor) + { + UserDereferenceObject(OldCursor); + } + if (GDIDEVFUNCS(SurfObj).SetPointerShape) { GDIDEV(SurfObj)->Pointer.Status = @@ -1107,15 +1108,25 @@ NtUserSetCursor( RETURN(NULL); } - if(!(CurIcon = UserGetCurIconObject(hCursor))) + if(hCursor) { - ObDereferenceObject(WinSta); - RETURN(NULL); + if(!(CurIcon = UserGetCurIconObject(hCursor))) + { + ObDereferenceObject(WinSta); + RETURN(NULL); + } + } + else + { + CurIcon = NULL; } OldCursor = IntSetCursor(WinSta, CurIcon, FALSE); - UserDereferenceObject(CurIcon); + if(CurIcon) + { + UserDereferenceObject(CurIcon); + } ObDereferenceObject(WinSta); RETURN(OldCursor); diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 036a999da18..2ef2b7f8aba 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -1096,7 +1096,10 @@ IntMouseInput(MOUSEINPUT *mi) { SurfObj = &BitmapObj->SurfObj; - IntEngMovePointer(SurfObj, MousePos.x, MousePos.y, &(GDIDEV(SurfObj)->Pointer.Exclude)); + if (CurInfo->ShowingCursor) + { + IntEngMovePointer(SurfObj, MousePos.x, MousePos.y, &(GDIDEV(SurfObj)->Pointer.Exclude)); + } /* Only now, update the info in the GDIDEVICE, so EngMovePointer can * use the old values to move the pointer image */ GDIDEV(SurfObj)->Pointer.Pos.x = MousePos.x;