diff options
author | Janek Bevendorff <janek@jbev.net> | 2020-12-24 02:09:51 +0300 |
---|---|---|
committer | Janek Bevendorff <janek@jbev.net> | 2021-01-31 14:38:01 +0300 |
commit | f7d387d2335ee826e2c758c170734c884fa2b90d (patch) | |
tree | 09c2c79a1a8ef0dab6bcb051919fbc236d3cf41e | |
parent | dad4ad68f36b558f4446f9bd39a572ef63da0b9e (diff) |
Add dynamic theme switching on Windows 10 (backport)
-rw-r--r-- | src/core/Resources.cpp | 3 | ||||
-rw-r--r-- | src/gui/ApplicationSettingsWidget.cpp | 2 | ||||
-rw-r--r-- | src/gui/osutils/winutils/WinUtils.cpp | 24 | ||||
-rw-r--r-- | src/gui/osutils/winutils/WinUtils.h | 3 |
4 files changed, 22 insertions, 10 deletions
diff --git a/src/core/Resources.cpp b/src/core/Resources.cpp index 26c63ab1c..2976f9a25 100644 --- a/src/core/Resources.cpp +++ b/src/core/Resources.cpp @@ -142,7 +142,7 @@ QIcon Resources::trayIcon(QString style) } QIcon i; -#ifdef Q_OS_MACOS +#if defined(Q_OS_MACOS) || defined(Q_OS_WIN) if (osUtils->isStatusBarDark()) { i = icon(QString("keepassxc-monochrome-light%1").arg(style), false); } else { @@ -171,7 +171,6 @@ QIcon Resources::trayIconUnlocked() return trayIcon("unlocked"); } - AdaptiveIconEngine::AdaptiveIconEngine(QIcon baseIcon) : QIconEngine() , m_baseIcon(std::move(baseIcon)) diff --git a/src/gui/ApplicationSettingsWidget.cpp b/src/gui/ApplicationSettingsWidget.cpp index 0d9829229..8ec2d4730 100644 --- a/src/gui/ApplicationSettingsWidget.cpp +++ b/src/gui/ApplicationSettingsWidget.cpp @@ -250,7 +250,7 @@ void ApplicationSettingsWidget::loadSettings() } m_generalUi->trayIconAppearance->clear(); -#ifdef Q_OS_MACOS +#if defined(Q_OS_MACOS) || defined(Q_OS_WIN) m_generalUi->trayIconAppearance->addItem(tr("Monochrome"), "monochrome"); #else m_generalUi->trayIconAppearance->addItem(tr("Monochrome (light)"), "monochrome-light"); diff --git a/src/gui/osutils/winutils/WinUtils.cpp b/src/gui/osutils/winutils/WinUtils.cpp index ab5562b7b..9a08ef01f 100644 --- a/src/gui/osutils/winutils/WinUtils.cpp +++ b/src/gui/osutils/winutils/WinUtils.cpp @@ -30,6 +30,8 @@ WinUtils* WinUtils::instance() { if (!m_instance) { m_instance = new WinUtils(qApp); + m_instance->m_darkAppThemeActive = m_instance->isDarkMode(); + m_instance->m_darkSystemThemeActive = m_instance->isStatusBarDark(); } return m_instance; @@ -66,13 +68,20 @@ bool WinUtils::DWMEventFilter::nativeEventFilter(const QByteArray& eventType, vo return false; } switch (msg->message) { - case WM_CREATE: - case WM_INITDIALOG: { - if (winUtils()->isDarkMode()) { - // TODO: indicate dark mode support for black title bar + case WM_SETTINGCHANGE: + if (m_darkAppThemeActive != isDarkMode()) { + m_darkAppThemeActive = !m_darkAppThemeActive; + emit interfaceThemeChanged(); + } + + if (m_darkSystemThemeActive != isStatusBarDark()) { + m_darkSystemThemeActive = !m_darkSystemThemeActive; + emit statusbarThemeChanged(); } break; - } + case WM_HOTKEY: + triggerGlobalShortcut(msg->wParam); + break; } return false; @@ -87,8 +96,9 @@ bool WinUtils::isDarkMode() const bool WinUtils::isStatusBarDark() const { - // TODO: implement - return isDarkMode(); + QSettings settings(R"(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize)", + QSettings::NativeFormat); + return settings.value("SystemUsesLightTheme", 0).toInt() == 0; } bool WinUtils::isLaunchAtStartupEnabled() const diff --git a/src/gui/osutils/winutils/WinUtils.h b/src/gui/osutils/winutils/WinUtils.h index d8f9a10ea..19f43fd16 100644 --- a/src/gui/osutils/winutils/WinUtils.h +++ b/src/gui/osutils/winutils/WinUtils.h @@ -53,6 +53,9 @@ private: static QPointer<WinUtils> m_instance; static QScopedPointer<DWMEventFilter> m_eventFilter; + bool m_darkAppThemeActive; + bool m_darkSystemThemeActive; + Q_DISABLE_COPY(WinUtils) }; |