on xenial help sign in
support appid:// entries in gsettings schema and make findDesktopFile work with short-appid Fixes: 1239750
9c9a13bMichael Zanetti
plugins/Unity/Launcher/backend/launcherbackend.cpp+29−15
@@ -31,7 +31,6 @@
31class LauncherBackendItem
31class LauncherBackendItem
32{
32{
33public:
33public:
34− QString desktopFile;
35 QString displayName;
34 QString displayName;
36 QString icon;
35 QString icon;
37 int count;
36 int count;
@@ -107,11 +106,6 @@ void LauncherBackend::setStoredApplications(const QStringList &appIds)
107
106
108QString LauncherBackend::desktopFile(const QString &appId) const
107QString LauncherBackend::desktopFile(const QString &appId) const
109{
108{
110− LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
111− if (item) {
112− return item->desktopFile;
113− }
114−
115 return findDesktopFile(appId);
109 return findDesktopFile(appId);
116}
110}
117
111
@@ -264,13 +258,33 @@ void LauncherBackend::syncFromAccounts()
264 Q_FOREACH(const QString &entry, gSettings.get("favorites").toStringList()) {
258 Q_FOREACH(const QString &entry, gSettings.get("favorites").toStringList()) {
265 if (entry.startsWith("application://")) {
259 if (entry.startsWith("application://")) {
266 QString appId = entry;
260 QString appId = entry;
267− // Transform "application://foobar.desktop" to "foobar"
261+ // Transform "application://foobar.desktop" to "application://foobar"
268 appId.remove("application://");
262 appId.remove("application://");
269 if (appId.endsWith(".desktop")) {
263 if (appId.endsWith(".desktop")) {
270 appId.chop(8);
264 appId.chop(8);
271 }
265 }
272 QString df = findDesktopFile(appId);
266 QString df = findDesktopFile(appId);
273
267
268+ if (!df.isEmpty()) {
269+ m_storedApps << appId;
270+
271+ if (!m_itemCache.contains(appId)) {
272+ m_itemCache.insert(appId, parseDesktopFile(df));
273+ }
274+ }
275+ }
276+ if (entry.startsWith("appid://")) {
277+ QString appId = entry;
278+ appId.remove("appid://");
279+ // Strip hook name and current-user-version in case its there
280+
281+ if (appId.split('/').count() != 3) {
282+ qWarning() << "ignoring entry " + appId + ". Not a valid appId.";
283+ continue;
284+ }
285+ appId = appId.split('/').first() + "_" + appId.split('/').at(1);
286+ QString df = findDesktopFile(appId);
287+
274 if (!df.isEmpty()) {
288 if (!df.isEmpty()) {
275 m_storedApps << appId;
289 m_storedApps << appId;
276
290
@@ -315,10 +329,13 @@ QString LauncherBackend::findDesktopFile(const QString &appId) const
315 helper = helper.replace(dashPos, 1, '/');
329 helper = helper.replace(dashPos, 1, '/');
316 }
330 }
317
331
318− Q_FOREACH(const QString &searchDir, searchDirs) {
332+ Q_FOREACH(const QString &searchDirName, searchDirs) {
319− QFileInfo fileInfo(QDir(searchDir), helper + ".desktop");
333+ QDir searchDir(searchDirName);
320− if (fileInfo.exists()) {
334+ Q_FOREACH(const QString &desktopFile, searchDir.entryList(QStringList() << "*.desktop")) {
335+ if (desktopFile.startsWith(helper)) {
336+ QFileInfo fileInfo(searchDir, desktopFile);
321− return fileInfo.absoluteFilePath();
337+ return fileInfo.absoluteFilePath();
338+ }
322 }
339 }
323 }
340 }
324
341
@@ -333,7 +350,6 @@ LauncherBackendItem* LauncherBackend::parseDesktopFile(const QString &desktopFil
333 QSettings settings(desktopFile, QSettings::IniFormat);
350 QSettings settings(desktopFile, QSettings::IniFormat);
334
351
335 LauncherBackendItem* item = new LauncherBackendItem();
352 LauncherBackendItem* item = new LauncherBackendItem();
336− item->desktopFile = desktopFile;
337 item->displayName = settings.value("Desktop Entry/Name").toString();
353 item->displayName = settings.value("Desktop Entry/Name").toString();
338
354
339 QString iconString = settings.value("Desktop Entry/Icon").toString();
355 QString iconString = settings.value("Desktop Entry/Icon").toString();
@@ -367,7 +383,7 @@ LauncherBackendItem* LauncherBackend::getItem(const QString &appId) const
367 qWarning() << "Unable to parse desktop file for" << appId << "path" << df;
383 qWarning() << "Unable to parse desktop file for" << appId << "path" << df;
368 }
384 }
369 } else {
385 } else {
370− qDebug() << "Unable to find desktop file for:" << appId;
386+ qWarning() << "Unable to find desktop file for:" << appId;
371 }
387 }
372 }
388 }
373
389
@@ -391,7 +407,6 @@ void LauncherBackend::loadFromVariant(const QVariantMap &details)
391
407
392 item = new LauncherBackendItem();
408 item = new LauncherBackendItem();
393
409
394− item->desktopFile = details.value("desktopFile").toString();
395 item->displayName = details.value("name").toString();
410 item->displayName = details.value("name").toString();
396 item->icon = details.value("icon").toString();
411 item->icon = details.value("icon").toString();
397 item->count = details.value("count").toInt();
412 item->count = details.value("count").toInt();
@@ -408,7 +423,6 @@ QVariantMap LauncherBackend::itemToVariant(const QString &appId) const
408 details.insert("id", appId);
423 details.insert("id", appId);
409 details.insert("name", item->displayName);
424 details.insert("name", item->displayName);
410 details.insert("icon", item->icon);
425 details.insert("icon", item->icon);
411− details.insert("desktopFile", item->desktopFile);
412 details.insert("count", item->count);
426 details.insert("count", item->count);
413 details.insert("countVisible", item->countVisible);
427 details.insert("countVisible", item->countVisible);
414 return details;
428 return details;