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 <santhosh.kumar.selvaraj@qt.io>
This commit is contained in:
Axel Spoerl 2025-02-28 09:08:37 +01:00
parent db6f8821fc
commit 738c180c4f
2 changed files with 33 additions and 2 deletions

View File

@ -159,10 +159,28 @@ QString QGtk3Theme::gtkFontName() const
return QGnomeTheme::gtkFontName(); 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 Qt::ColorScheme QGtk3Theme::colorScheme() const
{ {
Q_ASSERT(m_storage); 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 bool QGtk3Theme::usePlatformNativeDialog(DialogType type) const
@ -211,7 +229,18 @@ bool QGtk3Theme::useNativeFileDialog()
const QPalette *QGtk3Theme::palette(Palette type) const const QPalette *QGtk3Theme::palette(Palette type) const
{ {
Q_ASSERT(m_storage); 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 QPixmap QGtk3Theme::standardPixmap(StandardPixmap sp, const QSizeF &size) const

View File

@ -19,6 +19,7 @@ public:
virtual QString gtkFontName() const override; virtual QString gtkFontName() const override;
Qt::ColorScheme colorScheme() const override; Qt::ColorScheme colorScheme() const override;
void requestColorScheme(Qt::ColorScheme scheme) override;
bool usePlatformNativeDialog(DialogType type) const override; bool usePlatformNativeDialog(DialogType type) const override;
QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const override; QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const override;
@ -31,6 +32,7 @@ public:
static const char *name; static const char *name;
private: private:
Qt::ColorScheme m_requestedColorScheme = Qt::ColorScheme::Unknown;
static bool useNativeFileDialog(); static bool useNativeFileDialog();
std::unique_ptr<QGtk3Storage> m_storage; std::unique_ptr<QGtk3Storage> m_storage;
}; };