@@ -16,13 +16,22 @@
1616
1717#include "dashcommunicator.h"
1818
19+#include <unity/shell/application/ApplicationInfoInterface.h>
20+#include <unity/shell/application/ApplicationManagerInterface.h>
21+
1922#include <QObject>
2023#include <QDBusConnection>
2124#include <QDBusInterface>
2225#include <QDebug>
26+#include <QDBusPendingCall>
27+
28+using namespace unity::shell::application;
2329
2430DashCommunicator::DashCommunicator(QObject *parent):
25− QObject(parent)
31+ QObject(parent),
32+ m_dashInterface(nullptr),
33+ m_applicationManager(nullptr),
34+ m_dash(nullptr)
2635{
2736}
2837
@@ -30,14 +39,77 @@ DashCommunicator::~DashCommunicator()
3039{
3140}
3241
33−
3442void DashCommunicator::setCurrentScope(const QString &scopeId, bool animate, bool isSwipe)
3543{
36− QDBusConnection connection = QDBusConnection::sessionBus();
37− QDBusInterface dashIface ("com.canonical.UnityDash",
38− "/com/canonical/UnityDash",
39− "",
40− connection);
44+ // Connection not up... Try to connect
45+ if (!m_dashInterface || !m_dashInterface->isValid()) {
46+ connectToDash();
47+ }
48+
49+ if (m_dashInterface && m_dashInterface->isValid()) {
50+ m_dashInterface->asyncCall("SetCurrentScope", scopeId, animate, isSwipe);
51+ }
52+}
53+
54+void DashCommunicator::connectToDash()
55+{
56+ if (m_dashInterface) {
57+ m_dashInterface->deleteLater();
58+ m_dashInterface = nullptr;
59+ }
60+
61+ if (m_applicationManager) {
62+ ApplicationInfoInterface *dash = m_applicationManager->findApplication("unity8-dash");
63+ if (dash && dash->state() == ApplicationInfoInterface::Running) {
64+ QDBusConnection connection = QDBusConnection::sessionBus();
65+ m_dashInterface = new QDBusInterface("com.canonical.UnityDash",
66+ "/com/canonical/UnityDash",
67+ "",
68+ connection);
69+ } else {
70+ qWarning() << "Dash is suspended or not running. Can't connect.";
71+ }
72+ }
73+}
74+
75+unity::shell::application::ApplicationManagerInterface* DashCommunicator::applicationManager() const
76+{
77+ return m_applicationManager;
78+}
79+
80+void DashCommunicator::setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager)
81+{
82+ if (m_applicationManager != appManager) {
83+ m_applicationManager = appManager;
84+ Q_EMIT applicationManagerChanged();
85+
86+ connect(m_applicationManager, &unity::shell::application::ApplicationManagerInterface::applicationAdded, this, &DashCommunicator::applicationAdded);
87+ connect(m_applicationManager, &unity::shell::application::ApplicationManagerInterface::applicationRemoved, this, &DashCommunicator::applicationRemoved);
88+
89+ if (m_applicationManager->findApplication("unity8-dash")) {
90+ applicationAdded("unity8-dash");
91+ }
92+ }
93+}
94+
95+void DashCommunicator::applicationAdded(const QString &appId)
96+{
97+ if (appId != "unity8-dash") {
98+ return;
99+ }
100+ ApplicationInfoInterface *app = m_applicationManager->findApplication(appId);
101+ if (!app) {
102+ qWarning() << "DashCommunicator received an applicationAdded signal for dash, but there's no dash!";
103+ return;
104+ }
105+ connectToDash();
106+}
41107
42− dashIface.call("SetCurrentScope", scopeId, animate, isSwipe);
108+void DashCommunicator::applicationRemoved(const QString &appId)
109+{
110+ if (appId != "unity8-dash") {
111+ return;
112+ }
113+ m_dashInterface->deleteLater();
114+ m_dashInterface = nullptr;
43115}