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
3335void 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+
11693void 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}
0 commit comments