fix: correct autostart source during scanning autostart desktop file

Signed-off-by: ComixHe <heyuming@deepin.org>
This commit is contained in:
ComixHe 2024-05-14 14:03:59 +08:00 committed by Comix
parent 0555895452
commit 23002cda6a
2 changed files with 39 additions and 27 deletions

View File

@ -357,8 +357,12 @@ QHash<QSharedPointer<ApplicationService>, QString> ApplicationManager1Service::s
continue;
}
QString originalSource;
QSharedPointer<ApplicationService> 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<QSharedPointer<ApplicationService>, 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<QSharedPointer<ApplicationService>, 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<ApplicationService> 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;
}

View File

@ -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<QStringMap>()) {
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;
}