From 91e54e5f6d33ff17ce6ab904fbdcdeb6497de8cb Mon Sep 17 00:00:00 2001 From: Helix Graziani Date: Tue, 26 Sep 2023 20:03:44 -0400 Subject: [PATCH] uxtheme: Add ShouldSystemUseDarkMode. --- dlls/uxtheme/system.c | 17 +++++++++++++++++ dlls/uxtheme/tests/system.c | 33 +++++++++++++++++++++++++++++++++ dlls/uxtheme/uxtheme.spec | 1 + 3 files changed, 51 insertions(+) diff --git a/dlls/uxtheme/system.c b/dlls/uxtheme/system.c index 25f495d29f3..156051406e3 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"SystemUsesLightTheme", 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..390baece969 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 *); @@ -74,6 +75,8 @@ static void init_funcs(void) HMODULE gdi32 = GetModuleHandleA("gdi32.dll"); HMODULE uxtheme = GetModuleHandleA("uxtheme.dll"); + pShouldSystemUseDarkMode = (void *)GetProcAddress(uxtheme, MAKEINTRESOURCEA(138)); + #define GET_PROC(module, func) \ p##func = (void *)GetProcAddress(module, #func); \ if (!p##func) \ @@ -2597,6 +2600,35 @@ 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; + + if (!pShouldSystemUseDarkMode) + { + win_skip("ShouldSystemUseDarkMode() is unavailable.\n"); + return; + } + + ls = RegGetValueW(HKEY_CURRENT_USER, + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", + L"SystemUsesLightTheme", 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); + + 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 +2654,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)