From a6a6edaa5413b0582591c90fdb5883d0392f475f Mon Sep 17 00:00:00 2001 From: Robertkill Date: Fri, 19 Apr 2024 13:18:32 +0800 Subject: [PATCH] fix: After logging out, the workspace icons are not displayed Implement workspace functionality using the KWin interface. log: as title issue: https://github.com/linuxdeepin/developer-center/issues/8023 --- panels/dock/workspaceitem/CMakeLists.txt | 2 + panels/dock/workspaceitem/desktops.cpp | 51 ++++++++++++ panels/dock/workspaceitem/desktops.h | 29 +++++++ .../workspaceitem/package/workspaceitem.qml | 17 ++++ panels/dock/workspaceitem/workspacemodel.cpp | 5 +- panels/dock/workspaceitem/workspacemodel.h | 14 ++-- .../dock/workspaceitem/xworkspaceworker.cpp | 83 ++++++++++--------- panels/dock/workspaceitem/xworkspaceworker.h | 10 ++- 8 files changed, 162 insertions(+), 49 deletions(-) create mode 100644 panels/dock/workspaceitem/desktops.cpp create mode 100644 panels/dock/workspaceitem/desktops.h diff --git a/panels/dock/workspaceitem/CMakeLists.txt b/panels/dock/workspaceitem/CMakeLists.txt index ce26ab1b5..d6f8338ad 100644 --- a/panels/dock/workspaceitem/CMakeLists.txt +++ b/panels/dock/workspaceitem/CMakeLists.txt @@ -9,6 +9,8 @@ add_library(dock-workspaceitem SHARED workspacemodel.cpp xworkspaceworker.h xworkspaceworker.cpp + desktops.h + desktops.cpp ) target_link_libraries(dock-workspaceitem PRIVATE diff --git a/panels/dock/workspaceitem/desktops.cpp b/panels/dock/workspaceitem/desktops.cpp new file mode 100644 index 000000000..1eb37ce3e --- /dev/null +++ b/panels/dock/workspaceitem/desktops.cpp @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include "desktops.h" + +const QDBusArgument &operator<<(QDBusArgument &argument, const DBusDesktopDataStruct &desk) +{ + argument.beginStructure(); + argument << desk.position; + argument << desk.id; + argument << desk.name; + argument.endStructure(); + return argument; +} +// Retrieve +const QDBusArgument &operator>>(const QDBusArgument &argument, DBusDesktopDataStruct &desk) +{ + argument.beginStructure(); + argument >> desk.position; + argument >> desk.id; + argument >> desk.name; + argument.endStructure(); + return argument; +} + +const QDBusArgument &operator<<(QDBusArgument &argument, const DBusDesktopDataVector &deskVector) +{ + argument.beginArray(qMetaTypeId()); + for (int i = 0; i < deskVector.size(); ++i) { + argument << deskVector[i]; + } + argument.endArray(); + return argument; +} + +const QDBusArgument &operator>>(const QDBusArgument &argument, DBusDesktopDataVector &deskVector) +{ + argument.beginArray(); + deskVector.clear(); + + while (!argument.atEnd()) { + DBusDesktopDataStruct element; + argument >> element; + deskVector.append(element); + } + + argument.endArray(); + + return argument; +} + diff --git a/panels/dock/workspaceitem/desktops.h b/panels/dock/workspaceitem/desktops.h new file mode 100644 index 000000000..a8d080a07 --- /dev/null +++ b/panels/dock/workspaceitem/desktops.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#ifndef DESKTOPS_H +#define DESKTOPS_H + +#include + +struct DBusDesktopDataStruct { + uint position; + QString id; + QString name; + DBusDesktopDataStruct() { + position = 0; + } +}; +typedef QVector DBusDesktopDataVector; + +const QDBusArgument &operator<<(QDBusArgument &argument, const DBusDesktopDataStruct &desk); +const QDBusArgument &operator>>(const QDBusArgument &argument, DBusDesktopDataStruct &desk); + +Q_DECLARE_METATYPE(DBusDesktopDataStruct) + +const QDBusArgument &operator<<(QDBusArgument &argument, const DBusDesktopDataVector &deskVector); +const QDBusArgument &operator>>(const QDBusArgument &argument, DBusDesktopDataVector &deskVector); + +Q_DECLARE_METATYPE(DBusDesktopDataVector) + +#endif // DESKTOPS_H diff --git a/panels/dock/workspaceitem/package/workspaceitem.qml b/panels/dock/workspaceitem/package/workspaceitem.qml index a3898776f..5749eff4a 100644 --- a/panels/dock/workspaceitem/package/workspaceitem.qml +++ b/panels/dock/workspaceitem/package/workspaceitem.qml @@ -34,6 +34,7 @@ AppletItem { component WorkspaceDelegate: Item { id: content required property int index + required property string workspaceName required property string screenImage property bool isCurrent: content.ListView.view.currentIndex === content.index @@ -57,13 +58,29 @@ AppletItem { } MouseArea { anchors.fill: parent + hoverEnabled: true onClicked: { Applet.dataModel.currentIndex = content.index } + onEntered: { + var point = content.mapToItem(null, content.width / 2, 0) + toolTip.toolTipX = point.x + toolTip.toolTipY = point.y + toolTip.text = workspaceName + toolTip.open() + } + + onExited: { + toolTip.close() + } } } } + PanelToolTip { + id: toolTip + } + Rectangle { anchors.fill: parent color: "transparent" diff --git a/panels/dock/workspaceitem/workspacemodel.cpp b/panels/dock/workspaceitem/workspacemodel.cpp index 5151f73ff..dcada7f48 100644 --- a/panels/dock/workspaceitem/workspacemodel.cpp +++ b/panels/dock/workspaceitem/workspacemodel.cpp @@ -31,6 +31,8 @@ QVariant WorkspaceModel::data(const QModelIndex &index, int role) const auto item = m_items[index.row()]; switch (role) { + case WorkspaceModel::NameRole: + return item->name(); case WorkspaceModel::ImageRole: return item->image(); } @@ -40,7 +42,8 @@ QVariant WorkspaceModel::data(const QModelIndex &index, int role) const QHash WorkspaceModel::roleNames() const { return { - {WorkspaceModel::ImageRole, "screenImage"}, + {WorkspaceModel::NameRole, "workspaceName"}, + {WorkspaceModel::ImageRole, "screenImage"}, }; } diff --git a/panels/dock/workspaceitem/workspacemodel.h b/panels/dock/workspaceitem/workspacemodel.h index f998ce410..f9dfff2ff 100644 --- a/panels/dock/workspaceitem/workspacemodel.h +++ b/panels/dock/workspaceitem/workspacemodel.h @@ -4,8 +4,6 @@ #ifndef WORKSPACEMODEL_H #define WORKSPACEMODEL_H -#include "dsglobal.h" - #include #include namespace dock { @@ -13,15 +11,20 @@ namespace dock { class WorkSpaceData { public: - WorkSpaceData(QString image) - : m_image(image) + WorkSpaceData(QString name, QString image) + : m_name(name) + , m_image(image) { + } + QString name() { + return m_name; } QString image() { return m_image; } private: + QString m_name; QString m_image; }; @@ -30,7 +33,8 @@ class WorkspaceModel : public QAbstractListModel Q_OBJECT public: enum Roles { - ImageRole = Qt::UserRole + 1, + NameRole = Qt::UserRole + 1, + ImageRole, }; Q_ENUM(Roles) diff --git a/panels/dock/workspaceitem/xworkspaceworker.cpp b/panels/dock/workspaceitem/xworkspaceworker.cpp index c697cf223..574041c9f 100644 --- a/panels/dock/workspaceitem/xworkspaceworker.cpp +++ b/panels/dock/workspaceitem/xworkspaceworker.cpp @@ -4,12 +4,6 @@ #include "xworkspaceworker.h" #include "workspacemodel.h" -#include -#include -#include -#include -#include -#include #include Q_LOGGING_CATEGORY(workspaceItem, "dde.shell.dock.workspaceItem") @@ -18,9 +12,12 @@ namespace dock { XWorkspaceWorker::XWorkspaceWorker(WorkspaceModel *model) : QObject(model) - , m_inter(new QDBusInterface("com.deepin.wm", "/com/deepin/wm", "com.deepin.wm")) + , m_interKwinProp(new QDBusInterface("org.kde.KWin", "/VirtualDesktopManager", "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus(), this)) , m_model(model) + , m_currentIndex(0) { + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); updateData(); QDBusConnection bus = QDBusConnection::sessionBus(); @@ -29,56 +26,62 @@ XWorkspaceWorker::XWorkspaceWorker(WorkspaceModel *model) return; } - bus.connect("com.deepin.wm", "/com/deepin/wm", "com.deepin.wm", "workspaceCountChanged", this, SLOT(updateData())); - bus.connect("com.deepin.wm", "/com/deepin/wm", "com.deepin.wm", "WorkspaceSwitched", this, SLOT(updateData())); - bus.connect("com.deepin.wm", "/com/deepin/wm", "com.deepin.wm", "WorkspaceBackgroundChangedForMonitor", this, SLOT(updateData())); - bus.connect("com.deepin.wm", "/com/deepin/wm", "com.deepin.wm", "WorkspaceBackgroundChanged", this, SLOT(updateData())); + bus.connect("org.kde.KWin", "/VirtualDesktopManager", "org.kde.KWin.VirtualDesktopManager", "currentChanged", this, SLOT(updateData())); + bus.connect("org.kde.KWin", "/VirtualDesktopManager", "org.kde.KWin.VirtualDesktopManager", "desktopsChanged", this, SLOT(updateData())); + bus.connect("org.deepin.dde.Appearance1", "/org/deepin/dde/Appearance1", "org.deepin.dde.Appearance1", "Changed", this, SLOT(appearanceChanged(const QString,const QString))); connect(m_model, &WorkspaceModel::currentIndexChanged, this, &XWorkspaceWorker::setIndex); } void XWorkspaceWorker::setIndex(int index) { - QDBusReply resIndex = m_inter->call("GetCurrentWorkspace"); - if (resIndex.error().message().isEmpty() && m_model->currentIndex() + 1 != resIndex.value()) { - m_inter->call("SetCurrentWorkspace", index + 1); - } else { - qCWarning(workspaceItem) << "GetCurrentWorkspace failed:" << resIndex.error().message(); - return; - } + if (m_desktops.count() > index && m_currentIndex != index) + m_interKwinProp->call("Set", "org.kde.KWin.VirtualDesktopManager", "current", QVariant::fromValue(QDBusVariant(m_desktops[index].id))); +} + +void XWorkspaceWorker::appearanceChanged(const QString &changedStr, const QString &value) +{ + if ("allwallpaperuris" == changedStr) + updateData(); } void XWorkspaceWorker::updateData() { - int count = 0; - QDBusReply resCount = m_inter->call("WorkspaceCount"); - if (resCount.error().message().isEmpty()) { - count = resCount.value(); + QDBusMessage reply = m_interKwinProp->call("Get", "org.kde.KWin.VirtualDesktopManager", "desktops"); + if (reply.type() == QDBusMessage::ReplyMessage) { + QVariant result = reply.arguments().at(0); + m_desktops = qdbus_cast(result.value().variant().value()); } else { - qCWarning(workspaceItem) << "WorkspaceCount failed:" << resCount.error().message(); - return; + qCWarning(workspaceItem) << "Error calling desktops"; + } + + reply = m_interKwinProp->call("Get", "org.kde.KWin.VirtualDesktopManager", "current"); + + if (reply.type() == QDBusMessage::ReplyMessage) { + QVariant result = reply.arguments().at(0); + m_currentId = result.value().variant().toString(); + } else { + qCWarning(workspaceItem) << "Error calling current"; } + + QList items; - for (int i = 1; i <= count; ++i) { + for (int i = 0; i < m_desktops.count(); ++i) { QString image; - QDBusReply res = m_inter->call("GetWorkspaceBackgroundForMonitor", i, QGuiApplication::primaryScreen()->name()); - if (res.error().message().isEmpty()) { - image = res.value(); - } else { - qCWarning(workspaceItem) << "GetWorkspaceBackgroundForMonitor failed:" << res.error().message(); - return; + if (m_desktops[i].id == m_currentId) { + m_currentIndex = i; + QDBusReply res = QDBusInterface("org.deepin.dde.Appearance1", "/org/deepin/dde/Appearance1", "org.deepin.dde.Appearance1").call("GetCurrentWorkspaceBackground"); + if (res.error().message().isEmpty()) { + image = res.value(); + } else { + qCWarning(workspaceItem) << "GetWorkspaceBackgroundForMonitor failed:" << res.error().message(); + return; + } } - auto item = new WorkSpaceData(image); + auto item = new WorkSpaceData(m_desktops[i].name, image); items.append(item); } m_model->setItems(items); - QDBusReply index = m_inter->call("GetCurrentWorkspace"); - if (index.error().message().isEmpty()) { - qWarning() << "m_model->setCurrentIndex(index.value() - 1) " << index.value(); - m_model->setCurrentIndex(index.value() - 1); - } else { - qCWarning(workspaceItem) << "GetCurrentWorkspace failed:" << index.error().message(); - return; - } + m_model->setCurrentIndex(m_currentIndex); } } diff --git a/panels/dock/workspaceitem/xworkspaceworker.h b/panels/dock/workspaceitem/xworkspaceworker.h index 3746000fb..3f897bc37 100644 --- a/panels/dock/workspaceitem/xworkspaceworker.h +++ b/panels/dock/workspaceitem/xworkspaceworker.h @@ -4,10 +4,9 @@ #ifndef XWORKSPACEWORKER_H #define XWORKSPACEWORKER_H -#include "dsglobal.h" +#include "desktops.h" #include -#include namespace dock { class WorkspaceModel; class XWorkspaceWorker : public QObject @@ -19,11 +18,16 @@ class XWorkspaceWorker : public QObject public slots: void updateData(); void setIndex(int index); + void appearanceChanged(const QString &changedStr, const QString &value); signals: private: - QDBusInterface *m_inter; + QDBusInterface *m_interKwinProp; WorkspaceModel *m_model; + + DBusDesktopDataVector m_desktops; + QString m_currentId; + int m_currentIndex; }; } #endif // XWORKSPACEWORKER_H