From 3d4db9f28f13a360e87a1a057248c87c06d82b72 Mon Sep 17 00:00:00 2001 From: Sergey Guralnik Date: Fri, 12 Oct 2012 10:36:10 +0400 Subject: [PATCH] user32: Add internal class small icons. --- dlls/user32/class.c | 32 +++++++++++++++++++++++++++++--- dlls/user32/tests/class.c | 5 ----- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/dlls/user32/class.c b/dlls/user32/class.c index 8b5060a628b..a66f0dba72d 100644 --- a/dlls/user32/class.c +++ b/dlls/user32/class.c @@ -56,6 +56,7 @@ typedef struct tagCLASS HINSTANCE hInstance; /* Module that created the task */ HICON hIcon; /* Default icon */ HICON hIconSm; /* Default small icon */ + HICON hIconSmIntern; /* Internal small icon, derived from hIcon */ HCURSOR hCursor; /* Default cursor */ HBRUSH hbrBackground; /* Default background */ ATOM atomName; /* Name of the class */ @@ -518,6 +519,10 @@ ATOM WINAPI RegisterClassExA( const WNDCLASSEXA* wc ) classPtr->hIcon = wc->hIcon; classPtr->hIconSm = wc->hIconSm; + classPtr->hIconSmIntern = wc->hIcon && !wc->hIconSm ? + CopyImage( wc->hIcon, IMAGE_ICON, + GetSystemMetrics( SM_CXSMICON ), + GetSystemMetrics( SM_CYSMICON ), 0 ) : NULL; classPtr->hCursor = wc->hCursor; classPtr->hbrBackground = wc->hbrBackground; classPtr->winproc = WINPROC_AllocProc( wc->lpfnWndProc, FALSE ); @@ -556,6 +561,10 @@ ATOM WINAPI RegisterClassExW( const WNDCLASSEXW* wc ) classPtr->hIcon = wc->hIcon; classPtr->hIconSm = wc->hIconSm; + classPtr->hIconSmIntern = wc->hIcon && !wc->hIconSm ? + CopyImage( wc->hIcon, IMAGE_ICON, + GetSystemMetrics( SM_CXSMICON ), + GetSystemMetrics( SM_CYSMICON ), 0 ) : NULL; classPtr->hCursor = wc->hCursor; classPtr->hbrBackground = wc->hbrBackground; classPtr->winproc = WINPROC_AllocProc( wc->lpfnWndProc, TRUE ); @@ -741,7 +750,7 @@ static ULONG_PTR CLASS_GetClassLong( HWND hwnd, INT offset, UINT size, retvalue = (ULONG_PTR)class->hIcon; break; case GCLP_HICONSM: - retvalue = (ULONG_PTR)class->hIconSm; + retvalue = (ULONG_PTR)(class->hIconSm ? class->hIconSm : class->hIconSmIntern); break; case GCL_STYLE: retvalue = class->style; @@ -884,10 +893,27 @@ static ULONG_PTR CLASS_SetClassLong( HWND hwnd, INT offset, LONG_PTR newval, break; case GCLP_HICON: retval = (ULONG_PTR)class->hIcon; + if (retval && class->hIconSmIntern) + { + DestroyIcon(class->hIconSmIntern); + class->hIconSmIntern = NULL; + } + if (newval && !class->hIconSm) + class->hIconSmIntern = CopyImage( (HICON)newval, IMAGE_ICON, + GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); class->hIcon = (HICON)newval; break; case GCLP_HICONSM: retval = (ULONG_PTR)class->hIconSm; + if (retval && !newval) + class->hIconSmIntern = class->hIcon ? CopyImage( class->hIcon, IMAGE_ICON, + GetSystemMetrics( SM_CXSMICON ), + GetSystemMetrics( SM_CYSMICON ), 0 ) : NULL; + else if (!retval && newval && class->hIconSmIntern) + { + DestroyIcon(class->hIconSmIntern); + class->hIconSmIntern = NULL; + } class->hIconSm = (HICON)newval; break; case GCL_STYLE: @@ -1099,7 +1125,7 @@ BOOL WINAPI GetClassInfoExA( HINSTANCE hInstance, LPCSTR name, WNDCLASSEXA *wc ) wc->cbWndExtra = classPtr->cbWndExtra; wc->hInstance = (hInstance == user32_module) ? 0 : hInstance; wc->hIcon = classPtr->hIcon; - wc->hIconSm = classPtr->hIconSm; + wc->hIconSm = classPtr->hIconSm ? classPtr->hIconSm : classPtr->hIconSmIntern; wc->hCursor = classPtr->hCursor; wc->hbrBackground = classPtr->hbrBackground; wc->lpszMenuName = CLASS_GetMenuNameA( classPtr ); @@ -1141,7 +1167,7 @@ BOOL WINAPI GetClassInfoExW( HINSTANCE hInstance, LPCWSTR name, WNDCLASSEXW *wc wc->cbWndExtra = classPtr->cbWndExtra; wc->hInstance = (hInstance == user32_module) ? 0 : hInstance; wc->hIcon = classPtr->hIcon; - wc->hIconSm = classPtr->hIconSm; + wc->hIconSm = classPtr->hIconSm ? classPtr->hIconSm : classPtr->hIconSmIntern; wc->hCursor = classPtr->hCursor; wc->hbrBackground = classPtr->hbrBackground; wc->lpszMenuName = CLASS_GetMenuNameW( classPtr ); diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c index 8e4be6a24bd..2f497a55f9c 100644 --- a/dlls/user32/tests/class.c +++ b/dlls/user32/tests/class.c @@ -999,11 +999,9 @@ static void test_icons(void) ok(GetClassInfoExW(hinst, cls_name, &ret_wcex), "Class info was not retrieved\n"); ok(wcex.hIcon == ret_wcex.hIcon, "Icons don't match\n"); -todo_wine ok(ret_wcex.hIconSm != NULL, "hIconSm should be non-zero handle\n"); hsmicon = (HICON)GetClassLongPtrW(hwnd, GCLP_HICONSM); -todo_wine ok(hsmicon != NULL, "GetClassLong should return non-zero handle\n"); hsmallnew = CopyImage(wcex.hIcon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), @@ -1016,7 +1014,6 @@ todo_wine SetClassLongPtrW(hwnd, GCLP_HICONSM, 0); hsmicon = (HICON)GetClassLongPtrW(hwnd, GCLP_HICONSM); -todo_wine ok( hsmicon != NULL, "GetClassLong should return non-zero handle\n"); SetClassLongPtrW(hwnd, GCLP_HICON, 0); @@ -1024,10 +1021,8 @@ todo_wine SetClassLongPtrW(hwnd, GCLP_HICON, (LONG_PTR)LoadIconW(NULL, (LPCWSTR)IDI_QUESTION)); hsmicon = (HICON)GetClassLongPtrW(hwnd, GCLP_HICONSM); -todo_wine ok(hsmicon != NULL, "GetClassLong should return non-zero handle\n"); UnregisterClassW(cls_name, hinst); -todo_wine ok(GetIconInfo(hsmicon, &icinf), "Icon should NOT be destroyed\n"); DestroyIcon(hsmallnew);