@@ -31,7 +31,6 @@
3131class LauncherBackendItem
3232{
3333public:
34− QString desktopFile;
3534 QString displayName;
3635 QString icon;
3736 int count;
@@ -107,11 +106,6 @@ void LauncherBackend::setStoredApplications(const QStringList &appIds)
107106
108107QString LauncherBackend::desktopFile(const QString &appId) const
109108{
110− LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
111− if (item) {
112− return item->desktopFile;
113− }
114−
115109 return findDesktopFile(appId);
116110}
117111
@@ -264,13 +258,33 @@ void LauncherBackend::syncFromAccounts()
264258 Q_FOREACH(const QString &entry, gSettings.get("favorites").toStringList()) {
265259 if (entry.startsWith("application://")) {
266260 QString appId = entry;
267− // Transform "application://foobar.desktop" to "foobar"
261+ // Transform "application://foobar.desktop" to "application://foobar"
268262 appId.remove("application://");
269263 if (appId.endsWith(".desktop")) {
270264 appId.chop(8);
271265 }
272266 QString df = findDesktopFile(appId);
273267
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+
274288 if (!df.isEmpty()) {
275289 m_storedApps << appId;
276290
@@ -315,10 +329,13 @@ QString LauncherBackend::findDesktopFile(const QString &appId) const
315329 helper = helper.replace(dashPos, 1, '/');
316330 }
317331
318− Q_FOREACH(const QString &searchDir, searchDirs) {
319− QFileInfo fileInfo(QDir(searchDir), helper + ".desktop");
320− if (fileInfo.exists()) {
321− return fileInfo.absoluteFilePath();
332+ Q_FOREACH(const QString &searchDirName, searchDirs) {
333+ QDir searchDir(searchDirName);
334+ Q_FOREACH(const QString &desktopFile, searchDir.entryList(QStringList() << "*.desktop")) {
335+ if (desktopFile.startsWith(helper)) {
336+ QFileInfo fileInfo(searchDir, desktopFile);
337+ return fileInfo.absoluteFilePath();
338+ }
322339 }
323340 }
324341
@@ -333,7 +350,6 @@ LauncherBackendItem* LauncherBackend::parseDesktopFile(const QString &desktopFil
333350 QSettings settings(desktopFile, QSettings::IniFormat);
334351
335352 LauncherBackendItem* item = new LauncherBackendItem();
336− item->desktopFile = desktopFile;
337353 item->displayName = settings.value("Desktop Entry/Name").toString();
338354
339355 QString iconString = settings.value("Desktop Entry/Icon").toString();
@@ -367,7 +383,7 @@ LauncherBackendItem* LauncherBackend::getItem(const QString &appId) const
367383 qWarning() << "Unable to parse desktop file for" << appId << "path" << df;
368384 }
369385 } else {
370− qDebug() << "Unable to find desktop file for:" << appId;
386+ qWarning() << "Unable to find desktop file for:" << appId;
371387 }
372388 }
373389
@@ -391,7 +407,6 @@ void LauncherBackend::loadFromVariant(const QVariantMap &details)
391407
392408 item = new LauncherBackendItem();
393409
394− item->desktopFile = details.value("desktopFile").toString();
395410 item->displayName = details.value("name").toString();
396411 item->icon = details.value("icon").toString();
397412 item->count = details.value("count").toInt();
@@ -408,7 +423,6 @@ QVariantMap LauncherBackend::itemToVariant(const QString &appId) const
408423 details.insert("id", appId);
409424 details.insert("name", item->displayName);
410425 details.insert("icon", item->icon);
411− details.insert("desktopFile", item->desktopFile);
412426 details.insert("count", item->count);
413427 details.insert("countVisible", item->countVisible);
414428 return details;