diff --git a/debian/control b/debian/control index b3f24e4ea..ae5462643 100644 --- a/debian/control +++ b/debian/control @@ -60,7 +60,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, libdde-shell( =${binary:Version}), libdtk6declarative, qml6-module-qtquick-controls2-styles-chameleon, qml6-module-qtquick-layouts, qml6-module-qtquick-window, qml6-module-qt-labs-platform, qml6-module-qt-labs-qmlmodels, - dde-tray-loader + dde-tray-loader (> 1.99.6) Multi-Arch: same Description: An wrapper for developed based on dde-shell plugin system diff --git a/panels/dock/dconfig/org.deepin.ds.dock.tray.json b/panels/dock/dconfig/org.deepin.ds.dock.tray.json index c3609bdfc..624468498 100644 --- a/panels/dock/dconfig/org.deepin.ds.dock.tray.json +++ b/panels/dock/dconfig/org.deepin.ds.dock.tray.json @@ -76,6 +76,38 @@ "description[zh_CN]": "托盘折叠区域当前的状态", "permissions": "readwrite", "visibility": "private" + }, + "selfMaintenanceTrayPlugins": { + "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"], + "serial": 0, + "flags": [], + "name": "self maintenance plugins", + "name[zh_CN]": "自维护托盘插件", + "description": "self maintenance plugins", + "description[zh_CN]": "自维护托盘插件", + "permissions": "readonly", + "visibility": "private" + }, + "subprojectTrayPlugins": { + "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"], + "serial": 0, + "flags": [], + "name": "subproject tray plugins", + "name[zh_CN]": "子项目托盘插件", + "description": "subproject tray plugins", + "description[zh_CN]": "子项目托盘插件", + "permissions": "readwrite", + "visibility": "private" + }, + "crashProneTrayPlugins": { + "value": [], + "serial": 0, + "flags": [], + "name": "crash-prone tray plugins", + "name[zh_CN]": "易于崩溃的托盘插件", + "description": "crash-prone tray plugins", + "description[zh_CN]": "易于崩溃的托盘插件", + "permissions": "readwrite" } } } diff --git a/panels/dock/loadtrayplugins.cpp b/panels/dock/loadtrayplugins.cpp index 61151bf8a..6672bcb0d 100644 --- a/panels/dock/loadtrayplugins.cpp +++ b/panels/dock/loadtrayplugins.cpp @@ -7,6 +7,8 @@ #include +#include + #include #include #include @@ -32,58 +34,17 @@ LoadTrayPlugins::~LoadTrayPlugins() void LoadTrayPlugins::loadDockPlugins() { - QStringList filters; - filters << "*.so"; - - QStringList execPaths; - execPaths << qEnvironmentVariable("TRAY_LOADER_EXECUTE_PATH") - << QString("%1/trayplugin-loader").arg(CMAKE_INSTALL_FULL_LIBEXECDIR); - - QString validExePath; - for (const QString &execPath : execPaths) { - if (QFile::exists(execPath)) { - validExePath = execPath; - break; - } - } - + QString validExePath = loaderPath(); if (validExePath.isEmpty()) { qWarning() << "No valid loader executable path found."; return; } - QStringList dirs; - const auto pluginsPath = qEnvironmentVariable("TRAY_DEBUG_PLUGIN_PATH"); - if (!pluginsPath.isEmpty()) - dirs << pluginsPath.split(QDir::listSeparator()); - - if (dirs.isEmpty()) - dirs << pluginDirs; - - for (auto &pluginDir : dirs) { - QDir dir(pluginDir); - if (!dir.exists()) { - qWarning() << "The plugin directory does not exist:" << pluginDir; - continue; - } - - auto pluginFileInfos = dir.entryInfoList(filters, QDir::Files); - foreach (auto pluginInfo, pluginFileInfos) { - qInfo() << "pluginLoader load plugin" << pluginInfo.absoluteFilePath(); - - QProcess *process = new QProcess(this); - setProcessEnv(process); - - connect(process, QOverload::of(&QProcess::finished), - this, &LoadTrayPlugins::handleProcessFinished); - - ProcessInfo pInfo = { process, pluginInfo.absoluteFilePath(), 0 }; - m_processes.append(pInfo); - - process->setProgram(validExePath); - process->setArguments({"-p", pluginInfo.absoluteFilePath(), "-platform", "wayland"}); - process->start(); - } + auto pluginGroupMap = groupPlugins(allPluginPaths()); + for (auto it = pluginGroupMap.begin(); it != pluginGroupMap.end(); ++it) { + if (it.value().isEmpty()) continue; + qDebug() << "Load plugin:" << it.value() << " group:" << it.key(); + startProcess(validExePath, it.value(), it.key()); } } @@ -113,6 +74,22 @@ void LoadTrayPlugins::handleProcessFinished(int exitCode, QProcess::ExitStatus e } } +void LoadTrayPlugins::startProcess(const QString &loaderPath, const QString &pluginPath, const QString &groupName) +{ + auto *process = new QProcess(this); + setProcessEnv(process); + + connect(process, QOverload::of(&QProcess::finished), + this, &LoadTrayPlugins::handleProcessFinished); + + ProcessInfo pInfo = { process, pluginPath, 0 }; + m_processes.append(pInfo); + + process->setProgram(loaderPath); + process->setArguments({"-p", pluginPath, "-g", groupName, "-platform", "wayland"}); + process->start(); +} + void LoadTrayPlugins::setProcessEnv(QProcess *process) { if (!process) return; @@ -124,4 +101,99 @@ void LoadTrayPlugins::setProcessEnv(QProcess *process) process->setProcessEnvironment(env); } +QString LoadTrayPlugins::loaderPath() const +{ + QStringList execPaths; + execPaths << qEnvironmentVariable("TRAY_LOADER_EXECUTE_PATH") + << QString("%1/trayplugin-loader").arg(CMAKE_INSTALL_FULL_LIBEXECDIR); + + QString validExePath; + for (const QString &execPath : execPaths) { + if (QFile::exists(execPath)) { + validExePath = execPath; + break; + } + } + + return validExePath; +} + +QStringList LoadTrayPlugins::allPluginPaths() const +{ + QStringList dirs; + const auto pluginsPath = qEnvironmentVariable("TRAY_DEBUG_PLUGIN_PATH"); + if (!pluginsPath.isEmpty()) + dirs << pluginsPath.split(QDir::listSeparator()); + + if (dirs.isEmpty()) + dirs << pluginDirs; + + QStringList pluginPaths; + for (auto &pluginDir : dirs) { + QDir dir(pluginDir); + if (!dir.exists()) { + qWarning() << "The plugin directory does not exist:" << pluginDir; + continue; + } + + auto pluginFileInfos = dir.entryInfoList({"*.so"}, QDir::Files); + for (auto &pluginInfo : pluginFileInfos) { + pluginPaths.append(pluginInfo.absoluteFilePath()); + } + } + + return pluginPaths; +} + +QMap LoadTrayPlugins::groupPlugins(const QStringList &pluginPaths) const +{ + const QString selfMaintenancePluginsKey = "selfMaintenanceTrayPlugins"; + const QString subprojectPluginsKey = "subprojectTrayPlugins"; + const QString crashPronePluginsKey = "crashProneTrayPlugins"; + const QString otherPluginsKey = "otherTrayPlugins"; + + auto dConfig = Dtk::Core::DConfig::create("org.deepin.dde.shell", "org.deepin.ds.dock.tray", QString()); + QStringList selfMaintenanceTrayPlugins = dConfig->value(selfMaintenancePluginsKey).toStringList(); + QStringList subprojectTrayPlugins = dConfig->value(subprojectPluginsKey).toStringList(); + QStringList crashProneTrayPlugins = dConfig->value(crashPronePluginsKey).toStringList(); + dConfig->deleteLater(); + + QStringList selfMaintenancePluginPaths; + QStringList subprojectPluginPaths; + QStringList crashPronePluginPaths; + QStringList otherPluginPaths; + + for (auto &filePath : pluginPaths) { + QString pluginName = filePath.section("/", -1); + if (crashProneTrayPlugins.contains(pluginName)) { + crashPronePluginPaths.append(filePath); + } else if (selfMaintenanceTrayPlugins.contains(pluginName)) { + selfMaintenancePluginPaths.append(filePath); + } else if (subprojectTrayPlugins.contains(pluginName)) { + subprojectPluginPaths.append(filePath); + } else { + otherPluginPaths.append(filePath); + } + } + + QMap pluginGroup; + + if (!selfMaintenancePluginPaths.isEmpty()) { + pluginGroup.insert(selfMaintenancePluginsKey, selfMaintenancePluginPaths.join(";")); + } + + if (!subprojectPluginPaths.isEmpty()) { + pluginGroup.insert(subprojectPluginsKey, subprojectPluginPaths.join(";")); + } + + if (!crashPronePluginPaths.isEmpty()) { + pluginGroup.insert(crashPronePluginsKey, crashPronePluginPaths.join(";")); + } + + if (!otherPluginPaths.isEmpty()) { + pluginGroup.insert(otherPluginsKey, otherPluginPaths.join(";")); + } + + return pluginGroup; +} } diff --git a/panels/dock/loadtrayplugins.h b/panels/dock/loadtrayplugins.h index 26449263d..04f4fe8b6 100644 --- a/panels/dock/loadtrayplugins.h +++ b/panels/dock/loadtrayplugins.h @@ -26,6 +26,11 @@ private slots: void handleProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); private: + QString loaderPath() const; + QStringList allPluginPaths() const; + QMap groupPlugins(const QStringList &pluginPaths) const; + + void startProcess(const QString &loaderPath, const QString &pluginPath, const QString &groupName); void setProcessEnv(QProcess *process); private: