Skip to content

Commit f46b80a

Browse files
committed
chore: TrayLoader single process support to start multiple plugins
1.Divide plugins into three groups(selfMaintenance,application,other) 2.single process support to start multiple plugins Log: as title Bug: https://pms.uniontech.com/bug-view-283901.html
1 parent 7554941 commit f46b80a

File tree

4 files changed

+157
-48
lines changed

4 files changed

+157
-48
lines changed

debian/control

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, libdde-shell( =${binary:Version}),
6060
libdtk6declarative, qml6-module-qtquick-controls2-styles-chameleon,
6161
qml6-module-qtquick-layouts, qml6-module-qtquick-window,
6262
qml6-module-qt-labs-platform, qml6-module-qt-labs-qmlmodels,
63-
dde-tray-loader
63+
dde-tray-loader (> 1.99.6)
6464
Multi-Arch: same
6565
Description: An wrapper for developed based on dde-shell plugin system
6666

panels/dock/dconfig/org.deepin.ds.dock.tray.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,38 @@
7676
"description[zh_CN]": "托盘折叠区域当前的状态",
7777
"permissions": "readwrite",
7878
"visibility": "private"
79+
},
80+
"selfMaintenanceTrayPlugins": {
81+
"value": ["libapplication-tray.so", "libbrightness.so", "libdatetime.so", "libdnd-mode.so", "libeye-comfort-mode.so", "libmedia.so", "libnotification.so", "libonboard.so", "libshutdown.so", "libairplane-mode.so", "libbluetooth.so", "libdock-tray-network-plugin.so", "libdock-wirelesscasting-plugin.so", "libkeyboard-layout.so", "libpower.so", "libsound.so"],
82+
"serial": 0,
83+
"flags": [],
84+
"name": "self maintenance plugins",
85+
"name[zh_CN]": "自维护托盘插件",
86+
"description": "self maintenance plugins",
87+
"description[zh_CN]": "自维护托盘插件",
88+
"permissions": "readonly",
89+
"visibility": "private"
90+
},
91+
"subprojectTrayPlugins": {
92+
"value": ["libdock-clipboard-plugin.so", "libddegrandsearch_dockplugin.so", "libdeepin-screen-recorder-plugin.so", "libdeepin-system-monitor-plugin.so", "libshot-start-plugin.so", "libshot-start-record-plugin.so", "libdde-disk-mount-plugin.so"],
93+
"serial": 0,
94+
"flags": [],
95+
"name": "subproject tray plugins",
96+
"name[zh_CN]": "子项目托盘插件",
97+
"description": "subproject tray plugins",
98+
"description[zh_CN]": "子项目托盘插件",
99+
"permissions": "readwrite",
100+
"visibility": "private"
101+
},
102+
"crashProneTrayPlugins": {
103+
"value": [],
104+
"serial": 0,
105+
"flags": [],
106+
"name": "crash-prone tray plugins",
107+
"name[zh_CN]": "易于崩溃的托盘插件",
108+
"description": "crash-prone tray plugins",
109+
"description[zh_CN]": "易于崩溃的托盘插件",
110+
"permissions": "readwrite"
79111
}
80112
}
81113
}

panels/dock/loadtrayplugins.cpp

Lines changed: 119 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#include <signal.h>
99

10+
#include <DConfig>
11+
1012
#include <QDir>
1113
#include <QTimer>
1214
#include <QGuiApplication>
@@ -32,58 +34,17 @@ LoadTrayPlugins::~LoadTrayPlugins()
3234

3335
void LoadTrayPlugins::loadDockPlugins()
3436
{
35-
QStringList filters;
36-
filters << "*.so";
37-
38-
QStringList execPaths;
39-
execPaths << qEnvironmentVariable("TRAY_LOADER_EXECUTE_PATH")
40-
<< QString("%1/trayplugin-loader").arg(CMAKE_INSTALL_FULL_LIBEXECDIR);
41-
42-
QString validExePath;
43-
for (const QString &execPath : execPaths) {
44-
if (QFile::exists(execPath)) {
45-
validExePath = execPath;
46-
break;
47-
}
48-
}
49-
37+
QString validExePath = loaderPath();
5038
if (validExePath.isEmpty()) {
5139
qWarning() << "No valid loader executable path found.";
5240
return;
5341
}
5442

55-
QStringList dirs;
56-
const auto pluginsPath = qEnvironmentVariable("TRAY_DEBUG_PLUGIN_PATH");
57-
if (!pluginsPath.isEmpty())
58-
dirs << pluginsPath.split(QDir::listSeparator());
59-
60-
if (dirs.isEmpty())
61-
dirs << pluginDirs;
62-
63-
for (auto &pluginDir : dirs) {
64-
QDir dir(pluginDir);
65-
if (!dir.exists()) {
66-
qWarning() << "The plugin directory does not exist:" << pluginDir;
67-
continue;
68-
}
69-
70-
auto pluginFileInfos = dir.entryInfoList(filters, QDir::Files);
71-
foreach (auto pluginInfo, pluginFileInfos) {
72-
qInfo() << "pluginLoader load plugin" << pluginInfo.absoluteFilePath();
73-
74-
QProcess *process = new QProcess(this);
75-
setProcessEnv(process);
76-
77-
connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
78-
this, &LoadTrayPlugins::handleProcessFinished);
79-
80-
ProcessInfo pInfo = { process, pluginInfo.absoluteFilePath(), 0 };
81-
m_processes.append(pInfo);
82-
83-
process->setProgram(validExePath);
84-
process->setArguments({"-p", pluginInfo.absoluteFilePath(), "-platform", "wayland"});
85-
process->start();
86-
}
43+
auto pluginGroupMap = groupPlugins(allPluginPaths());
44+
for (auto it = pluginGroupMap.begin(); it != pluginGroupMap.end(); ++it) {
45+
if (it.value().isEmpty()) continue;
46+
qDebug() << "Load plugin:" << it.value() << " group:" << it.key();
47+
startProcess(validExePath, it.value(), it.key());
8748
}
8849
}
8950

@@ -113,6 +74,22 @@ void LoadTrayPlugins::handleProcessFinished(int exitCode, QProcess::ExitStatus e
11374
}
11475
}
11576

77+
void LoadTrayPlugins::startProcess(const QString &loaderPath, const QString &pluginPath, const QString &groupName)
78+
{
79+
auto *process = new QProcess(this);
80+
setProcessEnv(process);
81+
82+
connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
83+
this, &LoadTrayPlugins::handleProcessFinished);
84+
85+
ProcessInfo pInfo = { process, pluginPath, 0 };
86+
m_processes.append(pInfo);
87+
88+
process->setProgram(loaderPath);
89+
process->setArguments({"-p", pluginPath, "-g", groupName, "-platform", "wayland"});
90+
process->start();
91+
}
92+
11693
void LoadTrayPlugins::setProcessEnv(QProcess *process)
11794
{
11895
if (!process) return;
@@ -124,4 +101,99 @@ void LoadTrayPlugins::setProcessEnv(QProcess *process)
124101
process->setProcessEnvironment(env);
125102
}
126103

104+
QString LoadTrayPlugins::loaderPath() const
105+
{
106+
QStringList execPaths;
107+
execPaths << qEnvironmentVariable("TRAY_LOADER_EXECUTE_PATH")
108+
<< QString("%1/trayplugin-loader").arg(CMAKE_INSTALL_FULL_LIBEXECDIR);
109+
110+
QString validExePath;
111+
for (const QString &execPath : execPaths) {
112+
if (QFile::exists(execPath)) {
113+
validExePath = execPath;
114+
break;
115+
}
116+
}
117+
118+
return validExePath;
119+
}
120+
121+
QStringList LoadTrayPlugins::allPluginPaths() const
122+
{
123+
QStringList dirs;
124+
const auto pluginsPath = qEnvironmentVariable("TRAY_DEBUG_PLUGIN_PATH");
125+
if (!pluginsPath.isEmpty())
126+
dirs << pluginsPath.split(QDir::listSeparator());
127+
128+
if (dirs.isEmpty())
129+
dirs << pluginDirs;
130+
131+
QStringList pluginPaths;
132+
for (auto &pluginDir : dirs) {
133+
QDir dir(pluginDir);
134+
if (!dir.exists()) {
135+
qWarning() << "The plugin directory does not exist:" << pluginDir;
136+
continue;
137+
}
138+
139+
auto pluginFileInfos = dir.entryInfoList({"*.so"}, QDir::Files);
140+
for (auto &pluginInfo : pluginFileInfos) {
141+
pluginPaths.append(pluginInfo.absoluteFilePath());
142+
}
143+
}
144+
145+
return pluginPaths;
146+
}
147+
148+
QMap<QString, QString> LoadTrayPlugins::groupPlugins(const QStringList &pluginPaths) const
149+
{
150+
const QString selfMaintenancePluginsKey = "selfMaintenanceTrayPlugins";
151+
const QString subprojectPluginsKey = "subprojectTrayPlugins";
152+
const QString crashPronePluginsKey = "crashProneTrayPlugins";
153+
const QString otherPluginsKey = "otherTrayPlugins";
154+
155+
auto dConfig = Dtk::Core::DConfig::create("org.deepin.dde.shell", "org.deepin.ds.dock.tray", QString());
156+
QStringList selfMaintenanceTrayPlugins = dConfig->value(selfMaintenancePluginsKey).toStringList();
157+
QStringList subprojectTrayPlugins = dConfig->value(subprojectPluginsKey).toStringList();
158+
QStringList crashProneTrayPlugins = dConfig->value(crashPronePluginsKey).toStringList();
159+
dConfig->deleteLater();
160+
161+
QStringList selfMaintenancePluginPaths;
162+
QStringList subprojectPluginPaths;
163+
QStringList crashPronePluginPaths;
164+
QStringList otherPluginPaths;
165+
166+
for (auto &filePath : pluginPaths) {
167+
QString pluginName = filePath.section("/", -1);
168+
if (crashProneTrayPlugins.contains(pluginName)) {
169+
crashPronePluginPaths.append(filePath);
170+
} else if (selfMaintenanceTrayPlugins.contains(pluginName)) {
171+
selfMaintenancePluginPaths.append(filePath);
172+
} else if (subprojectTrayPlugins.contains(pluginName)) {
173+
subprojectPluginPaths.append(filePath);
174+
} else {
175+
otherPluginPaths.append(filePath);
176+
}
177+
}
178+
179+
QMap<QString, QString> pluginGroup;
180+
181+
if (!selfMaintenancePluginPaths.isEmpty()) {
182+
pluginGroup.insert(selfMaintenancePluginsKey, selfMaintenancePluginPaths.join(";"));
183+
}
184+
185+
if (!subprojectPluginPaths.isEmpty()) {
186+
pluginGroup.insert(subprojectPluginsKey, subprojectPluginPaths.join(";"));
187+
}
188+
189+
if (!crashPronePluginPaths.isEmpty()) {
190+
pluginGroup.insert(crashPronePluginsKey, crashPronePluginPaths.join(";"));
191+
}
192+
193+
if (!otherPluginPaths.isEmpty()) {
194+
pluginGroup.insert(otherPluginsKey, otherPluginPaths.join(";"));
195+
}
196+
197+
return pluginGroup;
198+
}
127199
}

panels/dock/loadtrayplugins.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ private slots:
2626
void handleProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);
2727

2828
private:
29+
QString loaderPath() const;
30+
QStringList allPluginPaths() const;
31+
QMap<QString, QString> groupPlugins(const QStringList &pluginPaths) const;
32+
33+
void startProcess(const QString &loaderPath, const QString &pluginPath, const QString &groupName);
2934
void setProcessEnv(QProcess *process);
3035

3136
private:

0 commit comments

Comments
 (0)