Jacek Caban : user32: Use get_class_info for GetClasInfoEx implementation.
Alexandre Julliard
julliard at winehq.org
Mon Mar 7 16:04:56 CST 2022
Module: wine
Branch: master
Commit: 7dfdf5a5caf74bacd1dcfe0db6a8d104d9563279
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7dfdf5a5caf74bacd1dcfe0db6a8d104d9563279
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Mar 7 14:41:23 2022 +0100
user32: Use get_class_info for GetClasInfoEx implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/class.c | 125 +++++++++++++++------------------------------
dlls/user32/user_private.h | 3 +-
dlls/user32/win.c | 2 +-
3 files changed, 45 insertions(+), 85 deletions(-)
diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index 647a6b9b2bf..1855a2c3804 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -401,36 +401,6 @@ static const WCHAR *CLASS_GetVersionedName( const WCHAR *name, UINT *basename_of
return ret;
}
-/***********************************************************************
- * CLASS_FindClass
- *
- * Return a pointer to the class.
- */
-static CLASS *CLASS_FindClass( LPCWSTR name, HINSTANCE hinstance, UNICODE_STRING *name_str )
-{
- CLASS *class;
-
- if (name != (LPCWSTR)DESKTOP_CLASS_ATOM && (IS_INTRESOURCE(name) || wcsicmp( name, L"Message" )))
- GetDesktopWindow(); /* create the desktop window to trigger builtin class registration */
-
- if (!name) return NULL;
-
- name = CLASS_GetVersionedName( name, NULL, NULL, TRUE );
-
- while (!(class = find_class( hinstance, name )))
- {
- if (IS_INTRESOURCE( name )) break;
- if (!is_comctl32_class( name )) break;
- if (GetModuleHandleW( L"comctl32.dll" )) break;
- if (!LoadLibraryW( L"comctl32.dll" )) break;
- TRACE( "%s retrying after loading comctl32\n", debugstr_w(name) );
- }
-
- if (!class) TRACE("%s %p -> not found\n", debugstr_w(name), hinstance);
- else if (name_str) init_class_name( name_str, name );
- return class;
-}
-
/***********************************************************************
* CLASS_RegisterClass
*
@@ -1264,17 +1234,52 @@ BOOL WINAPI GetClassInfoW( HINSTANCE hInstance, LPCWSTR name, WNDCLASSW *wc )
return ret;
}
-ATOM get_class_info( HINSTANCE instance, const WCHAR *name, UNICODE_STRING *name_str )
+ATOM get_class_info( HINSTANCE instance, const WCHAR *name, WNDCLASSEXW *info,
+ UNICODE_STRING *name_str, BOOL ansi )
{
CLASS *class;
ATOM atom;
- if (!(class = CLASS_FindClass( name, instance, name_str )))
+ if (!name_str && !instance) instance = user32_module;
+
+ if (name != (LPCWSTR)DESKTOP_CLASS_ATOM && (IS_INTRESOURCE(name) || wcsicmp( name, L"Message" )))
+ GetDesktopWindow(); /* create the desktop window to trigger builtin class registration */
+
+ name = CLASS_GetVersionedName( name, NULL, NULL, TRUE );
+
+ while (name && !(class = find_class( instance, name )))
+ {
+ if (IS_INTRESOURCE( name )) break;
+ if (!is_comctl32_class( name )) break;
+ if (GetModuleHandleW( L"comctl32.dll" )) break;
+ if (!LoadLibraryW( L"comctl32.dll" )) break;
+ TRACE( "%s retrying after loading comctl32\n", debugstr_w(name) );
+ }
+
+ if (!class)
{
+ TRACE("%s %p -> not found\n", debugstr_w(name), instance);
SetLastError( ERROR_CLASS_DOES_NOT_EXIST );
- return FALSE;
+ return 0;
+ }
+
+ if (info)
+ {
+ info->style = class->style;
+ info->lpfnWndProc = WINPROC_GetProc( class->winproc, !ansi );
+ info->cbClsExtra = class->cbClsExtra;
+ info->cbWndExtra = class->cbWndExtra;
+ info->hInstance = (instance == user32_module) ? 0 : instance;
+ info->hIcon = class->hIcon;
+ info->hIconSm = class->hIconSm ? class->hIconSm : class->hIconSmIntern;
+ info->hCursor = class->hCursor;
+ info->hbrBackground = class->hbrBackground;
+ info->lpszMenuName = ansi ? (const WCHAR *)CLASS_GetMenuNameA( class )
+ : CLASS_GetMenuNameW( class );
+ info->lpszClassName = name;
}
+ if (name_str) init_class_name( name_str, name );
atom = class->atomName;
release_class_ptr( class );
return atom;
@@ -1286,7 +1291,6 @@ ATOM get_class_info( HINSTANCE instance, const WCHAR *name, UNICODE_STRING *name
BOOL WINAPI GetClassInfoExA( HINSTANCE hInstance, LPCSTR name, WNDCLASSEXA *wc )
{
ATOM atom;
- CLASS *classPtr;
TRACE("%p %s %p\n", hInstance, debugstr_a(name), wc);
@@ -1296,35 +1300,15 @@ BOOL WINAPI GetClassInfoExA( HINSTANCE hInstance, LPCSTR name, WNDCLASSEXA *wc )
return FALSE;
}
- if (!hInstance) hInstance = user32_module;
-
if (!IS_INTRESOURCE(name))
{
WCHAR nameW[MAX_ATOM_LEN + 1];
if (!MultiByteToWideChar( CP_ACP, 0, name, -1, nameW, ARRAY_SIZE( nameW )))
return FALSE;
- classPtr = CLASS_FindClass( nameW, hInstance, NULL );
- }
- else classPtr = CLASS_FindClass( (LPCWSTR)name, hInstance, NULL );
-
- if (!classPtr)
- {
- SetLastError( ERROR_CLASS_DOES_NOT_EXIST );
- return FALSE;
+ atom = get_class_info( hInstance, nameW, (WNDCLASSEXW *)wc, NULL, TRUE );
}
- wc->style = classPtr->style;
- wc->lpfnWndProc = WINPROC_GetProc( classPtr->winproc, FALSE );
- wc->cbClsExtra = classPtr->cbClsExtra;
- wc->cbWndExtra = classPtr->cbWndExtra;
- wc->hInstance = (hInstance == user32_module) ? 0 : hInstance;
- wc->hIcon = classPtr->hIcon;
- wc->hIconSm = classPtr->hIconSm ? classPtr->hIconSm : classPtr->hIconSmIntern;
- wc->hCursor = classPtr->hCursor;
- wc->hbrBackground = classPtr->hbrBackground;
- wc->lpszMenuName = CLASS_GetMenuNameA( classPtr );
- wc->lpszClassName = name;
- atom = classPtr->atomName;
- release_class_ptr( classPtr );
+ else atom = get_class_info( hInstance, (const WCHAR *)name, (WNDCLASSEXW *)wc, NULL, TRUE );
+ if (atom) wc->lpszClassName = name;
/* We must return the atom of the class here instead of just TRUE. */
return atom;
@@ -1336,9 +1320,6 @@ BOOL WINAPI GetClassInfoExA( HINSTANCE hInstance, LPCSTR name, WNDCLASSEXA *wc )
*/
BOOL WINAPI GetClassInfoExW( HINSTANCE hInstance, LPCWSTR name, WNDCLASSEXW *wc )
{
- ATOM atom;
- CLASS *classPtr;
-
TRACE("%p %s %p\n", hInstance, debugstr_w(name), wc);
if (!wc)
@@ -1347,29 +1328,7 @@ BOOL WINAPI GetClassInfoExW( HINSTANCE hInstance, LPCWSTR name, WNDCLASSEXW *wc
return FALSE;
}
- if (!hInstance) hInstance = user32_module;
-
- if (!(classPtr = CLASS_FindClass( name, hInstance, NULL )))
- {
- SetLastError( ERROR_CLASS_DOES_NOT_EXIST );
- return FALSE;
- }
- wc->style = classPtr->style;
- wc->lpfnWndProc = WINPROC_GetProc( classPtr->winproc, TRUE );
- wc->cbClsExtra = classPtr->cbClsExtra;
- wc->cbWndExtra = classPtr->cbWndExtra;
- wc->hInstance = (hInstance == user32_module) ? 0 : hInstance;
- wc->hIcon = classPtr->hIcon;
- wc->hIconSm = classPtr->hIconSm ? classPtr->hIconSm : classPtr->hIconSmIntern;
- wc->hCursor = classPtr->hCursor;
- wc->hbrBackground = classPtr->hbrBackground;
- wc->lpszMenuName = CLASS_GetMenuNameW( classPtr );
- wc->lpszClassName = name;
- atom = classPtr->atomName;
- release_class_ptr( classPtr );
-
- /* We must return the atom of the class here instead of just TRUE. */
- return atom;
+ return get_class_info( hInstance, name, wc, NULL, FALSE );
}
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 6dc0cf8b3a1..f0d131949d7 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -160,7 +160,8 @@ extern BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar
LRESULT *result, BOOL unicode, enum wm_char_mapping mapping ) DECLSPEC_HIDDEN;
extern void winproc_init(void) DECLSPEC_HIDDEN;
-extern ATOM get_class_info( HINSTANCE instance, const WCHAR *name, UNICODE_STRING *name_str ) DECLSPEC_HIDDEN;
+extern ATOM get_class_info( HINSTANCE instance, const WCHAR *name, WNDCLASSEXW *info,
+ UNICODE_STRING *name_str, BOOL ansi ) DECLSPEC_HIDDEN;
/* kernel callbacks */
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 341c66c3d2d..688988bebd0 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -1402,7 +1402,7 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
CBT_CREATEWNDW cbtc;
CREATESTRUCTW cbcs;
- if (!get_class_info( module, className, &class )) return FALSE;
+ if (!get_class_info( module, className, NULL, &class, FALSE )) return FALSE;
TRACE("%s %s%s%s ex=%08x style=%08x %d,%d %dx%d parent=%p menu=%p inst=%p params=%p\n",
unicode ? debugstr_w(cs->lpszName) : debugstr_a((LPCSTR)cs->lpszName),
More information about the wine-cvs
mailing list