on xenial help sign in
Fix syncing of stored launcher items
8a832cbMichael Terry
plugins/Unity/Launcher/backend/launcherbackend.cpp+16−2
@@ -38,12 +38,15 @@ public:
38 bool countVisible;
38 bool countVisible;
39};
39};
40
40
41−LauncherBackend::LauncherBackend(QObject *parent):
41+LauncherBackend::LauncherBackend(bool greeterMode, QObject *parent):
42 QDBusVirtualObject(parent),
42 QDBusVirtualObject(parent),
43+ m_greeterMode(greeterMode),
43 m_accounts(nullptr)
44 m_accounts(nullptr)
44{
45{
45#ifndef LAUNCHER_TESTING
46#ifndef LAUNCHER_TESTING
46 m_accounts = new AccountsServiceDBusAdaptor(this);
47 m_accounts = new AccountsServiceDBusAdaptor(this);
48+ connect(m_accounts, SIGNAL(propertiesChanged(QString, QString, QStringList)),
49+ this, SLOT(accountsListChanged(QString, QString, QStringList)));
47#endif
50#endif
48 m_user = qgetenv("USER");
51 m_user = qgetenv("USER");
49 syncFromAccounts();
52 syncFromAccounts();
@@ -231,7 +234,7 @@ void LauncherBackend::setCountVisible(const QString &appId, bool visible) const
231
234
232void LauncherBackend::setUser(const QString &username)
235void LauncherBackend::setUser(const QString &username)
233{
236{
234− if (qgetenv("USER") == "lightdm" && m_user != username) {
237+ if (m_greeterMode && m_user != username) {
235 m_user = username;
238 m_user = username;
236 syncFromAccounts();
239 syncFromAccounts();
237 }
240 }
@@ -244,6 +247,15 @@ void LauncherBackend::triggerQuickListAction(const QString &appId, const QString
244 Q_UNUSED(quickListId)
247 Q_UNUSED(quickListId)
245}
248}
246
249
250+void LauncherBackend::accountsListChanged(const QString &user, const QString &interface, const QStringList &changed)
251+{
252+ if (m_greeterMode && user == m_user &&
253+ interface == "com.canonical.unity.AccountsService" &&
254+ changed.contains("launcher-items")) {
255+ syncFromAccounts();
256+ }
257+}
258+
247void LauncherBackend::syncFromAccounts()
259void LauncherBackend::syncFromAccounts()
248{
260{
249 QList<QVariantMap> apps;
261 QList<QVariantMap> apps;
@@ -285,6 +297,8 @@ void LauncherBackend::syncFromAccounts()
285 loadFromVariant(app.toMap());
297 loadFromVariant(app.toMap());
286 }
298 }
287 }
299 }
300+
301+ Q_EMIT refreshApplications();
288}
302}
289
303
290void LauncherBackend::syncToAccounts()
304void LauncherBackend::syncToAccounts()
plugins/Unity/Launcher/backend/launcherbackend.h+7−1
@@ -42,7 +42,7 @@ class LauncherBackend : public QDBusVirtualObject
42 friend LauncherBackendTest;
42 friend LauncherBackendTest;
43
43
44public:
44public:
45− LauncherBackend(QObject *parent = 0);
45+ LauncherBackend(bool greeterMode = false, QObject *parent = 0);
46 virtual ~LauncherBackend();
46 virtual ~LauncherBackend();
47
47
48 /**
48 /**
@@ -162,6 +162,7 @@ public:
162 virtual QString introspect (const QString &path) const;
162 virtual QString introspect (const QString &path) const;
163
163
164Q_SIGNALS:
164Q_SIGNALS:
165+ void refreshApplications() const;
165 void quickListChanged(const QString &appId, const QList<QuickListEntry> &quickList) const;
166 void quickListChanged(const QString &appId, const QList<QuickListEntry> &quickList) const;
166 void progressChanged(const QString &appId, int progress) const;
167 void progressChanged(const QString &appId, int progress) const;
167 void countChanged(const QString &appId, int count) const;
168 void countChanged(const QString &appId, int count) const;
@@ -178,6 +179,8 @@ private:
178 void syncFromAccounts();
179 void syncFromAccounts();
179 void syncToAccounts();
180 void syncToAccounts();
180
181
182+ bool m_greeterMode;
183+
181 QList<QString> m_storedApps;
184 QList<QString> m_storedApps;
182 mutable QHash<QString, LauncherBackendItem*> m_itemCache;
185 mutable QHash<QString, LauncherBackendItem*> m_itemCache;
183
186
@@ -186,6 +189,9 @@ private:
186
189
187 void emitPropChangedDbus(const QString& appId, const QString& property, QVariant &value) const;
190 void emitPropChangedDbus(const QString& appId, const QString& property, QVariant &value) const;
188
191
192+private Q_SLOTS:
193+ void accountsListChanged(const QString &user, const QString &interface, const QStringList &changed);
194+
189protected: /* Protected to allow testing */
195protected: /* Protected to allow testing */
190 LauncherBackendItem* getItem(const QString& appId) const;
196 LauncherBackendItem* getItem(const QString& appId) const;
191
197
plugins/Unity/Launcher/launcheritem.cpp+14−9
@@ -22,12 +22,13 @@
22
22
23#include <libintl.h>
23#include <libintl.h>
24
24
25−LauncherItem::LauncherItem(const QString &appId, const QString &name, const QString &icon, QObject *parent) :
25+LauncherItem::LauncherItem(const QString &appId, const QString &name, const QString &icon, bool pinnable, QObject *parent) :
26 LauncherItemInterface(parent),
26 LauncherItemInterface(parent),
27 m_appId(appId),
27 m_appId(appId),
28 m_name(name),
28 m_name(name),
29 m_icon(icon),
29 m_icon(icon),
30 m_pinned(false),
30 m_pinned(false),
31+ m_pinnable(pinnable),
31 m_running(false),
32 m_running(false),
32 m_recent(false),
33 m_recent(false),
33 m_progress(-1),
34 m_progress(-1),
@@ -38,10 +39,12 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
38 QuickListEntry nameAction;
39 QuickListEntry nameAction;
39 nameAction.setText(m_name);
40 nameAction.setText(m_name);
40 m_quickList->appendAction(nameAction);
41 m_quickList->appendAction(nameAction);
42+ if (m_pinnable) {
41− QuickListEntry pinningAction;
43+ QuickListEntry pinningAction;
42− pinningAction.setActionId("pin_item");
44+ pinningAction.setActionId("pin_item");
43− pinningAction.setText(gettext("Lock to Launcher"));
45+ pinningAction.setText(gettext("Lock to Launcher"));
44− m_quickList->appendAction(pinningAction);
46+ m_quickList->appendAction(pinningAction);
47+ }
45}
48}
46
49
47QString LauncherItem::appId() const
50QString LauncherItem::appId() const
@@ -68,10 +71,12 @@ void LauncherItem::setPinned(bool pinned)
68{
71{
69 if (m_pinned != pinned) {
72 if (m_pinned != pinned) {
70 m_pinned = pinned;
73 m_pinned = pinned;
74+ if (m_pinnable) {
71− QuickListEntry entry;
75+ QuickListEntry entry;
72− entry.setActionId("pin_item");
76+ entry.setActionId("pin_item");
73− entry.setText(pinned ? gettext("Unlock from Launcher") : gettext("Lock to Launcher"));
77+ entry.setText(pinned ? gettext("Unlock from Launcher") : gettext("Lock to Launcher"));
74− m_quickList->updateAction(entry);
78+ m_quickList->updateAction(entry);
79+ }
75 Q_EMIT pinnedChanged(pinned);
80 Q_EMIT pinnedChanged(pinned);
76 }
81 }
77}
82}
plugins/Unity/Launcher/launcheritem.h+2−1
@@ -32,7 +32,7 @@ class LauncherItem: public LauncherItemInterface
32{
32{
33 Q_OBJECT
33 Q_OBJECT
34public:
34public:
35− LauncherItem(const QString &appId, const QString &name, const QString &icon, QObject *parent = 0);
35+ LauncherItem(const QString &appId, const QString &name, const QString &icon, bool pinnable, QObject *parent = 0);
36
36
37 QString appId() const;
37 QString appId() const;
38 QString name() const;
38 QString name() const;
@@ -67,6 +67,7 @@ private:
67 QString m_name;
67 QString m_name;
68 QString m_icon;
68 QString m_icon;
69 bool m_pinned;
69 bool m_pinned;
70+ bool m_pinnable;
70 bool m_running;
71 bool m_running;
71 bool m_recent;
72 bool m_recent;
72 int m_progress;
73 int m_progress;
plugins/Unity/Launcher/launchermodel.cpp+41−11
@@ -27,20 +27,15 @@ using namespace unity::shell::application;
27
27
28LauncherModel::LauncherModel(QObject *parent):
28LauncherModel::LauncherModel(QObject *parent):
29 LauncherModelInterface(parent),
29 LauncherModelInterface(parent),
30+ m_greeterMode(qgetenv("XDG_SESSION_CLASS") == "greeter"),
30− m_backend(new LauncherBackend(this)),
31+ m_backend(new LauncherBackend(m_greeterMode, this)),
31 m_appManager(0)
32 m_appManager(0)
32{
33{
33 connect(m_backend, SIGNAL(countChanged(QString,int)), SLOT(countChanged(QString,int)));
34 connect(m_backend, SIGNAL(countChanged(QString,int)), SLOT(countChanged(QString,int)));
34 connect(m_backend, SIGNAL(progressChanged(QString,int)), SLOT(progressChanged(QString,int)));
35 connect(m_backend, SIGNAL(progressChanged(QString,int)), SLOT(progressChanged(QString,int)));
36+ connect(m_backend, SIGNAL(refreshApplications()), SLOT(refreshStoredApplications()));
35
37
36− Q_FOREACH (const QString &entry, m_backend->storedApplications()) {
38+ refreshStoredApplications();
37− LauncherItem *item = new LauncherItem(entry,
38− m_backend->displayName(entry),
39− m_backend->icon(entry),
40− this);
41− item->setPinned(true);
42− m_list.append(item);
43− }
44}
39}
45
40
46LauncherModel::~LauncherModel()
41LauncherModel::~LauncherModel()
@@ -139,7 +134,8 @@ void LauncherModel::pin(const QString &appId, int index)
139 beginInsertRows(QModelIndex(), index, index);
134 beginInsertRows(QModelIndex(), index, index);
140 LauncherItem *item = new LauncherItem(appId,
135 LauncherItem *item = new LauncherItem(appId,
141 m_backend->displayName(appId),
136 m_backend->displayName(appId),
142− m_backend->icon(appId));
137+ m_backend->icon(appId),
138+ !m_greeterMode);
143 item->setPinned(true);
139 item->setPinned(true);
144 m_list.insert(index, item);
140 m_list.insert(index, item);
145 endInsertRows();
141 endInsertRows();
@@ -199,6 +195,40 @@ void LauncherModel::setUser(const QString &username)
199 m_backend->setUser(username);
195 m_backend->setUser(username);
200}
196}
201
197
198+void LauncherModel::refreshStoredApplications()
199+{
200+ // First remove any existing ones
201+ QList<int> storedAppIndices;
202+ for (int i = 0; i < m_list.count(); ++i) {
203+ if (!m_list.at(i)->recent()) {
204+ storedAppIndices << i;
205+ }
206+ }
207+ int run = 0;
208+ while (storedAppIndices.count() > 0) {
209+ beginRemoveRows(QModelIndex(), storedAppIndices.first() - run, storedAppIndices.first() - run);
210+ m_list.takeAt(storedAppIndices.first() - run)->deleteLater();
211+ endRemoveRows();
212+ storedAppIndices.takeFirst();
213+ ++run;
214+ }
215+
216+ // Now insert all stored apps at beginning of list
217+ QStringList storedApplications = m_backend->storedApplications();
218+ beginInsertRows(QModelIndex(), 0, storedApplications.size() - 1);
219+ run = 0;
220+ Q_FOREACH (const QString &entry, storedApplications) {
221+ LauncherItem *item = new LauncherItem(entry,
222+ m_backend->displayName(entry),
223+ m_backend->icon(entry),
224+ !m_greeterMode,
225+ this);
226+ item->setPinned(true);
227+ m_list.insert(run++, item);
228+ }
229+ endInsertRows();
230+}
231+
202ApplicationManagerInterface *LauncherModel::applicationManager() const
232ApplicationManagerInterface *LauncherModel::applicationManager() const
203{
233{
204 return m_appManager;
234 return m_appManager;
@@ -302,7 +332,7 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
302 if (found) {
332 if (found) {
303 // Shall we paint some running/recent app highlight? If yes, do it here.
333 // Shall we paint some running/recent app highlight? If yes, do it here.
304 } else {
334 } else {
305− LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString());
335+ LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString(), !m_greeterMode);
306 item->setRecent(true);
336 item->setRecent(true);
307 item->setFocused(app->focused());
337 item->setFocused(app->focused());
308
338
plugins/Unity/Launcher/launchermodel.h+2
@@ -62,6 +62,7 @@ private:
62private Q_SLOTS:
62private Q_SLOTS:
63 void progressChanged(const QString &appId, int progress);
63 void progressChanged(const QString &appId, int progress);
64 void countChanged(const QString &appId, int count);
64 void countChanged(const QString &appId, int count);
65+ void refreshStoredApplications();
65
66
66 void applicationAdded(const QModelIndex &parent, int row);
67 void applicationAdded(const QModelIndex &parent, int row);
67 void applicationRemoved(const QModelIndex &parent, int row);
68 void applicationRemoved(const QModelIndex &parent, int row);
@@ -69,6 +70,7 @@ private Q_SLOTS:
69
70
70private:
71private:
71 QList<LauncherItem*> m_list;
72 QList<LauncherItem*> m_list;
73+ bool m_greeterMode;
72 LauncherBackend *m_backend;
74 LauncherBackend *m_backend;
73 ApplicationManagerInterface *m_appManager;
75 ApplicationManagerInterface *m_appManager;
74};
76};