From c1978af10d03234255df9016890c2cc0ec0a4367 Mon Sep 17 00:00:00 2001 From: caixiangrong Date: Fri, 12 Dec 2025 14:09:01 +0800 Subject: [PATCH] refactor: convert xsettings from executable to plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed dde-xsettings from a standalone executable to a deepin-service- manager plugin 1. Modified CMakeLists.txt to build as a library module instead of executable 2. Removed main.cpp and replaced with plugin.cpp with DSMRegister/ DSMUnRegister functions 3. Updated D-Bus service files to use deepin-service-manager as the launcher 4. Renamed configuration files and updated plugin metadata 5. Changed installation paths to plugin directory structure This refactoring is necessary to integrate xsettings into the unified service management framework, improving service lifecycle management and resource efficiency. Log: XSettings service now runs as a plugin under deepin-service-manager Influence: 1. Verify XSettings functionality still works correctly 2. Test service startup and shutdown through deepin-service-manager 3. Check D-Bus interface availability and method calls 4. Validate plugin configuration and metadata 5. Test service restart and recovery mechanisms 6. Verify resource cleanup when plugin is unloaded refactor: 将 xsettings 从可执行程序转换为插件 将 dde-xsettings 从独立可执行程序重构为 deepin-service-manager 插件 1. 修改 CMakeLists.txt 以构建为库模块而非可执行文件 2. 移除 main.cpp 并替换为包含 DSMRegister/DSMUnRegister 函数的 plugin.cpp 3. 更新 D-Bus 服务文件以使用 deepin-service-manager 作为启动器 4. 重命名配置文件并更新插件元数据 5. 更改安装路径以适应插件目录结构 此次重构是为了将 xsettings 集成到统一的服务管理框架中, 改善服务生命周期管理和资源效率。 Log: XSettings 服务现在作为 deepin-service-manager 下的插件运行 Influence: 1. 验证 XSettings 功能是否仍然正常工作 2. 测试通过 deepin-service-manager 启动和关闭服务 3. 检查 D-Bus 接口可用性和方法调用 4. 验证插件配置和元数据 5. 测试服务重启和恢复机制 6. 验证插件卸载时的资源清理 --- src/plugin-qt/xsettings/CMakeLists.txt | 16 ++++---- src/plugin-qt/xsettings/main.cpp | 28 ------------- .../dbus/org.deepin.dde.XSettings.service | 4 -- .../dbus/org.deepin.dde.XSettings1.service | 4 ++ ...vice => org.deepin.dde.XSettings1.service} | 4 +- ...ettings.json => plugin-dde-xsettings.json} | 2 + src/plugin-qt/xsettings/plugin.cpp | 40 +++++++++++++++++++ 7 files changed, 56 insertions(+), 42 deletions(-) delete mode 100644 src/plugin-qt/xsettings/main.cpp delete mode 100644 src/plugin-qt/xsettings/misc/dbus/org.deepin.dde.XSettings.service create mode 100644 src/plugin-qt/xsettings/misc/dbus/org.deepin.dde.XSettings1.service rename src/plugin-qt/xsettings/misc/{org.deepin.dde.XSettings.service => org.deepin.dde.XSettings1.service} (76%) rename src/plugin-qt/xsettings/misc/{dde-xsettings.json => plugin-dde-xsettings.json} (68%) create mode 100644 src/plugin-qt/xsettings/plugin.cpp diff --git a/src/plugin-qt/xsettings/CMakeLists.txt b/src/plugin-qt/xsettings/CMakeLists.txt index d7828901..ae68a7bf 100644 --- a/src/plugin-qt/xsettings/CMakeLists.txt +++ b/src/plugin-qt/xsettings/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. # # SPDX-License-Identifier: LGPL-3.0-or-later -set(BIN_NAME "dde-xsettings") +set(BIN_NAME "plugin-dde-xsettings") project(${BIN_NAME}) @@ -19,7 +19,7 @@ find_package(PkgConfig REQUIRED) pkg_check_modules(X11 REQUIRED IMPORTED_TARGET x11) pkg_check_modules(XCB REQUIRED IMPORTED_TARGET xcb) -add_executable(${BIN_NAME} +add_library(${BIN_NAME} MODULE ${SRCS} ) @@ -36,12 +36,12 @@ macro(install_user_symlink filepath wantsdir) install(FILES ${PROJECT_BINARY_DIR}/link/${wantsdir}/${filepath} DESTINATION lib/systemd/user/${wantsdir}/) endmacro(install_user_symlink) -install(TARGETS ${BIN_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/misc/dde-xsettings.json DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/deepin-service-manager/other) +install(TARGETS ${BIN_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/deepin-service-manager/) +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/misc/plugin-dde-xsettings.json DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/deepin-service-manager/user) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/misc/org.deepin.XSettings.json DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/dsg/configs/org.deepin.dde.daemon) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/misc/dbus/org.deepin.dde.XSettings.service DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/dbus-1/services) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/misc/org.deepin.dde.XSettings.service +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/misc/dbus/org.deepin.dde.XSettings1.service DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/dbus-1/services) +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/misc/org.deepin.dde.XSettings1.service DESTINATION lib/systemd/user/ - RENAME org.deepin.dde.XSettings.service + RENAME org.deepin.dde.XSettings1.service ) -install_user_symlink(org.deepin.dde.XSettings.service dde-session-pre.target.wants) +install_user_symlink(org.deepin.dde.XSettings1.service dde-session-pre.target.wants) diff --git a/src/plugin-qt/xsettings/main.cpp b/src/plugin-qt/xsettings/main.cpp deleted file mode 100644 index dee7f9e2..00000000 --- a/src/plugin-qt/xsettings/main.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: LGPL-3.0-or-later - -#include "impl/xsettings1.h" - -#include - -#include -#include - -int main(int argc, char *argv[]) -{ - QCoreApplication a(argc, argv); - a.setApplicationName("org.deepin.dde.XSettings"); - Dtk::Core::DLogManager::registerJournalAppender(); - - QDBusConnection connection =QDBusConnection::sessionBus(); - XSettings1 *xSettings = new XSettings1(&a); - - QDBusConnection::RegisterOptions opts = QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals | QDBusConnection::ExportAllProperties; - connection.registerObject("/org/deepin/dde/XSettings1", xSettings, opts); - if (!connection.registerService("org.deepin.dde.XSettings1")) { - qWarning() << "Failed to register D-Bus service"; - return 0; - } - return a.exec(); -} diff --git a/src/plugin-qt/xsettings/misc/dbus/org.deepin.dde.XSettings.service b/src/plugin-qt/xsettings/misc/dbus/org.deepin.dde.XSettings.service deleted file mode 100644 index a3ed5d4e..00000000 --- a/src/plugin-qt/xsettings/misc/dbus/org.deepin.dde.XSettings.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=org.deepin.dde.XSettings1 -Exec=/usr/bin/dde-xsettings -SystemdService=dde-xsettings.service diff --git a/src/plugin-qt/xsettings/misc/dbus/org.deepin.dde.XSettings1.service b/src/plugin-qt/xsettings/misc/dbus/org.deepin.dde.XSettings1.service new file mode 100644 index 00000000..09c97dc1 --- /dev/null +++ b/src/plugin-qt/xsettings/misc/dbus/org.deepin.dde.XSettings1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.XSettings1 +Exec=/usr/bin/deepin-service-manager -n org.deepin.dde.XSettings1 +SystemdService=org.deepin.dde.XSettings1.service diff --git a/src/plugin-qt/xsettings/misc/org.deepin.dde.XSettings.service b/src/plugin-qt/xsettings/misc/org.deepin.dde.XSettings1.service similarity index 76% rename from src/plugin-qt/xsettings/misc/org.deepin.dde.XSettings.service rename to src/plugin-qt/xsettings/misc/org.deepin.dde.XSettings1.service index 1af77c24..3276845e 100644 --- a/src/plugin-qt/xsettings/misc/org.deepin.dde.XSettings.service +++ b/src/plugin-qt/xsettings/misc/org.deepin.dde.XSettings1.service @@ -1,5 +1,5 @@ [Unit] -Description=dde-xsettings +Description=org.deepin.dde.XSettings1 Requisite=dde-session-initialized.target dde-session-pre.target RefuseManualStart=no RefuseManualStop=no @@ -13,7 +13,7 @@ Before=dde-session@x11.service [Service] Type=dbus BusName=org.deepin.dde.XSettings1 -ExecStart=/usr/bin/dde-xsettings +ExecStart=/usr/bin/deepin-service-manager -n org.deepin.dde.XSettings1 Restart=on-failure RestartSec=3 Slice=session.slice diff --git a/src/plugin-qt/xsettings/misc/dde-xsettings.json b/src/plugin-qt/xsettings/misc/plugin-dde-xsettings.json similarity index 68% rename from src/plugin-qt/xsettings/misc/dde-xsettings.json rename to src/plugin-qt/xsettings/misc/plugin-dde-xsettings.json index fc0ecf71..f659af93 100644 --- a/src/plugin-qt/xsettings/misc/dde-xsettings.json +++ b/src/plugin-qt/xsettings/misc/plugin-dde-xsettings.json @@ -1,6 +1,8 @@ { "name": "org.deepin.dde.XSettings1", + "libPath": "libplugin-dde-xsettings.so", "startType": "Resident", + "pluginType": "qt", "policy": [ { "path": "/org/deepin/dde/XSettings1" diff --git a/src/plugin-qt/xsettings/plugin.cpp b/src/plugin-qt/xsettings/plugin.cpp new file mode 100644 index 00000000..c07b1cfa --- /dev/null +++ b/src/plugin-qt/xsettings/plugin.cpp @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +#include "impl/xsettings1.h" + +#include +#include + +static XSettings1 *xSettings = nullptr; + +extern "C" int DSMRegister(const char *name, void *data) +{ + + auto connection = reinterpret_cast(data); + if (connection->interface()->isServiceRegistered(name)) { + qWarning() << "DBus service already exists:" << name; + return 1; + } + xSettings = new XSettings1(); + + QDBusConnection::RegisterOptions opts = QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals | QDBusConnection::ExportAllProperties; + QString path = name; + path = QString("/%1").arg(path.replace(".", "/")); + connection->registerObject(path, xSettings, opts); + return 0; +} + +// 该函数用于资源释放 +// 非常驻插件必须实现该函数,以防内存泄漏 +extern "C" int DSMUnRegister(const char *name, void *data) +{ + Q_UNUSED(name); + Q_UNUSED(data); + if (xSettings) { + xSettings->deleteLater(); + xSettings = nullptr; + } + return 0; +}