From 33ff53f19b40038d4dd6038dee046cc0bee8ff9c Mon Sep 17 00:00:00 2001 From: yeshanshan Date: Fri, 12 Jun 2026 15:07:10 +0800 Subject: [PATCH] feat: adopt xdg-activation protocol for Treeland dock plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Add xdg-activation-v1 protocol support in dock-network-plugin 2. Implement XdgActivation class to request activation tokens via Wayland 3. Replace all direct D-Bus calls to ControlCenter with dde-am + activation token 4. Replace DDBusSender in JumpSettingButton with token-based activation 5. Update NetManager to pass activation token when opening ControlCenter 6. Add necessary dependencies: extra-cmake-modules, wayland-protocols, qt6-wayland-dev 7. Update CMake build system to generate xdg-activation client protocol code Log: 适配Treeland窗口管理器的XDG激活协议,确保从任务栏网络插件打开控制中 心时正确传递激活令牌并获得焦点 Influence: 1. Test clicking network settings button in dock - verify ControlCenter opens with proper focus 2. Test clicking network icon quick panel - verify ControlCenter opens correctly 3. Test clicking network status indicator - verify ControlCenter launches properly 4. Test JumpSettingButton with auto-show-page - verify page navigation works with token 5. Test on X11 environment - verify fallback behavior without activation token 6. Test on Treeland/Wayland - verify XDG activation token is properly generated and passed 7. Test opening ControlCenter from network detail pages - verify correct sub-page navigation 8. Verify dde-am is available and properly invoked for launching ControlCenter feat: 适配Treeland的XDG激活协议 1. 在dock-network-plugin中添加xdg-activation-v1协议支持 2. 实现XdgActivation类,通过Wayland请求激活令牌 3. 将所有直接调用控制中心的D-Bus调用替换为使用dde-am + 激活令牌 4. 替换JumpSettingButton中的DDBusSender为基于令牌的激活方式 5. 更新NetManager以在打开控制中心时传递激活令牌 6. 添加必要依赖:extra-cmake-modules, wayland-protocols, qt6-wayland-dev 7. 更新CMake构建系统以生成xdg-activation客户端协议代码 Log: 适配Treeland窗口管理器的XDG激活协议,确保从任务栏网络插件打开控制中 心时正确传递激活令牌并获得焦点 Influence: 1. 测试点击任务栏网络设置按钮 - 验证控制中心能正确打开并获取焦点 2. 测试点击网络图标快速面板 - 验证控制中心正确打开 3. 测试点击网络状态指示器 - 验证控制中心正常启动 4. 测试JumpSettingButton的自动跳转页面功能 - 验证带令牌的页面导航正常 5. 在X11环境测试 - 验证无激活令牌时的降级处理 6. 在Treeland/Wayland环境测试 - 验证XDG激活令牌正确生成和传递 7. 测试从网络详情页面打开控制中心 - 验证正确的子页面导航 8. 验证dde-am可用并能正确调用以启动控制中心 --- CMakeLists.txt | 3 + debian/control | 7 +- dock-network-plugin/CMakeLists.txt | 13 +- dock-network-plugin/dockcontentwidget.h | 11 +- dock-network-plugin/networkplugin.cpp | 24 ++- .../widget/jumpsettingbutton.cpp | 27 ++- dock-network-plugin/xdgactivation.cpp | 180 ++++++++++++++++++ dock-network-plugin/xdgactivation.h | 35 ++++ net-view/operation/netmanager.cpp | 9 +- net-view/operation/netmanager.h | 2 +- .../private/netmanagerthreadprivate.cpp | 18 +- .../private/netmanagerthreadprivate.h | 4 +- src/impl/serviceinter/deviceinterrealize.cpp | 2 +- 13 files changed, 301 insertions(+), 34 deletions(-) create mode 100644 dock-network-plugin/xdgactivation.cpp create mode 100644 dock-network-plugin/xdgactivation.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9db8b8e7..3e756a95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,9 @@ option(BUILD_EXAMPLE "Build example programs" OFF) set(DDE-Network-Core_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/src-old") set(DDE-Network-Core_LIBRARIES dde-network-core) +find_package(ECM REQUIRED NO_MODULE) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH}) +find_package(WaylandProtocols REQUIRED) find_package(PkgConfig REQUIRED) pkg_check_modules(LibNM REQUIRED IMPORTED_TARGET libnm) include_directories(${LibNM_INCLUDE_DIRS}) diff --git a/debian/control b/debian/control index ca77089c..cc3bb833 100644 --- a/debian/control +++ b/debian/control @@ -4,16 +4,21 @@ Priority: optional Maintainer: donghualin Build-Depends: debhelper-compat (= 12), cmake, + extra-cmake-modules, libglib2.0-dev (>= 2.32), pkg-config, libgtest-dev, dde-control-center-dev (>= 6.1.71), dde-tray-loader-dev, dde-session-shell-dev, - libudev-dev, + libudev-dev, qt6-base-dev, qt6-declarative-dev, qt6-tools-dev, + qt6-wayland-dev, + qt6-base-private-dev, + qt6-wayland-private-dev, + wayland-protocols, libdtk6core-dev, libdtk6widget-dev, libgsettings-qt6-dev, diff --git a/dock-network-plugin/CMakeLists.txt b/dock-network-plugin/CMakeLists.txt index 7b558747..396f9edf 100644 --- a/dock-network-plugin/CMakeLists.txt +++ b/dock-network-plugin/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd. +# SPDX-FileCopyrightText: 2025 - 2026 UnionTech Software Technology Co., Ltd. # # SPDX-License-Identifier: CC0-1.0 @@ -14,6 +14,7 @@ set(CMAKE_AUTOMOC ON) # 启用 qrc 资源文件的支持 set(CMAKE_AUTORCC ON) + file(GLOB_RECURSE SRCS "networkplugin.h" "networkplugin.cpp" @@ -26,6 +27,8 @@ file(GLOB_RECURSE SRCS "widget/jumpsettingbutton.cpp" "widget/commoniconbutton.h" "widget/commoniconbutton.cpp" + "xdgactivation.h" + "xdgactivation.cpp" ) set(CMAKE_THREAD_LIBS_INIT "-lpthread") @@ -33,7 +36,7 @@ set(CMAKE_HAVE_THREADS_LIBRARY 1) set(CMAKE_USE_PTHREADS_INIT 1) set(CMAKE_PREFER_PTHREAD_FLAG ON) -find_package(${QT_NS} COMPONENTS Core Widgets DBus Network LinguistTools REQUIRED) +find_package(${QT_NS} COMPONENTS Core Widgets DBus Network WaylandClient LinguistTools REQUIRED) find_package(PkgConfig REQUIRED) find_package(${DTK_NS} REQUIRED COMPONENTS Widget) find_package(KF6NetworkManagerQt REQUIRED) @@ -46,6 +49,10 @@ find_package(DdeDock REQUIRED) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PLUGIN_NAME} SHARED ${SRCS} ../net-view/window/qrc/network.qrc) + +qt_generate_wayland_protocol_client_sources(${PLUGIN_NAME} FILES + ${WaylandProtocols_DATADIR}/staging/xdg-activation/xdg-activation-v1.xml +) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../../dde-dock) file(GLOB TS_FILES "translations/*.ts") @@ -67,12 +74,14 @@ target_include_directories(${PLUGIN_NAME} PUBLIC "../net-view/operation" "../net-view/window" "../src" + ${CMAKE_CURRENT_BINARY_DIR} ) target_link_libraries(${PLUGIN_NAME} PRIVATE ${QT_NS}::Widgets ${QT_NS}::DBus ${QT_NS}::Network + ${QT_NS}::WaylandClientPrivate ${DTK_NS}::Widget KF6::NetworkManagerQt dde-network-core6 diff --git a/dock-network-plugin/dockcontentwidget.h b/dock-network-plugin/dockcontentwidget.h index 2579e247..c06a85af 100644 --- a/dock-network-plugin/dockcontentwidget.h +++ b/dock-network-plugin/dockcontentwidget.h @@ -8,6 +8,7 @@ #include "netmanager.h" #include "netview.h" #include "widget/jumpsettingbutton.h" +#include "xdgactivation.h" #include "constants.h" #include @@ -45,7 +46,15 @@ class DockContentWidget : public QWidget m_netSetBtn = new JumpSettingButton(this); m_netSetBtn->setIcon(QIcon::fromTheme("network-setting")); m_netSetBtn->setDescription(tr("Network settings")); - connect(m_netSetBtn, &JumpSettingButton::clicked, netManager, &NetManager::gotoControlCenter); + connect(m_netSetBtn, &JumpSettingButton::clicked, this, [this, netManager]() { + auto *activation = new XdgActivation(this); + connect(activation, &XdgActivation::tokenReady, this, + [netManager, activation](const QString &token) { + netManager->gotoControlCenter(token); + activation->deleteLater(); + }, Qt::SingleShotConnection); + activation->requestToken(); + }); m_netCheckBtn = new JumpSettingButton(this); m_netCheckBtn->setIcon(QIcon::fromTheme("network-check")); diff --git a/dock-network-plugin/networkplugin.cpp b/dock-network-plugin/networkplugin.cpp index fcb24579..5d8d02ad 100644 --- a/dock-network-plugin/networkplugin.cpp +++ b/dock-network-plugin/networkplugin.cpp @@ -12,6 +12,8 @@ #include +#include "xdgactivation.h" + #include #include #include @@ -164,11 +166,7 @@ const QString NetworkPlugin::itemCommand(const QString &itemKey) { Q_UNUSED(itemKey) if (m_netStatus->needShowControlCenter()) { - return QString("dbus-send --print-reply " - "--dest=org.deepin.dde.ControlCenter1 " - "/org/deepin/dde/ControlCenter1 " - "org.deepin.dde.ControlCenter1.ShowModule " - "string:network"); + return QString("dde-am --by-user org.deepin.dde.control-center -- -p network"); } return QString(); @@ -350,7 +348,13 @@ void NetworkPlugin::updateNetCheckVisible() void NetworkPlugin::onQuickIconClicked() { if (m_netStatus->needShowControlCenter()) { - m_manager->gotoControlCenter(); + auto *activation = new XdgActivation(this); + connect(activation, &XdgActivation::tokenReady, this, + [this, activation](const QString &token) { + m_manager->gotoControlCenter(token); + activation->deleteLater(); + }, Qt::SingleShotConnection); + activation->requestToken(); } else { m_netStatus->toggleNetworkActive(); } @@ -359,7 +363,13 @@ void NetworkPlugin::onQuickIconClicked() void NetworkPlugin::onQuickPanelClicked() { if (m_netStatus->needShowControlCenter()) { - m_manager->gotoControlCenter(); + auto *activation = new XdgActivation(this); + connect(activation, &XdgActivation::tokenReady, this, + [this, activation](const QString &token) { + m_manager->gotoControlCenter(token); + activation->deleteLater(); + }, Qt::SingleShotConnection); + activation->requestToken(); } else { showNetworkDialog(); } diff --git a/dock-network-plugin/widget/jumpsettingbutton.cpp b/dock-network-plugin/widget/jumpsettingbutton.cpp index 7950cdd3..fa9a6501 100644 --- a/dock-network-plugin/widget/jumpsettingbutton.cpp +++ b/dock-network-plugin/widget/jumpsettingbutton.cpp @@ -1,15 +1,16 @@ -// SPDX-FileCopyrightText: 2019 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "jumpsettingbutton.h" +#include "../xdgactivation.h" #include +#include #include #include #include -#include #include DWIDGET_USE_NAMESPACE @@ -119,14 +120,20 @@ void JumpSettingButton::mouseReleaseEvent(QMouseEvent* event) if (underMouse()) { Q_EMIT clicked(); if (m_autoShowPage && !m_fistPage.isEmpty()) { - DDBusSender() - .service("org.deepin.dde.ControlCenter1") - .path("/org/deepin/dde/ControlCenter1") - .interface("org.deepin.dde.ControlCenter1") - .method(QString("ShowPage")) - .arg(QString(m_fistPage)) - .arg(QString(m_secondPage)) - .call(); + auto *activation = new dde::network::XdgActivation(this); + QString page = m_fistPage; + if (!m_secondPage.isEmpty()) + page += "/" + m_secondPage; + connect(activation, &dde::network::XdgActivation::tokenReady, this, + [activation, page](const QString &token) { + QStringList args { "--by-user", "org.deepin.dde.control-center" }; + if (!token.isEmpty()) + args << "-e" << "XDG_ACTIVATION_TOKEN=" + token; + args << "--" << "-p" << page; + QProcess::startDetached("dde-am", args); + activation->deleteLater(); + }, Qt::SingleShotConnection); + activation->requestToken(); Q_EMIT showPageRequestWasSended(); } return; diff --git a/dock-network-plugin/xdgactivation.cpp b/dock-network-plugin/xdgactivation.cpp new file mode 100644 index 00000000..77db9b51 --- /dev/null +++ b/dock-network-plugin/xdgactivation.cpp @@ -0,0 +1,180 @@ +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "xdgactivation.h" + +#include +#include +#include +#include +#include + +#include "qwayland-xdg-activation-v1.h" + +#include +#include +#include + +Q_LOGGING_CATEGORY(trayXdgActivation, "dde.network.xdgactivation") + +namespace dde { +namespace network { + +// --------------------------------------------------------------------------- +// XdgActivationTokenV1 +// --------------------------------------------------------------------------- + +class XdgActivationTokenV1 : public QObject, public QtWayland::xdg_activation_token_v1 +{ + Q_OBJECT +public: + ~XdgActivationTokenV1() override + { + destroy(); + } + +Q_SIGNALS: + void done(const QString &token); + +protected: + void xdg_activation_token_v1_done(const QString &token) override + { + Q_EMIT done(token); + } +}; + +// --------------------------------------------------------------------------- +// XdgActivationV1 (singleton extension) +// --------------------------------------------------------------------------- + +namespace { + +class XdgActivationV1 : public QWaylandClientExtensionTemplate, + public QtWayland::xdg_activation_v1 +{ +public: + XdgActivationV1() + : QWaylandClientExtensionTemplate(1) + { + qCDebug(trayXdgActivation) << "Initializing xdg_activation_v1 extension, version:"; + initialize(); + qCDebug(trayXdgActivation) << "xdg_activation_v1 initialized, isActive:" << isActive(); + } + + ~XdgActivationV1() override + { + if (isInitialized()) + destroy(); + } + + XdgActivationTokenV1 *createTokenProvider(QWindow *window, const QString &appId) + { + qCDebug(trayXdgActivation) << "Creating token provider, window:" << window << "appId:" << appId; + auto *provider = new XdgActivationTokenV1; + provider->init(get_activation_token()); + + if (window) { + if (auto *waylandWindow = dynamic_cast(window->handle())) { + if (auto *surface = waylandWindow->wlSurface()) { + qCDebug(trayXdgActivation) << "Setting surface for token request"; + provider->set_surface(surface); + } else { + qCWarning(trayXdgActivation) << "WaylandWindow has no wlSurface"; + } + if (auto *inputDevice = waylandWindow->display()->lastInputDevice()) { + qCDebug(trayXdgActivation) << "Setting serial:" << inputDevice->serial() << "seat:" << inputDevice->wl_seat(); + provider->set_serial(inputDevice->serial(), inputDevice->wl_seat()); + } else { + qCWarning(trayXdgActivation) << "No lastInputDevice available"; + } + } else { + qCWarning(trayXdgActivation) << "Window handle is not a QWaylandWindow"; + } + } else { + qCWarning(trayXdgActivation) << "No window provided for token request"; + } + + if (!appId.isEmpty()) + provider->set_app_id(appId); + + provider->commit(); + qCDebug(trayXdgActivation) << "Token provider committed"; + return provider; + } +}; + +XdgActivationV1 *activationV1() +{ + static QPointer activation; + if (activation) + return activation; + + activation = new XdgActivationV1; + activation->setParent(qApp); + return activation; +} + +} // anonymous namespace + +// --------------------------------------------------------------------------- +// XdgActivation +// --------------------------------------------------------------------------- + +XdgActivation::XdgActivation(QObject *parent) + : QObject(parent) +{ +} + +XdgActivation::~XdgActivation() = default; + +bool XdgActivation::isActive() const +{ + auto *activation = activationV1(); + const bool active = activation && activation->isActive(); + qCDebug(trayXdgActivation) << "isActive:" << active; + return active; +} + +void XdgActivation::requestToken(QWindow *window, const QString &appId) +{ + qCDebug(trayXdgActivation) << "requestToken called, window:" << window << "appId:" << appId; + + if (m_provider) { + qCWarning(trayXdgActivation) << "XDG activation token request already started, ignoring"; + return; + } + + if (!isActive()) { + qCDebug(trayXdgActivation) << "xdg_activation_v1 is not active; token request skipped"; + Q_EMIT tokenReady({}); + return; + } + + const QString effectiveAppId = appId.isEmpty() ? QString::fromUtf8(DTK_CORE_NAMESPACE::DSGApplication::id()) : appId; + qCDebug(trayXdgActivation) << "effectiveAppId:" << effectiveAppId; + + if (effectiveAppId.isEmpty()) + qCWarning(trayXdgActivation) << "XDG activation request has empty app id"; + + auto effectiveWindow = window ? window : QGuiApplication::focusWindow(); + qCDebug(trayXdgActivation) << "effectiveWindow:" << effectiveWindow; + auto *provider = activationV1()->createTokenProvider(effectiveWindow, effectiveAppId); + provider->setParent(this); + m_provider = provider; + + connect(provider, &XdgActivationTokenV1::done, this, [this, provider, effectiveAppId](const QString &token) { + m_provider = nullptr; + if (token.isEmpty()) + qCWarning(trayXdgActivation) << "XDG activation token missing for app:" << effectiveAppId; + else + qCDebug(trayXdgActivation) << "XDG activation token received for app:" << effectiveAppId << "token length:" << token.length(); + provider->deleteLater(); + Q_EMIT tokenReady(token); + }, Qt::SingleShotConnection); +} + +} // namespace network +} // namespace dde + +#include "xdgactivation.moc" diff --git a/dock-network-plugin/xdgactivation.h b/dock-network-plugin/xdgactivation.h new file mode 100644 index 00000000..4cd4499c --- /dev/null +++ b/dock-network-plugin/xdgactivation.h @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include + +namespace dde { +namespace network { + +class XdgActivationTokenV1; + +class XdgActivation : public QObject +{ + Q_OBJECT + +public: + explicit XdgActivation(QObject *parent = nullptr); + ~XdgActivation() override; + + bool isActive() const; + void requestToken(QWindow *window = nullptr, const QString &appId = {}); + +Q_SIGNALS: + void tokenReady(const QString &token); + +private: + QPointer m_provider; +}; + +} // namespace network +} // namespace dde diff --git a/net-view/operation/netmanager.cpp b/net-view/operation/netmanager.cpp index a92937a5..a3d28ae3 100644 --- a/net-view/operation/netmanager.cpp +++ b/net-view/operation/netmanager.cpp @@ -135,9 +135,12 @@ void NetManager::setProxyEnabled(bool enabled) exec(enabled ? NetManager::EnabledDevice : NetManager::DisabledDevice, "NetSystemProxyControlItem"); } -void NetManager::gotoControlCenter() +void NetManager::gotoControlCenter(const QString &token) { - exec(NetManager::GoToControlCenter, ""); + QVariantMap param; + if (!token.isEmpty()) + param.insert("token", token); + exec(NetManager::GoToControlCenter, "", param); } void NetManager::gotoCheckNet() @@ -393,7 +396,7 @@ void NetManagerPrivate::exec(NetManager::CmdType cmd, const QString &id, const Q sendRequest(NetManager::CloseInput, id); } break; case NetManager::GoToControlCenter: - m_managerThread->gotoControlCenter(id); + m_managerThread->gotoControlCenter(id, param.value("token").toString()); break; case NetManager::GoToSecurityTools: m_managerThread->gotoSecurityTools(id); diff --git a/net-view/operation/netmanager.h b/net-view/operation/netmanager.h index 81cabe68..299a9908 100644 --- a/net-view/operation/netmanager.h +++ b/net-view/operation/netmanager.h @@ -85,7 +85,7 @@ class NetManager : public QObject Q_INVOKABLE QString wpaEapAuthmethod() const; // 企业网内部认证方式 public Q_SLOTS: - void gotoControlCenter(); + void gotoControlCenter(const QString &token = QString()); void gotoCheckNet(); bool netCheckAvailable(); diff --git a/net-view/operation/private/netmanagerthreadprivate.cpp b/net-view/operation/private/netmanagerthreadprivate.cpp index c7f8f28f..ca8bf8d9 100644 --- a/net-view/operation/private/netmanagerthreadprivate.cpp +++ b/net-view/operation/private/netmanagerthreadprivate.cpp @@ -38,6 +38,7 @@ #include #include +#include #include using namespace NetworkManager; @@ -301,9 +302,9 @@ void NetManagerThreadPrivate::connectHotspot(const QString &id, const QVariantMa QMetaObject::invokeMethod(this, "doConnectHotspot", Qt::QueuedConnection, Q_ARG(QString, id), Q_ARG(QVariantMap, param), Q_ARG(bool, connect)); } -void NetManagerThreadPrivate::gotoControlCenter(const QString &page) +void NetManagerThreadPrivate::gotoControlCenter(const QString &page, const QString &token) { - QMetaObject::invokeMethod(this, "doGotoControlCenter", Qt::QueuedConnection, Q_ARG(QString, page)); + QMetaObject::invokeMethod(this, "doGotoControlCenter", Qt::QueuedConnection, Q_ARG(QString, page), Q_ARG(QString, token)); } void NetManagerThreadPrivate::gotoSecurityTools(const QString &page) @@ -821,13 +822,18 @@ void NetManagerThreadPrivate::doConnectHotspot(const QString &id, const QVariant } } -void NetManagerThreadPrivate::doGotoControlCenter(const QString &page) +void NetManagerThreadPrivate::doGotoControlCenter(const QString &page, const QString &token) { if (!m_enabled) return; - QDBusMessage message = QDBusMessage::createMethodCall("org.deepin.dde.ControlCenter1", "/org/deepin/dde/ControlCenter1", "org.deepin.dde.ControlCenter1", "ShowPage"); - message << "network" << page; - QDBusConnection::sessionBus().asyncCall(message); + QString pagePath = "network"; + if (!page.isEmpty()) + pagePath += "/" + page; + QStringList args { "--by-user", "org.deepin.dde.control-center" }; + if (!token.isEmpty()) + args << "-e" << "XDG_ACTIVATION_TOKEN=" + token; + args << "--" << "-p" << pagePath; + QProcess::startDetached("dde-am", args); Q_EMIT toControlCenter(); } diff --git a/net-view/operation/private/netmanagerthreadprivate.h b/net-view/operation/private/netmanagerthreadprivate.h index 326554a3..99a74af6 100644 --- a/net-view/operation/private/netmanagerthreadprivate.h +++ b/net-view/operation/private/netmanagerthreadprivate.h @@ -120,7 +120,7 @@ public Q_SLOTS: void connectWired(const QString &id, const QVariantMap ¶m); void connectWireless(const QString &id, const QVariantMap ¶m); void connectHotspot(const QString &id, const QVariantMap ¶m, bool connect); - void gotoControlCenter(const QString &page); + void gotoControlCenter(const QString &page, const QString &token = QString()); void gotoSecurityTools(const QString &page); void userCancelRequest(const QString &id); void retranslate(const QString &locale); // 更新翻译 @@ -149,7 +149,7 @@ protected Q_SLOTS: void doConnectWired(const QString &id, const QVariantMap ¶m); void doConnectWireless(const QString &id, const QVariantMap ¶m); void doConnectHotspot(const QString &id, const QVariantMap ¶m, bool connect); - void doGotoControlCenter(const QString &page); + void doGotoControlCenter(const QString &page, const QString &token = QString()); void doGotoSecurityTools(const QString &page); void doUserCancelRequest(const QString &id); void doRetranslate(const QString &locale); diff --git a/src/impl/serviceinter/deviceinterrealize.cpp b/src/impl/serviceinter/deviceinterrealize.cpp index 83d4f6f4..140252c7 100644 --- a/src/impl/serviceinter/deviceinterrealize.cpp +++ b/src/impl/serviceinter/deviceinterrealize.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2018-2026 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later