Use registry-based dark mode detection on <= Windows 10
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Tue, 5 Nov 2024 08:03:14 +0000 (17:03 +0900)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Tue, 19 Nov 2024 13:09:05 +0000 (14:09 +0100)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
src/libsync/theme.cpp

index 44c2789b09bebef48a9e124ad4a1c1386aea0132..fef629491a86be3850a714ad26b8e03b0f0e4973 100644 (file)
@@ -1022,17 +1022,29 @@ QVariantMap Theme::systemPalette()
 bool Theme::darkMode()
 {
     connectToPaletteSignal();
-    switch (qGuiApp->styleHints()->colorScheme())
-    {
-    case Qt::ColorScheme::Dark:
-        return true;
-    case Qt::ColorScheme::Light:
+    const auto isDarkFromStyle = [] {
+        switch (qGuiApp->styleHints()->colorScheme())
+        {
+        case Qt::ColorScheme::Dark:
+            return true;
+        case Qt::ColorScheme::Light:
+            return false;
+        case Qt::ColorScheme::Unknown:
+            return Theme::isDarkColor(QGuiApplication::palette().window().color());
+        }
+
         return false;
-    case Qt::ColorScheme::Unknown:
-        return Theme::isDarkColor(QGuiApplication::palette().window().color());
-    }
+    };
 
-    return false;
+#ifdef Q_OS_WIN
+    static const auto darkModeSubkey = QStringLiteral("Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize");
+    if (!IsWindows11OrGreater() &&
+        Utility::registryKeyExists(HKEY_CURRENT_USER, darkModeSubkey) &&
+        !Utility::registryGetKeyValue(HKEY_CURRENT_USER, darkModeSubkey, QStringLiteral("AppsUseLightTheme")).toBool()) {
+        return true;
+    }
+#endif
+    return isDarkFromStyle();
 }
 
 void Theme::setOverrideServerUrl(const QString &overrideServerUrl)