| | |
| | | |
| | | #include <QWKCore/qwindowkit_windows.h> |
| | | |
| | | #include <QtGui/QStyleHints> |
| | | #include <QtGui/QPalette> |
| | | |
| | | #include <QtCore/private/qsystemlibrary_p.h> |
| | | #include <QtCore/private/qwinregistry_p.h> |
| | | |
| | | #include <QtGui/QGuiApplication> |
| | | #include <QtGui/QStyleHints> |
| | | #include <QtGui/QPalette> |
| | | |
| | | // Don't include this header in any header files. |
| | | |
| | |
| | | }; |
| | | using PWINDOWCOMPOSITIONATTRIBDATA = WINDOWCOMPOSITIONATTRIBDATA *; |
| | | |
| | | enum PREFERRED_APP_MODE |
| | | { |
| | | PAM_DEFAULT = 0, // Default behavior on systems before Win10 1809. It indicates the application doesn't support dark mode at all. |
| | | PAM_AUTO = 1, // Available since Win10 1809, let system decide whether to enable dark mode or not. |
| | | PAM_DARK = 2, // Available since Win10 1903, force dark mode regardless of the system theme. |
| | | PAM_LIGHT = 3, // Available since Win10 1903, force light mode regardless of the system theme. |
| | | PAM_MAX = 4 |
| | | }; |
| | | |
| | | using SetWindowCompositionAttributePtr = BOOL(WINAPI *)(HWND, PWINDOWCOMPOSITIONATTRIBDATA); |
| | | |
| | | // Win10 1809 (10.0.17763) |
| | | using RefreshImmersiveColorPolicyStatePtr = VOID(WINAPI *)(VOID); // Ordinal 104 |
| | | using AllowDarkModeForWindowPtr = BOOL(WINAPI *)(HWND, BOOL); // Ordinal 133 |
| | | using AllowDarkModeForAppPtr = BOOL(WINAPI *)(BOOL); // Ordinal 135 |
| | | using FlushMenuThemesPtr = VOID(WINAPI *)(VOID); // Ordinal 136 |
| | | // Win10 1903 (10.0.18362) |
| | | using SetPreferredAppModePtr = PREFERRED_APP_MODE(WINAPI *)(PREFERRED_APP_MODE); // Ordinal 135 |
| | | |
| | | namespace { |
| | | |
| | |
| | | #undef DYNAMIC_API_DECLARE |
| | | |
| | | SetWindowCompositionAttributePtr pSetWindowCompositionAttribute = nullptr; |
| | | RefreshImmersiveColorPolicyStatePtr pRefreshImmersiveColorPolicyState = nullptr; |
| | | AllowDarkModeForWindowPtr pAllowDarkModeForWindow = nullptr; |
| | | AllowDarkModeForAppPtr pAllowDarkModeForApp = nullptr; |
| | | FlushMenuThemesPtr pFlushMenuThemes = nullptr; |
| | | SetPreferredAppModePtr pSetPreferredAppMode = nullptr; |
| | | |
| | | private: |
| | | DynamicApis() { |
| | |
| | | DYNAMIC_API_RESOLVE(winmm, timeEndPeriod); |
| | | |
| | | #undef DYNAMIC_API_RESOLVE |
| | | |
| | | #define UNDOC_API_RESOLVE(DLL, NAME, ORDINAL) \ |
| | | p##NAME = reinterpret_cast<decltype(p##NAME)>(DLL.resolve(MAKEINTRESOURCEA(ORDINAL))) |
| | | |
| | | QSystemLibrary uxtheme(QStringLiteral("uxtheme")); |
| | | UNDOC_API_RESOLVE(uxtheme, RefreshImmersiveColorPolicyState, 104); |
| | | UNDOC_API_RESOLVE(uxtheme, AllowDarkModeForWindow, 133); |
| | | UNDOC_API_RESOLVE(uxtheme, AllowDarkModeForApp, 135); |
| | | UNDOC_API_RESOLVE(uxtheme, FlushMenuThemes, 136); |
| | | UNDOC_API_RESOLVE(uxtheme, SetPreferredAppMode, 135); |
| | | |
| | | #undef UNDOC_API_RESOLVE |
| | | } |
| | | |
| | | ~DynamicApis() = default; |
| | |
| | | return result; |
| | | } |
| | | |
| | | static inline bool isWin101809OrGreater() { |
| | | static const bool result = IsWindows101809OrGreater_Real(); |
| | | return result; |
| | | } |
| | | |
| | | static inline bool isWin101903OrGreater() { |
| | | static const bool result = IsWindows101903OrGreater_Real(); |
| | | return result; |
| | | } |
| | | |
| | | static inline bool isWin11OrGreater() { |
| | | static const bool result = IsWindows11OrGreater_Real(); |
| | | return result; |
| | |
| | | return value.first; |
| | | } |
| | | |
| | | static inline bool isHighContrastModeEnabled() { |
| | | HIGHCONTRASTW hc{}; |
| | | hc.cbSize = sizeof(hc); |
| | | ::SystemParametersInfoW(SPI_GETHIGHCONTRAST, sizeof(hc), &hc, FALSE); |
| | | return (hc.dwFlags & HCF_HIGHCONTRASTON); |
| | | } |
| | | |
| | | static inline bool isDarkThemeActive() { |
| | | #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) |
| | | return QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark; |
| | |
| | | _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, |
| | | &enabled, sizeof(enabled)))) { |
| | | return enabled; |
| | | } else { |
| | | return false; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | static inline QColor getAccentColor() { |