From 9a7b20cbfdf20467fc2827eb360898cd8aaf5cd8 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Thu, 24 Dec 2020 00:09:51 +0100 Subject: [PATCH] Add dynamic theme switching on Windows 10 --- src/gui/ApplicationSettingsWidget.cpp | 2 +- src/gui/Icons.cpp | 2 +- src/gui/osutils/winutils/WinUtils.cpp | 21 +++++++++++++-------- src/gui/osutils/winutils/WinUtils.h | 3 +++ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/gui/ApplicationSettingsWidget.cpp b/src/gui/ApplicationSettingsWidget.cpp index d105b76d7..8fcb85cd8 100644 --- a/src/gui/ApplicationSettingsWidget.cpp +++ b/src/gui/ApplicationSettingsWidget.cpp @@ -251,7 +251,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/Icons.cpp b/src/gui/Icons.cpp index 2f117b4ff..1b40a3fe9 100644 --- a/src/gui/Icons.cpp +++ b/src/gui/Icons.cpp @@ -80,7 +80,7 @@ QIcon Icons::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 { diff --git a/src/gui/osutils/winutils/WinUtils.cpp b/src/gui/osutils/winutils/WinUtils.cpp index 302c3914c..1ccade5f5 100644 --- a/src/gui/osutils/winutils/WinUtils.cpp +++ b/src/gui/osutils/winutils/WinUtils.cpp @@ -29,6 +29,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(); #ifdef QT_DEBUG // Attach console to enable debug output @@ -63,15 +65,17 @@ bool WinUtils::nativeEventFilter(const QByteArray& eventType, void* message, lon auto* msg = static_cast(message); switch (msg->message) { - /* TODO: indicate dark mode support for black title bar - case WM_CREATE: - case WM_INITDIALOG: { - if (msg->hwnd && winUtils()->isDarkMode()) { + 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; @@ -89,8 +93,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 9e9f72684..b7ef47573 100644 --- a/src/gui/osutils/winutils/WinUtils.h +++ b/src/gui/osutils/winutils/WinUtils.h @@ -72,6 +72,9 @@ private: int m_nextShortcutId = 1; QHash> m_globalShortcuts; + bool m_darkAppThemeActive; + bool m_darkSystemThemeActive; + Q_DISABLE_COPY(WinUtils) };