From: Helix Graziani helix.graziani@hotmail.com
--- dlls/uxtheme/system.c | 17 +++++++++++++++++ dlls/uxtheme/tests/system.c | 34 ++++++++++++++++++++++++++++++++++ dlls/uxtheme/uxtheme.spec | 1 + 3 files changed, 52 insertions(+)
diff --git a/dlls/uxtheme/system.c b/dlls/uxtheme/system.c index 25f495d29f3..1b9513f8821 100644 --- a/dlls/uxtheme/system.c +++ b/dlls/uxtheme/system.c @@ -1256,3 +1256,20 @@ BOOL WINAPI ThemeHooksRemove(void) UnregisterUserApiHook(); return TRUE; } + +/********************************************************************** + * ShouldSystemUseDarkMode (UXTHEME.138) + * + * RETURNS + * Whether or not the system should use dark mode. + */ +BOOL WINAPI ShouldSystemUseDarkMode(void) +{ + DWORD light_theme = TRUE, light_theme_size = sizeof(light_theme); + + RegGetValueW(HKEY_CURRENT_USER, + L"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", + L"AppsUseLightTheme", RRF_RT_REG_DWORD, NULL, &light_theme, &light_theme_size); + + return !light_theme; +} diff --git a/dlls/uxtheme/tests/system.c b/dlls/uxtheme/tests/system.c index 2e769625dab..16f0982a8ef 100644 --- a/dlls/uxtheme/tests/system.c +++ b/dlls/uxtheme/tests/system.c @@ -48,6 +48,7 @@ static HDC (WINAPI *pGetBufferedPaintTargetDC)(HPAINTBUFFER); static HRESULT (WINAPI *pGetBufferedPaintTargetRect)(HPAINTBUFFER, RECT *); static HRESULT (WINAPI *pGetThemeIntList)(HTHEME, int, int, int, INTLIST *); static HRESULT (WINAPI *pGetThemeTransitionDuration)(HTHEME, int, int, int, int, DWORD *); +static BOOL (WINAPI *pShouldSystemUseDarkMode)(void);
static LONG (WINAPI *pDisplayConfigGetDeviceInfo)(DISPLAYCONFIG_DEVICE_INFO_HEADER *); static LONG (WINAPI *pDisplayConfigSetDeviceInfo)(DISPLAYCONFIG_DEVICE_INFO_HEADER *); @@ -2597,6 +2598,38 @@ static void test_theme(void) DestroyWindow(hwnd); }
+static void test_ShouldSystemUseDarkMode(void) +{ + DWORD light_theme, light_theme_size = sizeof(light_theme), last_error; + BOOL result; + LSTATUS ls; + + pShouldSystemUseDarkMode = (void *)GetProcAddress(GetModuleHandleA("uxtheme.dll"), + MAKEINTRESOURCEA(138)); + if (!pShouldSystemUseDarkMode) + { + win_skip("ShouldSystemUseDarkMode() is unavailable.\n"); + return; + } + + ls = RegGetValueW(HKEY_CURRENT_USER, + L"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", + L"AppsUseLightTheme", RRF_RT_REG_DWORD, NULL, &light_theme, &light_theme_size); + if (ls == ERROR_FILE_NOT_FOUND) + { + light_theme = 1; + ls = 0; + } + ok(ls == 0, "RegGetValue failed: %ld.\n", ls); + + /* Call ShouldSystemUseDarkMode() and check for errors */ + SetLastError(0xdeadbeef); + result = pShouldSystemUseDarkMode(); + last_error = GetLastError(); + ok(last_error == 0xdeadbeef, "ShouldSystemUseDarkMode set last error: %ld.\n", last_error); + ok(result == !light_theme, "Expected value %d, got %d.\n", !light_theme, result); +} + START_TEST(system) { ULONG_PTR ctx_cookie; @@ -2622,6 +2655,7 @@ START_TEST(system) test_DrawThemeBackgroundEx(); test_GetThemeBackgroundRegion(); test_theme(); + test_ShouldSystemUseDarkMode();
if (load_v6_module(&ctx_cookie, &ctx)) { diff --git a/dlls/uxtheme/uxtheme.spec b/dlls/uxtheme/uxtheme.spec index c60254b677d..a5bfb88c49a 100644 --- a/dlls/uxtheme/uxtheme.spec +++ b/dlls/uxtheme/uxtheme.spec @@ -42,6 +42,7 @@ 61 stdcall OpenThemeDataEx(ptr wstr long) 62 stub -noname ServerClearStockObjects 63 stub -noname MarkSelection +138 stdcall -noname ShouldSystemUseDarkMode()
# Standard functions @ stdcall BeginBufferedAnimation(ptr ptr ptr long ptr ptr ptr ptr)