]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Darkmode follow Windows/external program setting
authorToni Wilen <twilen@winuae.net>
Sun, 12 May 2024 17:00:12 +0000 (20:00 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 12 May 2024 17:00:12 +0000 (20:00 +0300)
od-win32/darkmode.cpp
od-win32/darkmode.h
od-win32/win32.cpp

index 158ee604f96e9a5c33b30b320b9f2292aa004b2f..97807f4c2690f9e01dc6362448201312726135b4 100644 (file)
@@ -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();
                }
index 4ab5fd2f60d53b8493dad8d87cc298153564a76f..2a8de6e6ee4a2cc35ebf63bb2142ccf0611f2895 100644 (file)
@@ -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);
index b71f3d408b542dee7a241e863ff6e9299e652e38..5ead2b9c37acb48fa76242a3317f5e7b7b8e9966 100644 (file)
@@ -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);