Skip to content

Commit 254a5af

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 10d9568 commit 254a5af

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;
@@ -127,4 +104,99 @@ void LoadTrayPlugins::setProcessEnv(QProcess *process)
127104
process->setProcessEnvironment(env);
128105
}
129106

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

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)