Commit eedad8a8 authored by Zhiyi Zhang's avatar Zhiyi Zhang Committed by Alexandre Julliard

user32: Load uxtheme when theming is active.

In comctl32 DllMain(), IsThemeActive() is a delay-loaded function and shouldn't be called in DllMain(). Instead, tests showed that uxtheme should be loaded by user32. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51540Signed-off-by: 's avatarZhiyi Zhang <zzhang@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent cbf7bdce
...@@ -208,9 +208,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) ...@@ -208,9 +208,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
TRACKBAR_Register (); TRACKBAR_Register ();
TREEVIEW_Register (); TREEVIEW_Register ();
UPDOWN_Register (); UPDOWN_Register ();
/* Call IsThemeActive() so that delay-loaded uxtheme.dll is loaded for hooking user32 */
IsThemeActive();
break; break;
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
......
...@@ -539,6 +539,19 @@ static void register_builtin( const struct builtin_class_descr *descr ) ...@@ -539,6 +539,19 @@ static void register_builtin( const struct builtin_class_descr *descr )
release_class_ptr( classPtr ); release_class_ptr( classPtr );
} }
static void load_uxtheme(void)
{
BOOL (WINAPI * pIsThemeActive)(void);
HMODULE uxtheme;
uxtheme = LoadLibraryA("uxtheme.dll");
if (uxtheme)
{
pIsThemeActive = (void *)GetProcAddress(uxtheme, "IsThemeActive");
if (!pIsThemeActive || !pIsThemeActive())
FreeLibrary(uxtheme);
}
}
/*********************************************************************** /***********************************************************************
* register_builtins * register_builtins
...@@ -557,6 +570,9 @@ static BOOL WINAPI register_builtins( INIT_ONCE *once, void *param, void **conte ...@@ -557,6 +570,9 @@ static BOOL WINAPI register_builtins( INIT_ONCE *once, void *param, void **conte
register_builtin( &SCROLL_builtin_class ); register_builtin( &SCROLL_builtin_class );
register_builtin( &STATIC_builtin_class ); register_builtin( &STATIC_builtin_class );
register_builtin( &IME_builtin_class ); register_builtin( &IME_builtin_class );
/* Load uxtheme.dll so that standard scrollbars and dialogs are hooked for theming support */
load_uxtheme();
return TRUE; return TRUE;
} }
......
...@@ -1511,6 +1511,7 @@ static void test_uxtheme(void) ...@@ -1511,6 +1511,7 @@ static void test_uxtheme(void)
dll_loaded = !!GetModuleHandleA("comctl32.dll"); dll_loaded = !!GetModuleHandleA("comctl32.dll");
ok(!dll_loaded, "Expected comctl32.dll not loaded.\n"); ok(!dll_loaded, "Expected comctl32.dll not loaded.\n");
dll_loaded = !!GetModuleHandleA("uxtheme.dll"); dll_loaded = !!GetModuleHandleA("uxtheme.dll");
todo_wine_if(dll_loaded)
ok(!dll_loaded, "Expected uxtheme.dll not loaded.\n"); ok(!dll_loaded, "Expected uxtheme.dll not loaded.\n");
/* Creating a window triggers uxtheme load when theming is active */ /* Creating a window triggers uxtheme load when theming is active */
...@@ -1531,7 +1532,6 @@ static void test_uxtheme(void) ...@@ -1531,7 +1532,6 @@ static void test_uxtheme(void)
is_theme_active = pIsThemeActive(); is_theme_active = pIsThemeActive();
FreeLibrary(uxtheme); FreeLibrary(uxtheme);
todo_wine_if(is_theme_active)
ok(dll_loaded == is_theme_active, "Expected uxtheme %s when theming is %s.\n", ok(dll_loaded == is_theme_active, "Expected uxtheme %s when theming is %s.\n",
is_theme_active ? "loaded" : "not loaded", is_theme_active ? "active" : "inactive"); is_theme_active ? "loaded" : "not loaded", is_theme_active ? "active" : "inactive");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment