From 738c180c4f03bf82efce04dc4c751cd6eb0043c7 Mon Sep 17 00:00:00 2001 From: Axel Spoerl Date: Fri, 28 Feb 2025 09:08:37 +0100 Subject: [PATCH] Re-implement QPlatformTheme::requestColorScheme() in QGtk3Theme QGtk3Theme remained unresponsive to programmatic color scheme changes, after QPlatformTheme::requestColorScheme() had been introduced. Add functionality to QGtk3Theme. Fall back to qt_fusion_palette, when the requested color scheme isn't supported by the current GTK3 theme (e.g. Adwaita-dark doesn't support light mode). Functionality has to be manually tested with the widget gallery example. Fixes: QTBUG-134022 Task-number: QTBUG-132929 Pick-to: 6.9 6.8 Change-Id: I1160c7afc1f1fcb6ec93d65ef54cb45a65a63863 Reviewed-by: Santhosh Kumar --- .../platformthemes/gtk3/qgtk3theme.cpp | 33 +++++++++++++++++-- src/plugins/platformthemes/gtk3/qgtk3theme.h | 2 ++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/plugins/platformthemes/gtk3/qgtk3theme.cpp b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp index b21c45da7a0..ec54872347e 100644 --- a/src/plugins/platformthemes/gtk3/qgtk3theme.cpp +++ b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp @@ -159,10 +159,28 @@ QString QGtk3Theme::gtkFontName() const return QGnomeTheme::gtkFontName(); } +void QGtk3Theme::requestColorScheme(Qt::ColorScheme scheme) +{ + if (m_requestedColorScheme == scheme) + return; + qCDebug(lcQGtk3Interface) << scheme << "has been requested. Theme supports color scheme:" + << m_storage->colorScheme(); + m_requestedColorScheme = scheme; + m_storage->handleThemeChange(); +} + Qt::ColorScheme QGtk3Theme::colorScheme() const { Q_ASSERT(m_storage); - return m_storage->colorScheme(); +#ifdef QT_DEBUG + if (m_requestedColorScheme != Qt::ColorScheme::Unknown + && m_requestedColorScheme != m_storage->colorScheme()) { + qCDebug(lcQGtk3Interface) << "Requested color scheme" << m_requestedColorScheme + << "differs from theme color scheme" << m_storage->colorScheme(); + } +#endif + return m_requestedColorScheme == Qt::ColorScheme::Unknown ? m_storage->colorScheme() + : m_requestedColorScheme; } bool QGtk3Theme::usePlatformNativeDialog(DialogType type) const @@ -211,7 +229,18 @@ bool QGtk3Theme::useNativeFileDialog() const QPalette *QGtk3Theme::palette(Palette type) const { Q_ASSERT(m_storage); - return m_storage->palette(type); +#ifdef QT_DEBUG + if (m_requestedColorScheme != Qt::ColorScheme::Unknown + && m_requestedColorScheme != m_storage->colorScheme()) { + qCDebug(lcQGtk3Interface) << "Current KDE theme doesn't support reuqested color scheme" + << m_requestedColorScheme << "Falling back to fusion palette."; + return QPlatformTheme::palette(type); + } +#endif + + return (m_requestedColorScheme != Qt::ColorScheme::Unknown + && m_requestedColorScheme != m_storage->colorScheme()) + ? QPlatformTheme::palette(type) : m_storage->palette(type); } QPixmap QGtk3Theme::standardPixmap(StandardPixmap sp, const QSizeF &size) const diff --git a/src/plugins/platformthemes/gtk3/qgtk3theme.h b/src/plugins/platformthemes/gtk3/qgtk3theme.h index 5b67ca07658..7eb62bf4c84 100644 --- a/src/plugins/platformthemes/gtk3/qgtk3theme.h +++ b/src/plugins/platformthemes/gtk3/qgtk3theme.h @@ -19,6 +19,7 @@ public: virtual QString gtkFontName() const override; Qt::ColorScheme colorScheme() const override; + void requestColorScheme(Qt::ColorScheme scheme) override; bool usePlatformNativeDialog(DialogType type) const override; QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const override; @@ -31,6 +32,7 @@ public: static const char *name; private: + Qt::ColorScheme m_requestedColorScheme = Qt::ColorScheme::Unknown; static bool useNativeFileDialog(); std::unique_ptr m_storage; };