feat: support AutoStart
Signed-off-by: ComixHe <heyuming@deepin.org>
This commit is contained in:
parent
30a03974f3
commit
acba7b727e
@ -49,10 +49,27 @@ ApplicationManager1Service::ApplicationManager1Service(std::unique_ptr<Identifie
|
||||
this,
|
||||
&ApplicationManager1Service::removeInstanceFromApplication);
|
||||
|
||||
this->scanApplications();
|
||||
this->scanInstances();
|
||||
scanApplications();
|
||||
|
||||
// TODO: send custom event;
|
||||
scanInstances();
|
||||
|
||||
auto runtimePath = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
|
||||
if (runtimePath.isEmpty()) {
|
||||
runtimePath = QString{"/run/user/%1"}.arg(getCurrentUID());
|
||||
}
|
||||
|
||||
bool firstStart{false};
|
||||
QDir runtimeDir{runtimePath};
|
||||
if (!runtimeDir.exists("ApplicationManager")) {
|
||||
QFile flag{runtimeDir.filePath("ApplicationManager")};
|
||||
if (!flag.open(QFile::WriteOnly | QFile::NewOnly)) {
|
||||
qWarning() << "create record file failed.";
|
||||
} else {
|
||||
firstStart = true;
|
||||
}
|
||||
}
|
||||
|
||||
scanAutoStart(firstStart);
|
||||
}
|
||||
|
||||
void ApplicationManager1Service::addInstanceToApplication(const QString &unitName, const QDBusObjectPath &systemdUnitPath)
|
||||
@ -160,6 +177,33 @@ void ApplicationManager1Service::scanInstances() noexcept
|
||||
}
|
||||
}
|
||||
|
||||
void ApplicationManager1Service::scanAutoStart(bool firstStart) noexcept
|
||||
{
|
||||
if (!firstStart) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto autostartDirs = getAutoStartDirs();
|
||||
QStringList needToLaunch;
|
||||
applyIteratively(QList<QDir>{autostartDirs.cbegin(), autostartDirs.cend()}, [&needToLaunch](const QFileInfo &info) {
|
||||
if (info.isSymbolicLink()) {
|
||||
needToLaunch.emplace_back(info.symLinkTarget());
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
while (!needToLaunch.isEmpty()) {
|
||||
const auto &filePath = needToLaunch.takeFirst();
|
||||
auto appIt =
|
||||
std::find_if(m_applicationList.constKeyValueBegin(),
|
||||
m_applicationList.constKeyValueEnd(),
|
||||
[&filePath](const auto &pair) { return pair.second->m_desktopSource.sourcePath() == filePath; });
|
||||
if (appIt != m_applicationList.constKeyValueEnd()) {
|
||||
appIt->second->Launch({}, {}, {});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QList<QDBusObjectPath> ApplicationManager1Service::list() const
|
||||
{
|
||||
return m_applicationList.keys();
|
||||
|
@ -56,6 +56,7 @@ private:
|
||||
|
||||
void scanApplications() noexcept;
|
||||
void scanInstances() noexcept;
|
||||
void scanAutoStart(bool firstStart) noexcept;
|
||||
void addInstanceToApplication(const QString &unitName, const QDBusObjectPath &systemdUnitPath);
|
||||
void removeInstanceFromApplication(const QString &unitName, const QDBusObjectPath &systemdUnitPath);
|
||||
};
|
||||
|
@ -372,6 +372,32 @@ bool ApplicationService::isAutoStart() const noexcept
|
||||
|
||||
void ApplicationService::setAutoStart(bool autostart) noexcept
|
||||
{
|
||||
if (autostart == m_AutoStart) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto path = getAutoStartDirs().first();
|
||||
auto linkName = QDir{path}.filePath(m_desktopSource.desktopId() + ".desktop");
|
||||
auto &file = m_desktopSource.sourceFileRef();
|
||||
|
||||
if (autostart) {
|
||||
if (!file.link(linkName)) {
|
||||
qWarning() << "link to autostart failed:" << file.errorString();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
QFileInfo info{linkName};
|
||||
if (!info.exists() or !info.isSymbolicLink()) {
|
||||
qWarning() << "same name desktop file exists:" << linkName << "but this may not created by AM.";
|
||||
return;
|
||||
}
|
||||
QFile linkFile{linkName};
|
||||
if (!linkFile.remove()) {
|
||||
qWarning() << "remove link failed:" << linkFile.errorString();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m_AutoStart = autostart;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user