QXdgDesktopPortalTheme: watch for color scheme changes on runtime

Subscribe to SettingChanged signal from xdg-desktop-portal to get info
when color scheme changes and update it on runtime.

Fixes: QTBUG-116197
Pick-to: 6.6
Change-Id: I7803ea76bc1ac0749d60ee55c1c0d9051dad210a
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
(cherry picked from commit a833d5682ac44571e13568336f2bd3ec7deb1d6d)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Jan Grulich 2024-03-22 12:09:52 +01:00 committed by Qt Cherry-pick Bot
parent 2d7972e059
commit 3aa05a9481

View File

@ -20,8 +20,9 @@ QT_BEGIN_NAMESPACE
using namespace Qt::StringLiterals; using namespace Qt::StringLiterals;
class QXdgDesktopPortalThemePrivate : public QPlatformThemePrivate class QXdgDesktopPortalThemePrivate : public QObject
{ {
Q_OBJECT
public: public:
enum XdgColorschemePref { enum XdgColorschemePref {
None, None,
@ -30,7 +31,7 @@ public:
}; };
QXdgDesktopPortalThemePrivate() QXdgDesktopPortalThemePrivate()
: QPlatformThemePrivate() : QObject()
{ } { }
~QXdgDesktopPortalThemePrivate() ~QXdgDesktopPortalThemePrivate()
@ -62,6 +63,17 @@ public:
} }
} }
public Q_SLOTS:
void settingChanged(const QString &group, const QString &key,
const QDBusVariant &value)
{
if (group == "org.freedesktop.appearance"_L1 && key == "color-scheme"_L1) {
colorScheme = colorSchemeFromXdgPref(static_cast<XdgColorschemePref>(value.variant().toUInt()));
QWindowSystemInterface::handleThemeChange();
}
}
public:
QPlatformTheme *baseTheme = nullptr; QPlatformTheme *baseTheme = nullptr;
uint fileChooserPortalVersion = 0; uint fileChooserPortalVersion = 0;
Qt::ColorScheme colorScheme = Qt::ColorScheme::Unknown; Qt::ColorScheme colorScheme = Qt::ColorScheme::Unknown;
@ -126,6 +138,11 @@ QXdgDesktopPortalTheme::QXdgDesktopPortalTheme()
const QXdgDesktopPortalThemePrivate::XdgColorschemePref xdgPref = static_cast<QXdgDesktopPortalThemePrivate::XdgColorschemePref>(dbusVariant.variant().toUInt()); const QXdgDesktopPortalThemePrivate::XdgColorschemePref xdgPref = static_cast<QXdgDesktopPortalThemePrivate::XdgColorschemePref>(dbusVariant.variant().toUInt());
d->colorScheme = QXdgDesktopPortalThemePrivate::colorSchemeFromXdgPref(xdgPref); d->colorScheme = QXdgDesktopPortalThemePrivate::colorSchemeFromXdgPref(xdgPref);
} }
QDBusConnection::sessionBus().connect(
"org.freedesktop.portal.Desktop"_L1, "/org/freedesktop/portal/desktop"_L1,
"org.freedesktop.portal.Settings"_L1, "SettingChanged"_L1, d_ptr.get(),
SLOT(settingChanged(QString, QString, QDBusVariant)));
} }
QPlatformMenuItem* QXdgDesktopPortalTheme::createPlatformMenuItem() const QPlatformMenuItem* QXdgDesktopPortalTheme::createPlatformMenuItem() const
@ -247,3 +264,5 @@ QString QXdgDesktopPortalTheme::standardButtonText(int button) const
} }
QT_END_NAMESPACE QT_END_NAMESPACE
#include "qxdgdesktopportaltheme.moc"