8#include "tabletmodewatcher.h"
9#include <QCoreApplication>
11#if defined(KIRIGAMI_ENABLE_DBUS)
12#include "settings_interface.h"
13#include <QDBusConnection>
25class TabletModeWatcherSingleton
28 TabletModeWatcher self;
31Q_GLOBAL_STATIC(TabletModeWatcherSingleton, privateTabletModeWatcherSelf)
33class TabletModeWatcherPrivate
35 static constexpr auto PORTAL_GROUP =
"org.kde.TabletMode"_L1;
36 static constexpr auto KEY_AVAILABLE =
"available"_L1;
37 static constexpr auto KEY_ENABLED =
"enabled"_L1;
40 TabletModeWatcherPrivate(TabletModeWatcher *watcher)
46#if !defined(KIRIGAMI_ENABLE_DBUS) && (defined(Q_OS_ANDROID) || defined(Q_OS_IOS))
47 isTabletModeAvailable =
true;
49#elif defined(KIRIGAMI_ENABLE_DBUS)
52 if (qEnvironmentVariableIsSet(
"QT_QUICK_CONTROLS_MOBILE") || qEnvironmentVariableIsSet(
"KDE_KIRIGAMI_TABLET_MODE")) {
53 isTabletMode = (
QString::fromLatin1(qgetenv(
"QT_QUICK_CONTROLS_MOBILE")) == QLatin1String(
"1")
57 isTabletModeAvailable = isTabletMode;
58 }
else if (qEnvironmentVariableIsSet(
"QT_NO_XDG_DESKTOP_PORTAL")) {
61 qDBusRegisterMetaType<VariantMapMap>();
62 auto portal =
new OrgFreedesktopPortalSettingsInterface(u
"org.freedesktop.portal.Desktop"_s,
63 u
"/org/freedesktop/portal/desktop"_s,
68 &OrgFreedesktopPortalSettingsInterface::SettingChanged,
70 [
this](
const QString &group,
const QString &key,
const QDBusVariant &value) {
71 if (group != PORTAL_GROUP) {
74 if (key == KEY_AVAILABLE) {
75 Q_EMIT q->tabletModeAvailableChanged(value.
variant().
toBool());
76 }
else if (key == KEY_ENABLED) {
81 auto readAllProps = [portal,
this] {
82 const auto reply = portal->ReadAll({PORTAL_GROUP});
83 auto watcher =
new QDBusPendingCallWatcher(reply, q);
85 watcher->deleteLater();
86 QDBusPendingReply<VariantMapMap> reply = *watcher;
88 Q_EMIT q->tabletModeAvailableChanged(properties[KEY_AVAILABLE].toBool());
89 setIsTablet(properties[KEY_ENABLED].toBool());
102 ~TabletModeWatcherPrivate() =
default;
103 void setIsTablet(
bool tablet);
105 TabletModeWatcher *q;
106 QList<QObject *> watchers;
107 bool isTabletModeAvailable =
false;
108 bool isTabletMode =
false;
111void TabletModeWatcherPrivate::setIsTablet(
bool tablet)
113 if (isTabletMode == tablet) {
117 isTabletMode = tablet;
118 TabletModeChangedEvent
event{tablet};
119 Q_EMIT q->tabletModeChanged(tablet);
120 for (
auto *w : watchers) {
125TabletModeWatcher::TabletModeWatcher(QObject *parent)
127 , d(new TabletModeWatcherPrivate(this))
131TabletModeWatcher::~TabletModeWatcher()
136TabletModeWatcher *TabletModeWatcher::self()
138 return &privateTabletModeWatcherSelf()->self;
143 return d->isTabletModeAvailable;
148 return d->isTabletMode;
153 d->watchers.append(watcher);
156void TabletModeWatcher::removeWatcher(
QObject *watcher)
158 d->watchers.removeAll(watcher);
164#include "moc_tabletmodewatcher.cpp"
bool sendEvent(QObject *receiver, QEvent *event)
QDBusConnection sessionBus()
void finished(QDBusPendingCallWatcher *self)
typename Select< 0 >::Type value() const const
QVariant variant() const const
int registerEventType(int hint)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QString fromLatin1(QByteArrayView str)
QThread * currentThread()
bool toBool() const const