From 131a27bb50ab77435b4908b20bcaa811c46eaadb Mon Sep 17 00:00:00 2001 From: xionglinlin Date: Tue, 19 Nov 2024 21:34:12 +0800 Subject: [PATCH] feat: add shutdown applet Add shutdown applet to handle power management for x11 and treeland in a unified manner Log: add shutdown applet --- applets/CMakeLists.txt | 1 + applets/dde-shutdown/CMakeLists.txt | 15 ++++++ applets/dde-shutdown/package/metadata.json | 7 +++ applets/dde-shutdown/shutdownapplet.cpp | 51 +++++++++++++++++++ applets/dde-shutdown/shutdownapplet.h | 25 +++++++++ panels/dock/DockCompositor.qml | 5 ++ panels/dock/pluginmanagerextension.cpp | 6 +++ panels/dock/pluginmanagerextension_p.h | 2 + panels/dock/tray/package/tray.qml | 9 ++++ .../dock/tray/quickpanel/PanelPluginPage.qml | 7 ++- .../tray/quickpanel/quickpanelproxymodel.cpp | 10 ---- .../tray/quickpanel/quickpanelproxymodel.h | 1 - 12 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 applets/dde-shutdown/CMakeLists.txt create mode 100644 applets/dde-shutdown/package/metadata.json create mode 100644 applets/dde-shutdown/shutdownapplet.cpp create mode 100644 applets/dde-shutdown/shutdownapplet.h diff --git a/applets/CMakeLists.txt b/applets/CMakeLists.txt index dbf42e557..c93043d84 100644 --- a/applets/CMakeLists.txt +++ b/applets/CMakeLists.txt @@ -5,3 +5,4 @@ add_subdirectory(dde-am) add_subdirectory(dde-appearance) add_subdirectory(dde-apps) +add_subdirectory(dde-shutdown) diff --git a/applets/dde-shutdown/CMakeLists.txt b/applets/dde-shutdown/CMakeLists.txt new file mode 100644 index 000000000..f1c8a9951 --- /dev/null +++ b/applets/dde-shutdown/CMakeLists.txt @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +add_library(dde-shutdown SHARED + shutdownapplet.cpp + shutdownapplet.h +) + +target_link_libraries(dde-shutdown PRIVATE + dde-shell-frame + Qt${QT_MAJOR_VERSION}::DBus +) + +ds_install_package(PACKAGE org.deepin.ds.dde-shutdown TARGET dde-shutdown) diff --git a/applets/dde-shutdown/package/metadata.json b/applets/dde-shutdown/package/metadata.json new file mode 100644 index 000000000..55539f551 --- /dev/null +++ b/applets/dde-shutdown/package/metadata.json @@ -0,0 +1,7 @@ +{ + "Plugin": { + "Version": "1.0", + "Id": "org.deepin.ds.dde-shutdown", + "Category": "DDE" + } +} diff --git a/applets/dde-shutdown/shutdownapplet.cpp b/applets/dde-shutdown/shutdownapplet.cpp new file mode 100644 index 000000000..df8f0d853 --- /dev/null +++ b/applets/dde-shutdown/shutdownapplet.cpp @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "shutdownapplet.h" +#include "pluginfactory.h" + +#include +#include + +#include +DCORE_USE_NAMESPACE + +DS_BEGIN_NAMESPACE +namespace shutdown { + +ShutdownApplet::ShutdownApplet(QObject *parent) + : DApplet(parent) +{ +} + +ShutdownApplet::~ShutdownApplet() +{ +} + +bool ShutdownApplet::load() +{ + return true; +} + +bool ShutdownApplet::requestShutdown() +{ + if (QStringLiteral("wayland") == QGuiApplication::platformName()) { + qDebug() << "request treeland shutdown"; + } else { + DDBusSender() + .service("org.deepin.dde.ShutdownFront1") + .interface("org.deepin.dde.ShutdownFront1") + .path("/org/deepin/dde/ShutdownFront1") + .method("Show") + .call(); + } + + return true; +} + +D_APPLET_CLASS(ShutdownApplet) +} +DS_END_NAMESPACE + +#include "shutdownapplet.moc" diff --git a/applets/dde-shutdown/shutdownapplet.h b/applets/dde-shutdown/shutdownapplet.h new file mode 100644 index 000000000..b1f020be6 --- /dev/null +++ b/applets/dde-shutdown/shutdownapplet.h @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "applet.h" + +DS_BEGIN_NAMESPACE +namespace shutdown { +class ShutdownApplet : public DApplet +{ + Q_OBJECT +public: + explicit ShutdownApplet(QObject *parent = nullptr); + ~ShutdownApplet(); + + virtual bool load() override; + +public Q_SLOTS: + bool requestShutdown(); +}; + +} +DS_END_NAMESPACE diff --git a/panels/dock/DockCompositor.qml b/panels/dock/DockCompositor.qml index 1829e6ec5..de7906f83 100644 --- a/panels/dock/DockCompositor.qml +++ b/panels/dock/DockCompositor.qml @@ -27,6 +27,7 @@ Item { signal pluginSurfacesUpdated() signal popupCreated(var popup) + signal requestShutdown() function removeDockPluginSurface(model, object) { for (var i = 0; i < model.count; ++i) { @@ -101,6 +102,10 @@ Item { console.log("plugin popup created", popup.pluginId, popup.itemKey, popup.popupType) dockCompositor.popupCreated(popup) } + + onRequestShutdown: { + dockCompositor.requestShutdown() + } } } } diff --git a/panels/dock/pluginmanagerextension.cpp b/panels/dock/pluginmanagerextension.cpp index 29ffea46a..9c108400a 100644 --- a/panels/dock/pluginmanagerextension.cpp +++ b/panels/dock/pluginmanagerextension.cpp @@ -115,6 +115,12 @@ void PluginSurface::plugin_dcc_icon(Resource *resource, const QString &icon) m_dccIcon = icon; } +void PluginSurface::plugin_request_shutdown(Resource *resource) +{ + Q_UNUSED(resource); + Q_EMIT m_manager->requestShutdown(); +} + void PluginSurface::plugin_destroy_resource(Resource *resource) { Q_UNUSED(resource); diff --git a/panels/dock/pluginmanagerextension_p.h b/panels/dock/pluginmanagerextension_p.h index 05a31ed4f..54c195ef1 100644 --- a/panels/dock/pluginmanagerextension_p.h +++ b/panels/dock/pluginmanagerextension_p.h @@ -50,6 +50,7 @@ class PluginManager : public QWaylandCompositorExtensionTemplate, void pluginSurfaceDestroyed(PluginSurface*); void messageRequest(PluginSurface *, const QString &msg); void dockSizeChanged(); + void requestShutdown(); protected: virtual void plugin_manager_v1_request_message(Resource *resource, const QString &plugin_id, const QString &item_key, const QString &msg) override; @@ -131,6 +132,7 @@ class PluginSurface : public QWaylandShellSurfaceTemplate, public protected: virtual void plugin_mouse_event(Resource *resource, int32_t type) override; virtual void plugin_dcc_icon(Resource *resource, const QString &icon) override; + virtual void plugin_request_shutdown(Resource *resource) override; virtual void plugin_destroy_resource(Resource *resource) override; virtual void plugin_destroy(Resource *resource) override; diff --git a/panels/dock/tray/package/tray.qml b/panels/dock/tray/package/tray.qml index f58dddeaf..ce6ac402b 100644 --- a/panels/dock/tray/package/tray.qml +++ b/panels/dock/tray/package/tray.qml @@ -156,6 +156,15 @@ AppletItem { DDT.TraySortOrderModel.availableSurfaces = surfacesData console.log("onPluginSurfacesUpdated", surfacesData.length) } + + function onRequestShutdown() { + var shutdown = DS.applet("org.deepin.ds.dde-shutdown") + if (shutdown) { + shutdown.requestShutdown() + } else { + console.warn("shutdown applet not found") + } + } } WaylandOutput { diff --git a/panels/dock/tray/quickpanel/PanelPluginPage.qml b/panels/dock/tray/quickpanel/PanelPluginPage.qml index fd6211650..e90e05190 100644 --- a/panels/dock/tray/quickpanel/PanelPluginPage.qml +++ b/panels/dock/tray/quickpanel/PanelPluginPage.qml @@ -58,7 +58,12 @@ Item { icon.name: "quickpanel-power" onClicked: function () { console.log("clicked shutdown") - model.openShutdownScreen() + var shutdown = DS.applet("org.deepin.ds.dde-shutdown") + if (shutdown) { + shutdown.requestShutdown() + } else { + console.warn("shutdown applet not found") + } } } } diff --git a/panels/dock/tray/quickpanel/quickpanelproxymodel.cpp b/panels/dock/tray/quickpanel/quickpanelproxymodel.cpp index 6a5285516..a3ed99105 100644 --- a/panels/dock/tray/quickpanel/quickpanelproxymodel.cpp +++ b/panels/dock/tray/quickpanel/quickpanelproxymodel.cpp @@ -54,16 +54,6 @@ void QuickPanelProxyModel::openSystemSettings() .call(); } -void QuickPanelProxyModel::openShutdownScreen() -{ - DDBusSender() - .service("org.deepin.dde.ShutdownFront1") - .interface("org.deepin.dde.ShutdownFront1") - .path("/org/deepin/dde/ShutdownFront1") - .method("Show") - .call(); -} - QVariant QuickPanelProxyModel::data(const QModelIndex &index, int role) const { const auto sourceIndex = mapToSource(index); diff --git a/panels/dock/tray/quickpanel/quickpanelproxymodel.h b/panels/dock/tray/quickpanel/quickpanelproxymodel.h index b3e6d1072..55b44d208 100644 --- a/panels/dock/tray/quickpanel/quickpanelproxymodel.h +++ b/panels/dock/tray/quickpanel/quickpanelproxymodel.h @@ -24,7 +24,6 @@ class QuickPanelProxyModel : public QSortFilterProxyModel, public QQmlParserStat Q_INVOKABLE QString getTitle(const QString &pluginId) const; Q_INVOKABLE bool isQuickPanelPopup(const QString &pluginId, const QString &itemKey) const; Q_INVOKABLE void openSystemSettings(); - Q_INVOKABLE void openShutdownScreen(); QVariant data(const QModelIndex &index, int role) const override; QHash roleNames() const override;