Fix WindowsRegistryKey for Qt 6.8.1 (#154)
* Fix WindowsRegistryKey for Qt 6.8.1
* Use new Qt Private API instead of restoring the old version
* Applied review changes
- Moved template specializations to header, had to add inline for this to work
- Added const qualifiers
- Added space after if
- Removed unneeded new lines
- Removed new lines inserted by the IDE
- Removed general template implementation, static asserts did not compile (due to MOC i think). Using the function with any other type than DWORD will still cause a compilation error
* Fix const
* Fix line ending
| | |
| | | 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 |
| | | |
| | | } |
| | |
| | | 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; |
| | | |
| | |
| | | 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 |
| | |
| | | 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() { |
| | |
| | | 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 |
| | | } |
| | | |
| | |
| | | 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 {}; |
| | | } |