diff --git a/src/dbus/applicationmanager1service.cpp b/src/dbus/applicationmanager1service.cpp index cc6b9f8..a70b3c4 100644 --- a/src/dbus/applicationmanager1service.cpp +++ b/src/dbus/applicationmanager1service.cpp @@ -357,8 +357,12 @@ QHash, QString> ApplicationManager1Service::s continue; } + QString originalSource; QSharedPointer app{nullptr}; auto asApplication = tmp.value(DesktopFileEntryKey, X_Deepin_GenerateSource).value_or(DesktopEntry::Value{}); + auto shouldLaunch = tmp.value(DesktopFileEntryKey, DesktopEntryHidden).value_or(DesktopEntry::Value{}); + auto autostartFlag = shouldLaunch.isNull() || (shouldLaunch.toString().compare("true", Qt::CaseInsensitive) != 0); + if (!asApplication.isNull()) { // modified by application manager auto appSource = asApplication.toString(); @@ -388,22 +392,19 @@ QHash, QString> ApplicationManager1Service::s qWarning() << "add autostart application failed, skip."; continue; } + + originalSource = appSource; } - auto shouldLaunch = tmp.value(DesktopFileEntryKey, DesktopEntryHidden).value_or(DesktopEntry::Value{}); - if (!shouldLaunch.isNull() and (shouldLaunch.toString().compare("true", Qt::CaseInsensitive) == 0)) { - if (app) - app->setAutostartSource({desktopFile.sourcePath(), std::move(tmp)}); - - qInfo() << "shouldn't launch this autoStart item."; - continue; - } - + originalSource = originalSource.isNull() ? desktopFile.sourcePath() : originalSource; if (app) { - auto realExec = tmp.value(DesktopFileEntryKey, "Exec").value_or(QString{""}).toString(); - qInfo() << "launch normal autostart application " << app->id() << " by " << realExec; - ret.insert(app, realExec); - app->setAutostartSource({desktopFile.sourcePath(), std::move(tmp)}); + if (autostartFlag) { + auto realExec = tmp.value(DesktopFileEntryKey, "Exec").value_or(QString{""}).toString(); + qInfo() << "launch autostart application " << app->id() << " by " << realExec; + ret.insert(app, realExec); + } + + app->setAutostartSource({std::move(originalSource), std::move(tmp)}); continue; } @@ -417,24 +418,28 @@ QHash, QString> ApplicationManager1Service::s m_applicationList.cend(), [&desktopFile](const auto &app) { return desktopFile.desktopId() == app->id(); }); appIt != m_applicationList.cend()) { - auto realExec = tmp.value(DesktopFileEntryKey, "Exec").value_or(QString{""}).toString(); - qInfo() << "launch exist autostart application " << (*appIt)->id() << " by " << realExec; - ret.insert(*appIt, realExec); - (*appIt)->setAutostartSource({desktopFile.sourcePath(), std::move(tmp)}); + if (autostartFlag) { + auto realExec = tmp.value(DesktopFileEntryKey, "Exec").value_or(QString{""}).toString(); + qInfo() << "launch exist autostart application " << (*appIt)->id() << " by " << realExec; + ret.insert(*appIt, realExec); + } + (*appIt)->setAutostartSource({std::move(originalSource), std::move(tmp)}); continue; } guard.close(); // new application - auto newApp = addApplication(std::move(desktopFile)); - if (!newApp) { + app = addApplication(std::move(desktopFile)); + if (!app) { qWarning() << "add autostart application failed, skip."; continue; } + app->setAutostartSource({std::move(originalSource), {}}); - qInfo() << "launch new autostart application " << newApp->id(); - newApp->setAutostartSource({desktopFile.sourcePath(), {}}); - ret.insert(newApp, {}); + if (autostartFlag) { + qInfo() << "launch new autostart application " << app->id(); + ret.insert(app, {}); + } } return ret; @@ -475,8 +480,7 @@ QSharedPointer ApplicationManager1Service::addApplication(De { auto objectPath = QDBusObjectPath{getObjectPathFromAppId(desktopFileSource.desktopId())}; if (auto app = m_applicationList.constFind(objectPath); app != m_applicationList.cend()) { - qInfo() << "this application already exists." - << "current desktop source:" << desktopFileSource.sourcePath() + qInfo() << "this application already exists." << "current desktop source:" << desktopFileSource.sourcePath() << "exists app source:" << app->data()->desktopFileSource().sourcePath(); return *app; } diff --git a/src/dbus/applicationservice.cpp b/src/dbus/applicationservice.cpp index 3d9435a..266066d 100644 --- a/src/dbus/applicationservice.cpp +++ b/src/dbus/applicationservice.cpp @@ -623,6 +623,10 @@ bool ApplicationService::isAutoStart() const noexcept return false; } + if (m_autostartSource.m_filePath == m_desktopSource.sourcePath()) { + return true; + } + auto appId = id(); auto dirs = getAutoStartDirs(); QString destDesktopFile; @@ -663,13 +667,18 @@ void ApplicationService::setAutoStart(bool autostart) noexcept } DesktopEntry newEntry; + QString originalSource; if (!m_autostartSource.m_entry.data().isEmpty()) { newEntry = m_autostartSource.m_entry; + originalSource = newEntry.value(DesktopFileEntryKey, X_Deepin_GenerateSource) + .value_or(DesktopEntry::Value{m_autostartSource.m_filePath}) + .toString(); } else { newEntry = *m_entry; + originalSource = m_desktopSource.sourcePath(); } - newEntry.insert(DesktopFileEntryKey, X_Deepin_GenerateSource, m_desktopSource.sourcePath()); + newEntry.insert(DesktopFileEntryKey, X_Deepin_GenerateSource, originalSource); newEntry.insert(DesktopFileEntryKey, DesktopEntryHidden, !autostart); setAutostartSource({fileName, newEntry}); @@ -1027,8 +1036,7 @@ LaunchTask ApplicationService::unescapeExec(const QString &str, const QStringLis const auto &rawValue = val.value(); if (!rawValue.canConvert()) { - qDebug() << "Name's underlying type mismatch:" - << "QStringMap" << rawValue.metaType().name(); + qDebug() << "Name's underlying type mismatch:" << "QStringMap" << rawValue.metaType().name(); task.command.append(std::move(execList)); return task; }