summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Spoerl <[email protected]>2025-02-28 08:35:20 +0100
committerAxel Spoerl <[email protected]>2025-03-17 20:41:29 +0100
commit70b8dd2b7eb1a874ff0ac8b4e42b03d639321394 (patch)
tree70fccc906a5bfb5ff95d0e99b7917cbd524467c4
parentdd7065616665e983349263bc5d600d764e164003 (diff)
Re-implement QPlatformTheme::requestColorScheme() in QKdeTheme
QKdeTheme remained unresponsive to programmatic color scheme changes, after QPlatformTheme::requestColorScheme() had been introduced. Add functionality to QKdeTheme. Fall back to qt_fusion_palette, when the requested color scheme isn't supported by the current KDE theme (e.g. Adwaita-dark doesn't support light mode). Functionality has to be manually tested with the widget gallery example. Task-number: QTBUG-132929 Fixes: QTBUG-134023 Change-Id: I37e56cc36803dcb8527a897ddcada29b322a5ada Reviewed-by: Santhosh Kumar <[email protected]> Reviewed-by: Piotr WierciƄski <[email protected]>
-rw-r--r--src/gui/platform/unix/qkdetheme.cpp57
-rw-r--r--src/gui/platform/unix/qkdetheme_p.h2
2 files changed, 46 insertions, 13 deletions
diff --git a/src/gui/platform/unix/qkdetheme.cpp b/src/gui/platform/unix/qkdetheme.cpp
index 8a1e566c181..be5655028a9 100644
--- a/src/gui/platform/unix/qkdetheme.cpp
+++ b/src/gui/platform/unix/qkdetheme.cpp
@@ -114,6 +114,7 @@ public:
int startDragTime = 500;
int cursorBlinkRate = 1000;
Qt::ColorScheme m_colorScheme = Qt::ColorScheme::Unknown;
+ Qt::ColorScheme m_requestedColorScheme = Qt::ColorScheme::Unknown;
void updateColorScheme(const QString &themeName);
private:
@@ -124,6 +125,7 @@ private:
void settingChangedHandler(QDBusListener::Provider provider,
QDBusListener::Setting setting,
const QString &value);
+ Qt::ColorScheme colorSchemeFromPalette() const;
#endif // QT_NO_DBUS
};
@@ -647,9 +649,29 @@ QIcon QKdeTheme::fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions
#endif
}
+void QKdeTheme::requestColorScheme(Qt::ColorScheme scheme)
+{
+ Q_D(QKdeTheme);
+ if (d->m_requestedColorScheme == scheme)
+ return;
+ qCDebug(lcQpaThemeKde) << scheme << "has been requested. Theme supports color scheme:"
+ << d->m_colorScheme;
+ d->m_requestedColorScheme = scheme;
+ d->refresh();
+}
+
Qt::ColorScheme QKdeTheme::colorScheme() const
{
- return d_func()->m_colorScheme;
+ Q_D(const QKdeTheme);
+#ifdef QT_DEBUG
+ if (d->m_requestedColorScheme != Qt::ColorScheme::Unknown
+ && d->m_requestedColorScheme != d->m_colorScheme) {
+ qCDebug(lcQpaThemeKde) << "Reuqested color scheme" << d->m_requestedColorScheme
+ << "differs from theme color scheme" << d->m_colorScheme;
+ }
+#endif
+ return (d->m_requestedColorScheme == Qt::ColorScheme::Unknown)
+ ? d->m_colorScheme :d->m_requestedColorScheme;
}
/*!
@@ -674,23 +696,34 @@ void QKdeThemePrivate::updateColorScheme(const QString &themeName)
return;
}
- if (systemPalette) {
- if (systemPalette->text().color().lightness() < systemPalette->base().color().lightness()) {
- m_colorScheme = Qt::ColorScheme::Light;
- return;
- }
- if (systemPalette->text().color().lightness() > systemPalette->base().color().lightness()) {
- m_colorScheme = Qt::ColorScheme::Dark;
- return;
- }
- }
+ m_colorScheme = colorSchemeFromPalette();
+}
- m_colorScheme = Qt::ColorScheme::Unknown;
+Qt::ColorScheme QKdeThemePrivate::colorSchemeFromPalette() const
+{
+ if (!systemPalette)
+ return Qt::ColorScheme::Unknown;
+ if (systemPalette->text().color().lightness() < systemPalette->base().color().lightness())
+ return Qt::ColorScheme::Light;
+ if (systemPalette->text().color().lightness() > systemPalette->base().color().lightness())
+ return Qt::ColorScheme::Dark;
+ return Qt::ColorScheme::Unknown;
}
const QPalette *QKdeTheme::palette(Palette type) const
{
Q_D(const QKdeTheme);
+ if (d->m_requestedColorScheme != Qt::ColorScheme::Unknown
+ && d->m_requestedColorScheme != d->m_colorScheme) {
+ qCDebug(lcQpaThemeKde) << "Current KDE theme doesn't support reuqested color scheme"
+ << d->m_requestedColorScheme << "Falling back to fusion palette:"
+ << type;
+ return QPlatformTheme::palette(type);
+ }
+
+ if (colorScheme() != d->m_requestedColorScheme)
+ return d->resources.palettes[Palette::SystemPalette];
+
return d->resources.palettes[type];
}
diff --git a/src/gui/platform/unix/qkdetheme_p.h b/src/gui/platform/unix/qkdetheme_p.h
index 878075585c3..e0ac51d7fa4 100644
--- a/src/gui/platform/unix/qkdetheme_p.h
+++ b/src/gui/platform/unix/qkdetheme_p.h
@@ -51,7 +51,7 @@ public:
const QPalette *palette(Palette type = SystemPalette) const override;
Qt::ColorScheme colorScheme() const override;
- //void requestColorScheme(Qt::ColorScheme scheme) override;
+ void requestColorScheme(Qt::ColorScheme scheme) override;
const QFont *font(Font type) const override;
#ifndef QT_NO_DBUS