Author: jgardou
Date: Thu Oct 23 11:46:01 2014
New Revision: 64920

URL: http://svn.reactos.org/svn/reactos?rev=64920&view=rev
Log:
[WIN32K]
 - Use shared icon handles when copying the small class icon from the larger 
one.
CORE-7575

Modified:
    trunk/reactos/win32ss/user/ntuser/class.c
    trunk/reactos/win32ss/user/ntuser/window.c

Modified: trunk/reactos/win32ss/user/ntuser/class.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/class.c?rev=64920&r1=64919&r2=64920&view=diff
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/class.c   [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/class.c   [iso-8859-1] Thu Oct 23 
11:46:01 2014
@@ -248,10 +248,10 @@
 #ifdef NEW_CURSORICON
     if (Class->spicn)
         UserDereferenceObject(Class->spicn);
+    if (Class->spcur)
+        UserDereferenceObject(Class->spcur);
     if (Class->spicnSm)
         UserDereferenceObject(Class->spicnSm);
-    if (Class->spcur)
-        UserDereferenceObject(Class->spcur);
 #else
     if (Class->hIconSmIntern)
         IntClassDestroyIcon(Class->hIconSmIntern);
@@ -1976,18 +1976,31 @@
             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);
+                HICON SmallIconHandle = NULL;
+                if((NewIcon->CURSORF_flags & (CURSORF_LRSHARED | 
CURSORF_FROMRESOURCE))
+                        == (CURSORF_LRSHARED | CURSORF_FROMRESOURCE))
+                {
+                    SmallIconHandle = co_IntCopyImage(
+                        (HICON)NewLong,
+                        IMAGE_ICON,
+                        UserGetSystemMetrics( SM_CXSMICON ),
+                        UserGetSystemMetrics( SM_CYSMICON ),
+                        LR_COPYFROMRESOURCE | LR_SHARED);
+                }
+                if (!SmallIconHandle)
+                {
+                    /* Retry without copying from resource */
+                    SmallIconHandle = co_IntCopyImage(
+                        (HICON)NewLong,
+                        IMAGE_ICON,
+                        UserGetSystemMetrics( SM_CXSMICON ),
+                        UserGetSystemMetrics( SM_CYSMICON ),
+                        LR_SHARED);
+                }
                 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;
                 }
             }

Modified: trunk/reactos/win32ss/user/ntuser/window.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/window.c?rev=64920&r1=64919&r2=64920&view=diff
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/window.c  [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/window.c  [iso-8859-1] Thu Oct 23 
11:46:01 2014
@@ -1677,17 +1677,31 @@
 #ifdef NEW_CURSORICON
    if (Class->spicn && !Class->spicnSm)
    {
-       HICON IconSmHandle = co_IntCopyImage(
-           UserHMGetHandle(Class->spicn),
-           IMAGE_ICON,
-           UserGetSystemMetrics( SM_CXSMICON ),
-           UserGetSystemMetrics( SM_CYSMICON ),
-           0);
+       HICON IconSmHandle = NULL;
+       if((Class->spicn->CURSORF_flags & (CURSORF_LRSHARED | 
CURSORF_FROMRESOURCE))
+               == (CURSORF_LRSHARED | CURSORF_FROMRESOURCE))
+       {
+           IconSmHandle = co_IntCopyImage(
+               UserHMGetHandle(Class->spicn),
+               IMAGE_ICON,
+               UserGetSystemMetrics( SM_CXSMICON ),
+               UserGetSystemMetrics( SM_CYSMICON ),
+               LR_COPYFROMRESOURCE | LR_SHARED);
+       }
+       if (!IconSmHandle)
+       {
+           /* Retry without copying from resource */
+           IconSmHandle = co_IntCopyImage(
+               UserHMGetHandle(Class->spicn),
+               IMAGE_ICON,
+               UserGetSystemMetrics( SM_CXSMICON ),
+               UserGetSystemMetrics( SM_CYSMICON ),
+               LR_SHARED);
+       }
+
        if (IconSmHandle)
        {
            Class->spicnSm = UserGetCurIconObject(IconSmHandle);
-           /* We can delete the handle, only the pointer is of interest */
-           NtUserDestroyCursor(IconSmHandle, FALSE);
            Class->CSF_flags |= CSF_CACHEDSMICON;
        }
    }


Reply via email to