Skip to content

Commit 0ea3291

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 0ea3291

File tree

4 files changed

+147
-48
lines changed

4 files changed

+147
-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": "readonly",
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: 110 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 = getPluginGroup();
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({"-l", pluginPath, "-g", groupName, "-platform", "wayland"});
90+
process->start();
91+
}
92+
11693
void LoadTrayPlugins::setProcessEnv(QProcess *process)
11794
{
11895
if (!process) return;
@@ -127,4 +104,90 @@ 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+
QMap<QString, QString> LoadTrayPlugins::getPluginGroup() const
125+
{
126+
const QString selfMaintenancePlugins = "selfMaintenancePlugins";
127+
const QString subprojectPlugins = "subprojectPlugins";
128+
const QString crashPronePlugins = "crashPronePlugins";
129+
const QString otherPlugins = "otherPlugins";
130+
131+
auto dConfig = Dtk::Core::DConfig::create("org.deepin.dde.shell", "org.deepin.ds.dock.tray", QString());
132+
QStringList selfMaintenanceTrayPlugins = dConfig->value("selfMaintenanceTrayPlugins").toStringList();
133+
QStringList subprojectTrayPlugins = dConfig->value("subProjectTrayPlugins").toStringList();
134+
QStringList crashProneTrayPlugins = dConfig->value("crashProneTrayPlugins").toStringList();
135+
dConfig->deleteLater();
136+
137+
QStringList dirs;
138+
const auto pluginsPath = qEnvironmentVariable("TRAY_DEBUG_PLUGIN_PATH");
139+
if (!pluginsPath.isEmpty())
140+
dirs << pluginsPath.split(QDir::listSeparator());
141+
142+
if (dirs.isEmpty())
143+
dirs << pluginDirs;
144+
145+
QStringList selfMaintenancePluginPaths;
146+
QStringList subprojectPluginPaths;
147+
QStringList crashPronePluginPaths;
148+
QStringList otherPluginPaths;
149+
150+
for (auto &pluginDir : dirs) {
151+
QDir dir(pluginDir);
152+
if (!dir.exists()) {
153+
qWarning() << "The plugin directory does not exist:" << pluginDir;
154+
continue;
155+
}
156+
157+
auto pluginFileInfos = dir.entryInfoList({"*.so"}, QDir::Files);
158+
for (auto &pluginInfo : pluginFileInfos) {
159+
QString filePath = pluginInfo.absoluteFilePath();
160+
QString pluginName = filePath.section("/", -1);
161+
if (selfMaintenanceTrayPlugins.contains(pluginName)) {
162+
selfMaintenancePluginPaths.append(filePath);
163+
} else if (subprojectTrayPlugins.contains(pluginName)) {
164+
subprojectPluginPaths.append(filePath);
165+
} else if (crashProneTrayPlugins.contains(pluginName)) {
166+
crashPronePluginPaths.append(filePath);
167+
} else {
168+
otherPluginPaths.append(filePath);
169+
}
170+
}
171+
}
172+
173+
QMap<QString, QString> pluginGroup;
174+
175+
if (!selfMaintenancePluginPaths.isEmpty()) {
176+
pluginGroup.insert(selfMaintenancePlugins, selfMaintenancePluginPaths.join(";"));
177+
}
178+
179+
if (!subprojectPluginPaths.isEmpty()) {
180+
pluginGroup.insert(subprojectPlugins, subprojectPluginPaths.join(";"));
181+
}
182+
183+
if (!crashPronePluginPaths.isEmpty()) {
184+
pluginGroup.insert(crashPronePlugins, crashPronePluginPaths.join(";"));
185+
}
186+
187+
if (!otherPluginPaths.isEmpty()) {
188+
pluginGroup.insert(otherPlugins, otherPluginPaths.join(";"));
189+
}
190+
191+
return pluginGroup;
192+
}
130193
}

panels/dock/loadtrayplugins.h

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

2828
private:
29+
QString loaderPath() const;
30+
QMap<QString, QString> getPluginGroup() const;
31+
32+
void startProcess(const QString &loaderPath, const QString &pluginPath, const QString &groupName);
2933
void setProcessEnv(QProcess *process);
3034

3135
private:

0 commit comments

Comments
 (0)