/* * Copyright (C) 2014 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "dashconnection.h" #include #include /* The default implementation of AbstractDBusServiceMonitor creates a QDBusInterface when the service * appears on the bus. * * On construction QDBusInterface synchronously introspects the service, which will block the GUI * thread of this process if the service is busy. QDBusAbstractInterface does not perform this * introspection, so let's subclass that and avoid the blocking scenario. * * However we lose Qt's wrapping of the DBus service with a MetaObject, with the result that we * cannot easily connect to DBus signals with the usual connect() calls. So this approach only * suited to push communication with the DBus service. */ class AsyncDBusInterface : public QDBusAbstractInterface { Q_OBJECT public: AsyncDBusInterface(const QString &service, const QString &path, const QString &interface, const QDBusConnection &connection, QObject *parent = 0) : QDBusAbstractInterface(service, path, interface.toLatin1().data(), connection, parent) {} ~AsyncDBusInterface() = default; }; DashConnection::DashConnection(const QString &service, const QString &path, const QString &interface, QObject *parent): AbstractDBusServiceMonitor(service, path, interface, SessionBus, parent) { } /* Override the default implementation to create a non-blocking DBus interface (see note above). */ QDBusAbstractInterface* DashConnection::createInterface(const QString &service, const QString &path, const QString &interface, const QDBusConnection &connection) { return new AsyncDBusInterface(service, path, interface, connection); } void DashConnection::setCurrentScope(int index, bool animate, bool isSwipe) { if (dbusInterface()) { dbusInterface()->asyncCall(QStringLiteral("SetCurrentScope"), index, animate, isSwipe); } } #include "dashconnection.moc"