NextCallProc = CallProc->spcpdNext;
CallProc->spcpdNext = NULL;
- DestroyCallProc(NULL,
- CallProc);
+ DestroyCallProc(CallProc);
CallProc = NextCallProc;
}
IntFreeClassMenuName(Class);
}
+#ifdef NEW_CURSORICON
+ if (Class->spicn)
+ UserDereferenceObject(Class->spicn);
+ if (Class->spicnSm)
+ UserDereferenceObject(Class->spicnSm);
+ if (Class->spcur)
+ UserDereferenceObject(Class->spcur);
+#else
if (Class->hIconSmIntern)
IntClassDestroyIcon(Class->hIconSmIntern);
+#endif
pDesk = Class->rpdeskParent;
Class->rpdeskParent = NULL;
Class = DesktopHeapAlloc(Desktop,
ClassSize);
+
if (Class != NULL)
{
/* Simply clone the class */
RtlCopyMemory( Class, BaseClass, ClassSize);
+#ifdef NEW_CURSORICON
+ /* Reference our objects */
+ if (Class->spcur)
+ UserReferenceObject(Class->spcur);
+ if (Class->spicn)
+ UserReferenceObject(Class->spicn);
+ if (Class->spicnSm)
+ UserReferenceObject(Class->spicnSm);
+#endif
+
TRACE("Clone Class 0x%p hM 0x%p\n %S\n",Class, Class->hModule, Class->lpszClientUnicodeMenuName);
/* Restore module address if default user class Ref: Bug 4778 */
NewClass->rpdeskParent = NULL;
NewClass->pclsBase = NewClass;
+#ifdef NEW_CURSORICON
+ if (NewClass->spcur)
+ UserReferenceObject(NewClass->spcur);
+ if (NewClass->spicn)
+ UserReferenceObject(NewClass->spicn);
+ if (NewClass->spicnSm)
+ UserReferenceObject(NewClass->spicnSm);
+#endif
+
+
/* Replace the class in the list */
(void)InterlockedExchangePointer((PVOID*)*ClassLinkPtr,
NewClass);
Class->cbclsExtra = lpwcx->cbClsExtra;
Class->cbwndExtra = lpwcx->cbWndExtra;
Class->hModule = lpwcx->hInstance;
- //// FIXME handles to pointers
+#ifdef NEW_CURSORICON
+ Class->spicn = lpwcx->hIcon ? UserGetCurIconObject(lpwcx->hIcon) : NULL;
+ Class->spcur = lpwcx->hCursor ? UserGetCurIconObject(lpwcx->hCursor) : NULL;
+ Class->spicnSm = lpwcx->hIconSm ? UserGetCurIconObject(lpwcx->hIconSm) : NULL;
+#else
Class->hIcon = lpwcx->hIcon;
Class->hIconSm = lpwcx->hIconSm;
Class->hCursor = lpwcx->hCursor;
+#endif
////
Class->hbrBackground = lpwcx->hbrBackground;
return Ret;
}
-//// Do this for now in anticipation of new cursor icon code.
#ifndef NEW_CURSORICON
-BOOLEAN FASTCALL IntDestroyCurIconObject(PCURICON_OBJECT, PPROCESSINFO);
-#else
-BOOLEAN FASTCALL IntDestroyCurIconObject(PCURICON_OBJECT, BOOLEAN);
-#endif
-
BOOL FASTCALL
IntClassDestroyIcon(HANDLE hCurIcon)
{
ERR("hCurIcon was not found!\n");
return FALSE;
}
-#ifndef NEW_CURSORICON
- Ret = IntDestroyCurIconObject(CurIcon, PsGetCurrentProcessWin32Process());
- /* Note: IntDestroyCurIconObject will remove our reference for us! */
-#else
/* Note: IntDestroyCurIconObject will remove our reference for us! */
- Ret = IntDestroyCurIconObject(CurIcon, TRUE);
-#endif
+ Ret = IntDestroyCurIconObject(CurIcon, GetW32ProcessInfo());
if (!Ret)
{
ERR("hCurIcon was not Destroyed!\n");
}
return Ret;
}
+#endif
ULONG_PTR
UserSetClassLongPtr(IN PCLS Class,
IN BOOL Ansi)
{
ULONG_PTR Ret = 0;
+#ifndef NEW_CURSORICON
HANDLE hIconSmIntern = NULL;
+#endif
/* NOTE: For GCLP_MENUNAME and GCW_ATOM this function may raise an exception! */
}
break;
+#ifdef NEW_CURSORICON
+ case GCLP_HCURSOR:
+ {
+ PCURICON_OBJECT NewCursor = NULL;
+
+ if (NewLong)
+ {
+ NewCursor = UserGetCurIconObject((HCURSOR)NewLong);
+ if (!NewCursor)
+ {
+ EngSetLastError(ERROR_INVALID_CURSOR_HANDLE);
+ return 0;
+ }
+ }
+
+ if (Class->spcur)
+ {
+ Ret = (ULONG_PTR)UserHMGetHandle(Class->spcur);
+ UserDereferenceObject(Class->spcur);
+ }
+ else
+ {
+ Ret = 0;
+ }
+
+ if (Ret == NewLong)
+ {
+ /* It's a nop */
+ return Ret;
+ }
+
+ Class->spcur = NewCursor;
+
+ /* Update the clones */
+ Class = Class->pclsClone;
+ while (Class != NULL)
+ {
+ if (Class->spcur)
+ UserDereferenceObject(Class->spcur);
+ if (NewCursor)
+ UserReferenceObject(NewCursor);
+ Class->spcur = NewCursor;
+ Class = Class->pclsNext;
+ }
+
+ break;
+ }
+#else
case GCLP_HCURSOR:
/* FIXME: Get handle from pointer to CURSOR object */
Ret = (ULONG_PTR)Class->hCursor;
Class = Class->pclsNext;
}
break;
+#endif
// MSDN:
// hIconSm, A handle to a small icon that is associated with the window class.
// the hIcon member for an icon of the appropriate size to use as the small icon.
//
case GCLP_HICON:
+#ifdef NEW_CURSORICON
+ {
+ PCURICON_OBJECT NewIcon = NULL;
+ PCURICON_OBJECT NewSmallIcon = NULL;
+
+ if (NewLong)
+ {
+ NewIcon = UserGetCurIconObject((HCURSOR)NewLong);
+ if (!NewIcon)
+ {
+ EngSetLastError(ERROR_INVALID_ICON_HANDLE);
+ return 0;
+ }
+ }
+
+ if (Class->spicn)
+ {
+ Ret = (ULONG_PTR)UserHMGetHandle(Class->spicn);
+ UserDereferenceObject(Class->spicn);
+ }
+ else
+ {
+ Ret = 0;
+ }
+
+ if (Ret == NewLong)
+ {
+ /* It's a nop */
+ return Ret;
+ }
+
+ if (Ret && (Class->CSF_flags & CSF_CACHEDSMICON))
+ {
+ /* We will change the small icon */
+ UserDereferenceObject(Class->spicnSm);
+ Class->spicnSm = NULL;
+ Class->CSF_flags &= ~CSF_CACHEDSMICON;
+ }
+
+ if (NewLong && !Class->spicnSm)
+ {
+ /* Create the new small icon from the new large(?) one */
+ HICON SmallIconHandle = co_IntCopyImage(
+ (HICON)NewLong,
+ IMAGE_ICON,
+ UserGetSystemMetrics( SM_CXSMICON ),
+ UserGetSystemMetrics( SM_CYSMICON ),
+ 0);
+ if (SmallIconHandle)
+ {
+ /* So use it */
+ NewSmallIcon = Class->spicnSm = UserGetCurIconObject(SmallIconHandle);
+ /* Let the handle go, we have the reference on the object */
+ NtUserDestroyCursor(SmallIconHandle, FALSE);
+ Class->CSF_flags |= CSF_CACHEDSMICON;
+ }
+ }
+
+ Class->spicn = NewIcon;
+
+ /* Update the clones */
+ Class = Class->pclsClone;
+ while (Class != NULL)
+ {
+ if (Class->spicn)
+ UserDereferenceObject(Class->spicn);
+ if (NewIcon)
+ UserReferenceObject(NewIcon);
+ Class->spicn = NewIcon;
+ if (NewSmallIcon)
+ {
+ if (Class->spicnSm)
+ UserDereferenceObject(Class->spicnSm);
+ UserReferenceObject(NewSmallIcon);
+ Class->spicnSm = NewSmallIcon;
+ Class->CSF_flags |= CSF_CACHEDSMICON;
+ }
+ Class = Class->pclsNext;
+ }
+ break;
+ }
+#else
/* FIXME: Get handle from pointer to ICON object */
Ret = (ULONG_PTR)Class->hIcon;
if (Class->hIcon == (HANDLE)NewLong) break;
Class = Class->pclsNext;
}
break;
+#endif
case GCLP_HICONSM:
+#ifdef NEW_CURSORICON
+ {
+ PCURICON_OBJECT NewSmallIcon = NULL;
+
+ if (NewLong)
+ {
+ NewSmallIcon = UserGetCurIconObject((HCURSOR)NewLong);
+ if (!NewSmallIcon)
+ {
+ EngSetLastError(ERROR_INVALID_ICON_HANDLE);
+ return 0;
+ }
+ }
+
+ if (Class->spicnSm)
+ {
+ Ret = (ULONG_PTR)UserHMGetHandle(Class->spicnSm);
+ UserDereferenceObject(Class->spicnSm);
+ }
+ else
+ {
+ Ret = 0;
+ }
+
+ Class->CSF_flags &= ~CSF_CACHEDSMICON;
+ Class->spicnSm = NewSmallIcon;
+
+ /* Update the clones */
+ Class = Class->pclsClone;
+ while (Class != NULL)
+ {
+ if (Class->spicnSm)
+ UserDereferenceObject(Class->spicnSm);
+ if (NewSmallIcon)
+ UserReferenceObject(NewSmallIcon);
+ Class->CSF_flags &= ~CSF_CACHEDSMICON;
+ Class->spicnSm = NewSmallIcon;
+ Class = Class->pclsNext;
+ }
+ }
+ break;
+#else
/* FIXME: Get handle from pointer to ICON object */
Ret = (ULONG_PTR)Class->hIconSm;
if (Class->hIconSm == (HANDLE)NewLong) break;
Class = Class->pclsNext;
}
break;
+#endif
case GCLP_HMODULE:
Ret = (ULONG_PTR)Class->hModule;
lpwcx->cbClsExtra = Class->cbclsExtra;
lpwcx->cbWndExtra = Class->cbwndExtra;
+#ifdef NEW_CURSORICON
+ lpwcx->hIcon = Class->spicn ? UserHMGetHandle(Class->spicn) : NULL;
+ lpwcx->hCursor = Class->spcur ? UserHMGetHandle(Class->spcur) : NULL;
+ lpwcx->hIconSm = Class->spicnSm ? UserHMGetHandle(Class->spicnSm) : NULL;
+#else
lpwcx->hIcon = Class->hIcon; /* FIXME: Get handle from pointer */
lpwcx->hCursor = Class->hCursor; /* FIXME: Get handle from pointer */
+ /* FIXME: Get handle from pointer */
+ lpwcx->hIconSm = Class->hIconSm ? Class->hIconSm : Class->hIconSmIntern;
+#endif
lpwcx->hbrBackground = Class->hbrBackground;
/* Copy non-string to user first. */
/* FIXME: Return the string? Okay! This is performed in User32! */
//lpwcx->lpszClassName = (LPCWSTR)((ULONG_PTR)Class->atomClassName);
- /* FIXME: Get handle from pointer */
- lpwcx->hIconSm = Class->hIconSm ? Class->hIconSm : Class->hIconSmIntern;
-
return TRUE;
}