From f3874210b26f5d8b969491d4c2d4266beebb45bb Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 12 May 2024 20:00:12 +0300 Subject: [PATCH] Darkmode follow Windows/external program setting --- od-win32/darkmode.cpp | 46 ++++++++++++++++++++++++++++++++----------- od-win32/darkmode.h | 5 +++-- od-win32/win32.cpp | 14 +++++++++++-- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/od-win32/darkmode.cpp b/od-win32/darkmode.cpp index 158ee604..97807f4c 100644 --- a/od-win32/darkmode.cpp +++ b/od-win32/darkmode.cpp @@ -24,6 +24,7 @@ extern void write_log(const char *, ...); bool g_darkModeSupported = false; bool g_darkModeEnabled = false; int darkModeForced = 0; +int darkModeDetect = 0; DWORD g_buildNumber = 0; fnSetWindowCompositionAttribute _SetWindowCompositionAttribute = nullptr; @@ -41,6 +42,14 @@ fnSetPreferredAppMode _SetPreferredAppMode = nullptr; COLORREF dark_text_color, dark_bg_color; +int GetAppDarkModeState(void) +{ + if (!_ShouldAppsUseDarkMode) { + return -1; + } + return _ShouldAppsUseDarkMode() ? 1 : 0; +} + bool AllowDarkModeForWindow(HWND hWnd, bool allow) { if (g_darkModeSupported) @@ -191,25 +200,38 @@ void InitDarkMode(int enable) { g_darkModeSupported = true; - if (darkModeForced > 0) { - AllowDarkModeForApp(PreferredAppMode::ForceDark); - } else if (darkModeForced < 0) { - AllowDarkModeForApp(PreferredAppMode::ForceLight); - } else if (enable == -1 || enable == 1) { - AllowDarkModeForApp(PreferredAppMode::AllowDark); - } else { - AllowDarkModeForApp(PreferredAppMode::Default); + if (!darkModeDetect) { + if (darkModeForced > 0) { + AllowDarkModeForApp(PreferredAppMode::ForceDark); + } else if (darkModeForced < 0) { + AllowDarkModeForApp(PreferredAppMode::ForceLight); + } else if (enable == -1 || enable == 1) { + AllowDarkModeForApp(PreferredAppMode::AllowDark); + } else { + AllowDarkModeForApp(PreferredAppMode::Default); + } + } else if (darkModeDetect < 0) { + if (_ShouldAppsUseDarkMode()) { + AllowDarkModeForApp(PreferredAppMode::ForceDark); + } else { + AllowDarkModeForApp(PreferredAppMode::ForceLight); + } } + _RefreshImmersiveColorPolicyState(); g_darkModeEnabled = _ShouldAppsUseDarkMode() && !IsHighContrast(); if (g_darkModeEnabled && enable < -1) { - AllowDarkModeForApp(PreferredAppMode::ForceDark); + if (darkModeDetect < 0) { + AllowDarkModeForApp(PreferredAppMode::ForceDark); + } } if (!g_darkModeEnabled && enable > 0 && darkModeForced >= 0) { - AllowDarkModeForApp(PreferredAppMode::ForceDark); + if (darkModeDetect < 0) { + AllowDarkModeForApp(PreferredAppMode::ForceDark); + } _RefreshImmersiveColorPolicyState(); g_darkModeEnabled = _ShouldAppsUseDarkMode() && !IsHighContrast(); } @@ -224,7 +246,9 @@ void InitDarkMode(int enable) } if (!enable && g_darkModeSupported) { - AllowDarkModeForApp(PreferredAppMode::Default); + if (darkModeDetect < 0) { + AllowDarkModeForApp(PreferredAppMode::Default); + } if (_RefreshImmersiveColorPolicyState != NULL) { _RefreshImmersiveColorPolicyState(); } diff --git a/od-win32/darkmode.h b/od-win32/darkmode.h index 4ab5fd2f..2a8de6e6 100644 --- a/od-win32/darkmode.h +++ b/od-win32/darkmode.h @@ -73,7 +73,7 @@ using fnIsDarkModeAllowedForApp = bool (WINAPI *)(); // ordinal 139 extern bool g_darkModeSupported; extern bool g_darkModeEnabled; -extern int darkModeForced; +extern int darkModeForced, darkModeDetect; extern COLORREF dark_text_color, dark_bg_color;; bool AllowDarkModeForWindow(HWND hWnd, bool allow); @@ -84,4 +84,5 @@ void AllowDarkModeForApp(bool allow); void SubclassListViewControl(HWND hListView); void SubclassTreeViewControl(HWND hListView); void SubclassButtonControl(HWND hwnd); -void SubClassStatusBar(HWND hwnd); \ No newline at end of file +void SubClassStatusBar(HWND hwnd); +int GetAppDarkModeState(void); diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index b71f3d40..5ead2b9c 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -7187,6 +7187,8 @@ static int parseargs(const TCHAR *argx, const TCHAR *np, const TCHAR *np2) darkModeForced = 1; } else if (!_tcsicmp(np, _T("light"))) { darkModeForced = -1; + } else if (!_tcsicmp(np, _T("default"))) { + darkModeDetect = -1; } return 2; } @@ -8320,16 +8322,24 @@ bool is_mainthread(void) void InitializeDarkMode(void) { static int initialized = -10; + static int dmdetect = -10; int v = -1; regqueryint(NULL, _T("GUIDarkMode"), &v); if (rp_isactive()) { - v = -2; + darkModeDetect = 1; + } + if (darkModeDetect) { + int dms = GetAppDarkModeState(); + if (dms != dmdetect) { + dmdetect = dms; + initialized = -10; + } + v = -1; } if (darkModeForced) { v = 1; } - if (initialized != v) { InitDarkMode(v); write_log("dark mode supported: %d enabled: %d\n", g_darkModeSupported, g_darkModeEnabled); -- 2.47.3