[Wine-devel] Eter's patch is applied to winehq repo 10/15/12
builder-robot на etersoft.ru
builder-robot на etersoft.ru
Пн Окт 15 23:30:30 MSK 2012
New Etersoft's patches since last build time:
commit 3d4db9f28f13a360e87a1a057248c87c06d82b72
Author: Sergey Guralnik <serhio на etersoft.ru>
user32: Add internal class small icons.
---
commit 3d4db9f28f13a360e87a1a057248c87c06d82b72
Author: Sergey Guralnik <serhio на etersoft.ru>
Date: Fri Oct 12 10:36:10 2012 +0400
user32: Add internal class small icons.
diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index 8b5060a..a66f0db 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 8e4be6a..2f497a5 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);
Подробная информация о списке рассылки Wine-devel