From dbb0ac13fa635eb4b0925613e6529392ce2f0f39 Mon Sep 17 00:00:00 2001 From: Ye ShanShan Date: Sat, 23 Nov 2024 15:36:03 +0800 Subject: [PATCH] feat: add lockscreen protocol for ShutdownApplet as title. --- applets/dde-shutdown/CMakeLists.txt | 9 ++++ applets/dde-shutdown/shutdownapplet.cpp | 29 ++++++++-- applets/dde-shutdown/shutdownapplet.h | 6 +++ applets/dde-shutdown/treelandlockscreen.cpp | 51 ++++++++++++++++++ applets/dde-shutdown/treelandlockscreen.h | 41 ++++++++++++++ example/CMakeLists.txt | 1 + example/lockscreen-example/CMakeLists.txt | 5 ++ example/lockscreen-example/package/main.qml | 53 +++++++++++++++++++ .../lockscreen-example/package/metadata.json | 8 +++ 9 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 applets/dde-shutdown/treelandlockscreen.cpp create mode 100644 applets/dde-shutdown/treelandlockscreen.h create mode 100644 example/lockscreen-example/CMakeLists.txt create mode 100644 example/lockscreen-example/package/main.qml create mode 100644 example/lockscreen-example/package/metadata.json diff --git a/applets/dde-shutdown/CMakeLists.txt b/applets/dde-shutdown/CMakeLists.txt index f1c8a9951..2119661de 100644 --- a/applets/dde-shutdown/CMakeLists.txt +++ b/applets/dde-shutdown/CMakeLists.txt @@ -1,15 +1,24 @@ # SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. # # SPDX-License-Identifier: GPL-3.0-or-later +find_package(TreelandProtocols REQUIRED) add_library(dde-shutdown SHARED shutdownapplet.cpp shutdownapplet.h + treelandlockscreen.h + treelandlockscreen.cpp +) + +qt_generate_wayland_protocol_client_sources(dde-shutdown + FILES + ${TREELAND_PROTOCOLS_DATA_DIR}/treeland-dde-shell-v1.xml ) target_link_libraries(dde-shutdown PRIVATE dde-shell-frame Qt${QT_MAJOR_VERSION}::DBus + Qt${QT_VERSION_MAJOR}::WaylandClient ) ds_install_package(PACKAGE org.deepin.ds.dde-shutdown TARGET dde-shutdown) diff --git a/applets/dde-shutdown/shutdownapplet.cpp b/applets/dde-shutdown/shutdownapplet.cpp index df8f0d853..cac6cada9 100644 --- a/applets/dde-shutdown/shutdownapplet.cpp +++ b/applets/dde-shutdown/shutdownapplet.cpp @@ -3,12 +3,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "shutdownapplet.h" -#include "pluginfactory.h" +#include "treelandlockscreen.h" #include #include #include + +#include DCORE_USE_NAMESPACE DS_BEGIN_NAMESPACE @@ -25,13 +27,18 @@ ShutdownApplet::~ShutdownApplet() bool ShutdownApplet::load() { + auto platformName = QGuiApplication::platformName(); + if (QStringLiteral("wayland") == platformName) { + m_lockscreen.reset(new TreeLandLockScreen); + } return true; } bool ShutdownApplet::requestShutdown() { - if (QStringLiteral("wayland") == QGuiApplication::platformName()) { - qDebug() << "request treeland shutdown"; + qDebug() << "request shutdown"; + if (m_lockscreen) { + m_lockscreen->shutdown(); } else { DDBusSender() .service("org.deepin.dde.ShutdownFront1") @@ -44,6 +51,22 @@ bool ShutdownApplet::requestShutdown() return true; } +bool ShutdownApplet::requestLock() +{ + if (m_lockscreen) { + m_lockscreen->lock(); + } + return true; +} + +bool ShutdownApplet::requestSwitchUser() +{ + if (m_lockscreen) { + m_lockscreen->switchUser(); + } + return true; +} + D_APPLET_CLASS(ShutdownApplet) } DS_END_NAMESPACE diff --git a/applets/dde-shutdown/shutdownapplet.h b/applets/dde-shutdown/shutdownapplet.h index b1f020be6..daa113cc4 100644 --- a/applets/dde-shutdown/shutdownapplet.h +++ b/applets/dde-shutdown/shutdownapplet.h @@ -8,6 +8,7 @@ DS_BEGIN_NAMESPACE namespace shutdown { +class TreeLandLockScreen; class ShutdownApplet : public DApplet { Q_OBJECT @@ -19,6 +20,11 @@ class ShutdownApplet : public DApplet public Q_SLOTS: bool requestShutdown(); + bool requestLock(); + bool requestSwitchUser(); + +private: + QScopedPointer m_lockscreen; }; } diff --git a/applets/dde-shutdown/treelandlockscreen.cpp b/applets/dde-shutdown/treelandlockscreen.cpp new file mode 100644 index 000000000..35ac41293 --- /dev/null +++ b/applets/dde-shutdown/treelandlockscreen.cpp @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "treelandlockscreen.h" + +DS_BEGIN_NAMESPACE +namespace shutdown +{ +TreeLandLockScreen::TreeLandLockScreen() + : QWaylandClientExtensionTemplate(treeland_dde_shell_manager_v1_interface.version) +{ +} + +void TreeLandLockScreen::lock() +{ + if (auto impl = workder()) + impl->lock(); +} + +void TreeLandLockScreen::shutdown() +{ + if (auto impl = workder()) + impl->shutdown(); +} + +void TreeLandLockScreen::switchUser() +{ + if (auto impl = workder()) + impl->switch_user(); +} + +TreeLandLockScreenWorker *TreeLandLockScreen::workder() +{ + if (!isActive()) { + return nullptr; + } + + if (m_worker.isNull()) { + m_worker.reset(new TreeLandLockScreenWorker(get_treeland_lockscreen())); + } + return m_worker.get(); +} + +TreeLandLockScreenWorker::TreeLandLockScreenWorker(struct ::treeland_lockscreen_v1 *object) + : QWaylandClientExtensionTemplate(treeland_lockscreen_v1_interface.version) + , QtWayland::treeland_lockscreen_v1(object) +{ +} +} +DS_END_NAMESPACE diff --git a/applets/dde-shutdown/treelandlockscreen.h b/applets/dde-shutdown/treelandlockscreen.h new file mode 100644 index 000000000..452913166 --- /dev/null +++ b/applets/dde-shutdown/treelandlockscreen.h @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "dsglobal.h" +#include "qwayland-treeland-dde-shell-v1.h" + +#include + +DS_BEGIN_NAMESPACE +namespace shutdown +{ +class TreeLandLockScreenWorker; +class TreeLandLockScreen : public QWaylandClientExtensionTemplate, public QtWayland::treeland_dde_shell_manager_v1 +{ + Q_OBJECT + +public: + explicit TreeLandLockScreen(); + void lock(); + void shutdown(); + void switchUser(); + +private: + TreeLandLockScreenWorker *workder(); + +private: + QScopedPointer m_worker; +}; + +class TreeLandLockScreenWorker : public QWaylandClientExtensionTemplate, public QtWayland::treeland_lockscreen_v1 +{ + Q_OBJECT + +public: + explicit TreeLandLockScreenWorker(struct ::treeland_lockscreen_v1 *object); +}; +} +DS_END_NAMESPACE diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 9dcda5bf5..7a31d2249 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -11,6 +11,7 @@ add_subdirectory(panel-example) add_subdirectory(layershell-example) add_subdirectory(osd-example) add_subdirectory(drag-example) +add_subdirectory(lockscreen-example) if(CMAKE_BUILD_TYPE STREQUAL "Debug") add_subdirectory(bridge-example) diff --git a/example/lockscreen-example/CMakeLists.txt b/example/lockscreen-example/CMakeLists.txt new file mode 100644 index 000000000..33045c8fe --- /dev/null +++ b/example/lockscreen-example/CMakeLists.txt @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +ds_install_package(PACKAGE org.deepin.ds.example.lockscreen) diff --git a/example/lockscreen-example/package/main.qml b/example/lockscreen-example/package/main.qml new file mode 100644 index 000000000..61ccdec70 --- /dev/null +++ b/example/lockscreen-example/package/main.qml @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +import QtQuick 2.11 +import QtQuick.Controls 2.4 + +import org.deepin.ds 1.0 + +AppletItem { + implicitWidth: 120 + implicitHeight: 100 + + function lockscreenApplet() + { + var lockscreen = DS.applet("org.deepin.ds.dde-shutdown") + if (lockscreen) { + return lockscreen + } else { + console.warn("shutdown applet not found") + } + } + + Column { + Button { + text: "Lock" + onClicked: { + let lockscreen = lockscreenApplet() + if (lockscreen) { + lockscreen.requestLock() + } + } + } + Button { + text: "Shutdown" + onClicked: { + let lockscreen = lockscreenApplet() + if (lockscreen) { + lockscreen.requestShutdown() + } + } + } + Button { + text: "SwitchUser" + onClicked: { + let lockscreen = lockscreenApplet() + if (lockscreen) { + lockscreen.requestSwitchUser() + } + } + } + } +} diff --git a/example/lockscreen-example/package/metadata.json b/example/lockscreen-example/package/metadata.json new file mode 100644 index 000000000..407f00b82 --- /dev/null +++ b/example/lockscreen-example/package/metadata.json @@ -0,0 +1,8 @@ +{ + "Plugin": { + "Version": "1.0", + "Id": "org.deepin.ds.example.lockscreen", + "Url": "main.qml", + "Parent": "org.deepin.ds.example.containment" + } +}