diff options
author | Magnus Groß <magnus.gross@rwth-aachen.de> | 2022-02-17 21:50:34 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2022-03-04 00:58:10 +0000 |
commit | 3c6b61a6e14962969e7e9dc5909cd746e38f8de7 (patch) | |
tree | d385400b13719751a60e9dd5198a594cf6f77216 /src/plugins/platformthemes/xdgdesktopportal | |
parent | 742ffd0f47abd8995a02da1b02dd0c8b5bc34706 (diff) |
xdgdesktopportal theme: Implement appearance()
We can use the new org.freedesktop.appearance color-scheme setting in
the XDG Desktop Portal Settings to implement this in a DE-independent
way.
In the future we can also use the related "SettingChanged" signal in the
Desktop portal to support changing the theme during runtime.
Useful links:
Spec: https://github.com/flatpak/xdg-desktop-portal/blob/d7a304a00697d7d608821253cd013f3b97ac0fb6/data/org.freedesktop.impl.portal.Settings.xml#L33-L45
Blog post: https://blogs.gnome.org/alexm/2021/10/04/dark-style-preference/
Task-number: QTBUG-93955
Pick-to: 6.2 6.3
Change-Id: Ia5df22fb215ee94d68d2787da97a1c9f8f2c6b0c
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/plugins/platformthemes/xdgdesktopportal')
-rw-r--r-- | src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.cpp | 53 | ||||
-rw-r--r-- | src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.h | 2 |
2 files changed, 55 insertions, 0 deletions
diff --git a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.cpp b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.cpp index 2fc3167fd5..87b9f20a4c 100644 --- a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.cpp +++ b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.cpp @@ -50,12 +50,19 @@ #include <QDBusPendingCall> #include <QDBusPendingCallWatcher> #include <QDBusPendingReply> +#include <QDBusReply> QT_BEGIN_NAMESPACE class QXdgDesktopPortalThemePrivate : public QPlatformThemePrivate { public: + enum XdgColorschemePref { + None, + PreferDark, + PreferLight + }; + QXdgDesktopPortalThemePrivate() : QPlatformThemePrivate() { } @@ -65,8 +72,33 @@ public: delete baseTheme; } + /*! \internal + + Converts the given Freedesktop color scheme setting \a colorschemePref to a QPlatformTheme::Appearance value. + Specification: https://github.com/flatpak/xdg-desktop-portal/blob/d7a304a00697d7d608821253cd013f3b97ac0fb6/data/org.freedesktop.impl.portal.Settings.xml#L33-L45 + + Unfortunately the enum numerical values are not defined identically, so we have to convert them. + + The mapping is as follows: + + Enum Index: Freedesktop definition | Qt definition + ----------------------------------- | ------------- + 0: No preference | 0: Unknown + 1: Prefer dark appearance | 2: Dark + 2: Prefer light appearance | 1: Light + */ + static QPlatformTheme::Appearance appearanceFromXdgPref(const XdgColorschemePref colorschemePref) + { + switch (colorschemePref) { + case PreferDark: return QPlatformTheme::Appearance::Dark; + case PreferLight: return QPlatformTheme::Appearance::Light; + default: return QPlatformTheme::Appearance::Unknown; + } + } + QPlatformTheme *baseTheme = nullptr; uint fileChooserPortalVersion = 0; + QPlatformTheme::Appearance appearance = QPlatformTheme::Appearance::Unknown; }; QXdgDesktopPortalTheme::QXdgDesktopPortalTheme() @@ -113,6 +145,21 @@ QXdgDesktopPortalTheme::QXdgDesktopPortalTheme() } watcher->deleteLater(); }); + + // Get information about system theme preference + message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"), + QLatin1String("/org/freedesktop/portal/desktop"), + QLatin1String("org.freedesktop.portal.Settings"), + QLatin1String("Read")); + message << QLatin1String("org.freedesktop.appearance") << QLatin1String("color-scheme"); + + // this must not be asyncCall() because we have to set appearance now + QDBusReply<QVariant> reply = QDBusConnection::sessionBus().call(message); + if (reply.isValid()) { + const QDBusVariant dbusVariant = qvariant_cast<QDBusVariant>(reply.value()); + const QXdgDesktopPortalThemePrivate::XdgColorschemePref xdgPref = static_cast<QXdgDesktopPortalThemePrivate::XdgColorschemePref>(dbusVariant.variant().toUInt()); + d->appearance = QXdgDesktopPortalThemePrivate::appearanceFromXdgPref(xdgPref); + } } QPlatformMenuItem* QXdgDesktopPortalTheme::createPlatformMenuItem() const @@ -191,6 +238,12 @@ QVariant QXdgDesktopPortalTheme::themeHint(ThemeHint hint) const return d->baseTheme->themeHint(hint); } +QPlatformTheme::Appearance QXdgDesktopPortalTheme::appearance() const +{ + Q_D(const QXdgDesktopPortalTheme); + return d->appearance; +} + QPixmap QXdgDesktopPortalTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const { Q_D(const QXdgDesktopPortalTheme); diff --git a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.h b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.h index d38b3ddda3..0d945285a2 100644 --- a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.h +++ b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.h @@ -70,6 +70,8 @@ public: QVariant themeHint(ThemeHint hint) const override; + Appearance appearance() const override; + QPixmap standardPixmap(StandardPixmap sp, const QSizeF &size) const override; QIcon fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions iconOptions = { }) const override; |