Add dynamic theme switching on Windows 10 (backport)

This commit is contained in:
Janek Bevendorff
2020-12-24 00:09:51 +01:00
parent dad4ad68f3
commit f7d387d233
4 changed files with 22 additions and 10 deletions

View File

@@ -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))

View File

@@ -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");

View File

@@ -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

View File

@@ -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)
};