From 91274c58b1772dfe38d3fcab291693141e822684 Mon Sep 17 00:00:00 2001
From: Daniel <49284193+dnlkrs@users.noreply.github.com>
Date: 周五, 06 12月 2024 21:55:30 +0800
Subject: [PATCH] Fix WindowsRegistryKey for Qt 6.8.1 (#154)

---
 src/core/shared/qwkwindowsextra_p.h |   20 +++++++-------------
 src/core/qwindowkit_windows.h       |   30 ++++++++++++++++++++++++++++++
 src/core/qwindowkit_windows.cpp     |    6 +++++-
 3 files changed, 42 insertions(+), 14 deletions(-)

diff --git a/src/core/qwindowkit_windows.cpp b/src/core/qwindowkit_windows.cpp
index 51a6f33..a9cc371 100644
--- a/src/core/qwindowkit_windows.cpp
+++ b/src/core/qwindowkit_windows.cpp
@@ -85,6 +85,10 @@
                                reinterpret_cast<unsigned char *>(&value), &size) == ERROR_SUCCESS;
         return qMakePair(value, ok);
     }
+#elif QT_VERSION < QT_VERSION_CHECK(6, 8, 1)
+    WindowsRegistryKey::WindowsRegistryKey(HKEY parentHandle, QStringView subKey, REGSAM permissions, REGSAM access)
+        : QWinRegistryKey(parentHandle, subKey, permissions, access)
+    {
+    }
 #endif
-
 }
\ No newline at end of file
diff --git a/src/core/qwindowkit_windows.h b/src/core/qwindowkit_windows.h
index ca7c9c5..20f24ef 100644
--- a/src/core/qwindowkit_windows.h
+++ b/src/core/qwindowkit_windows.h
@@ -125,6 +125,9 @@
         QString stringValue(QStringView subKey) const;
         QPair<DWORD, bool> dwordValue(QStringView subKey) const;
 
+        template<typename T>
+        std::optional<T> value(QStringView subKey) const;
+
     private:
         HKEY m_key;
 
@@ -134,6 +137,33 @@
     inline bool WindowsRegistryKey::isValid() const {
         return m_key != nullptr;
     }
+
+    template<>
+    inline std::optional<DWORD> WindowsRegistryKey::value(QStringView subKey) const {
+        const auto dv = dwordValue(subKey);
+        if (!dv.second) {
+            return {};
+        }
+        return dv.first;
+    }
+#elif QT_VERSION < QT_VERSION_CHECK(6, 8, 1)
+    class WindowsRegistryKey : public QWinRegistryKey {
+    public:
+
+        explicit WindowsRegistryKey(HKEY parentHandle, QStringView subKey, REGSAM permissions = KEY_READ, REGSAM access = 0);
+
+        template<typename T>
+        inline std::optional<T> value(QStringView subKey) const;
+    };
+
+    template<>
+    inline std::optional<DWORD> WindowsRegistryKey::value(QStringView subKey) const {
+        const auto dv = dwordValue(subKey);
+        if (!dv.second) {
+            return {};
+        }
+        return dv.first;
+    }
 #else
     using WindowsRegistryKey = QWinRegistryKey;
 #endif
diff --git a/src/core/shared/qwkwindowsextra_p.h b/src/core/shared/qwkwindowsextra_p.h
index 021b34e..52d8943 100644
--- a/src/core/shared/qwkwindowsextra_p.h
+++ b/src/core/shared/qwkwindowsextra_p.h
@@ -345,11 +345,8 @@
         if (!registry.isValid()) {
             return false;
         }
-        auto value = registry.dwordValue(L"ColorPrevalence");
-        if (!value.second) {
-            return false;
-        }
-        return value.first;
+        auto value = registry.value<DWORD>(L"ColorPrevalence");
+        return value.value_or(false);
     }
 
     static inline bool isHighContrastModeEnabled() {
@@ -368,11 +365,8 @@
         if (!registry.isValid()) {
             return false;
         }
-        auto value = registry.dwordValue(L"AppsUseLightTheme");
-        if (!value.second) {
-            return false;
-        }
-        return !value.first;
+        auto value = registry.value<DWORD>(L"AppsUseLightTheme");
+        return value.value_or(false);
 #endif
     }
 
@@ -398,13 +392,13 @@
         if (!registry.isValid()) {
             return {};
         }
-        auto value = registry.dwordValue(L"AccentColor");
-        if (!value.second) {
+        auto value = registry.value<DWORD>(L"AccentColor");
+        if (!value) {
             return {};
         }
         // The retrieved value is in the #AABBGGRR format, we need to
         // convert it to the #AARRGGBB format which Qt expects.
-        QColor color = QColor::fromRgba(value.first);
+        QColor color = QColor::fromRgba(*value);
         if (!color.isValid()) {
             return {};
         }

--
Gitblit v1.9.1