feat: support apps launched directly by systemd
Do not filter out those not launched by application manager. Assume unit name as the app id. When Identify, assume there is only one unique instance. Log: support apps launched directly by systemd Related-to: https://github.com/linuxdeepin/developer-center/issues/8088
This commit is contained in:
parent
60965359cb
commit
e6fd0a61a5
@ -187,10 +187,6 @@ void ApplicationManager1Service::initService(QDBusConnection &connection) noexce
|
||||
|
||||
void ApplicationManager1Service::addInstanceToApplication(const QString &unitName, const QDBusObjectPath &systemdUnitPath)
|
||||
{
|
||||
if (!isApplication(systemdUnitPath)) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto info = processUnitName(unitName);
|
||||
auto appId = std::move(info.applicationID);
|
||||
auto launcher = std::move(info.Launcher);
|
||||
@ -199,6 +195,9 @@ void ApplicationManager1Service::addInstanceToApplication(const QString &unitNam
|
||||
if (appId.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
if (instanceId.isEmpty()) {
|
||||
instanceId = QUuid::createUuid().toString(QUuid::Id128);
|
||||
}
|
||||
|
||||
auto appIt = std::find_if(m_applicationList.cbegin(),
|
||||
m_applicationList.cend(),
|
||||
@ -220,10 +219,6 @@ void ApplicationManager1Service::addInstanceToApplication(const QString &unitNam
|
||||
|
||||
void ApplicationManager1Service::removeInstanceFromApplication(const QString &unitName, const QDBusObjectPath &systemdUnitPath)
|
||||
{
|
||||
if (!isApplication(systemdUnitPath)) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto info = processUnitName(unitName);
|
||||
auto appId = std::move(info.applicationID);
|
||||
auto launcher = std::move(info.Launcher);
|
||||
@ -316,9 +311,6 @@ void ApplicationManager1Service::scanInstances() noexcept
|
||||
QList<SystemdUnitDBusMessage> units;
|
||||
v.value<QDBusArgument>() >> units;
|
||||
for (const auto &unit : units) {
|
||||
if (!isApplication(unit.objectPath)) {
|
||||
continue;
|
||||
}
|
||||
if (unit.subState == "running") {
|
||||
this->addInstanceToApplication(unit.name, unit.objectPath);
|
||||
}
|
||||
@ -567,10 +559,16 @@ QString ApplicationManager1Service::Identify(const QDBusUnixFileDescriptor &pidf
|
||||
return {};
|
||||
}
|
||||
|
||||
auto instancePath = (*app)->findInstance(ret.InstanceId);
|
||||
|
||||
if (auto path = instancePath.path(); path.isEmpty()) {
|
||||
sendErrorReply(QDBusError::Failed, "can't find instance:" % path);
|
||||
QDBusObjectPath instancePath;
|
||||
const auto &instances = (*app)->instances();
|
||||
if (ret.InstanceId.isEmpty() && instances.size() == 1) {
|
||||
// Maybe a dbus systemd service
|
||||
instancePath = instances.constFirst();
|
||||
} else {
|
||||
instancePath = (*app)->findInstance(ret.InstanceId);
|
||||
}
|
||||
if (instancePath.path().isEmpty()) {
|
||||
sendErrorReply(QDBusError::Failed, "can't find instance:" % ret.InstanceId);
|
||||
return {};
|
||||
}
|
||||
|
||||
|
15
src/global.h
15
src/global.h
@ -481,11 +481,6 @@ inline QString getCurrentDesktop()
|
||||
return desktops.first();
|
||||
}
|
||||
|
||||
inline bool isApplication(const QDBusObjectPath &path)
|
||||
{
|
||||
return path.path().split('/').last().startsWith("app");
|
||||
}
|
||||
|
||||
struct unitInfo
|
||||
{
|
||||
QString applicationID;
|
||||
@ -503,8 +498,10 @@ inline unitInfo processUnitName(const QString &unitName)
|
||||
|
||||
decltype(auto) appPrefix = u8"app-";
|
||||
if (!unitName.startsWith(appPrefix)) {
|
||||
qDebug() << "this unit " << unitName << "isn't an app unit.";
|
||||
return {};
|
||||
// If not started by application manager, just remove suffix and take name as app id.
|
||||
auto lastDotIndex = unitName.lastIndexOf('.');
|
||||
applicationId = unitName.sliced(0, lastDotIndex);
|
||||
return {unescapeApplicationId(applicationId), std::move(launcher), std::move(instanceId)};
|
||||
}
|
||||
|
||||
auto unit = unitName.sliced(sizeof(appPrefix) - 1);
|
||||
@ -540,10 +537,6 @@ inline unitInfo processUnitName(const QString &unitName)
|
||||
return {};
|
||||
}
|
||||
|
||||
if (instanceId.isEmpty()) {
|
||||
instanceId = QUuid::createUuid().toString(QUuid::Id128);
|
||||
}
|
||||
|
||||
return {unescapeApplicationId(applicationId), std::move(launcher), std::move(instanceId)};
|
||||
}
|
||||
|
||||
|
@ -54,18 +54,10 @@ void SystemdSignalDispatcher::onPropertiesChanged(QString interface, QVariantMap
|
||||
|
||||
void SystemdSignalDispatcher::onUnitNew(QString unitName, QDBusObjectPath systemdUnitPath)
|
||||
{
|
||||
if (!unitName.startsWith("app-")) {
|
||||
return;
|
||||
}
|
||||
|
||||
emit SystemdUnitNew(unitName, systemdUnitPath);
|
||||
}
|
||||
|
||||
void SystemdSignalDispatcher::onUnitRemoved(QString unitName, QDBusObjectPath systemdUnitPath)
|
||||
{
|
||||
if (!unitName.startsWith("app-")) {
|
||||
return;
|
||||
}
|
||||
|
||||
emit SystemdUnitRemoved(unitName, systemdUnitPath);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user