diff --git a/desktoppackage/contents/activitymanager/ActivityItem.qml b/desktoppackage/contents/activitymanager/ActivityItem.qml --- a/desktoppackage/contents/activitymanager/ActivityItem.qml +++ b/desktoppackage/contents/activitymanager/ActivityItem.qml @@ -11,6 +11,8 @@ import org.kde.activities 0.1 as Activities import org.kde.activities.settings 0.1 +import org.kde.draganddrop 2.0 + import "static.js" as S Item { @@ -225,6 +227,16 @@ // } } + DropArea { + id: droparea + anchors.fill: parent + preventStealing: true + + onDrop: { + ActivitySwitcher.Backend.drop(event.mimeData, event.modifiers, root.activityId); + } + } + MouseArea { id: hoverArea diff --git a/imports/activitymanager/CMakeLists.txt b/imports/activitymanager/CMakeLists.txt --- a/imports/activitymanager/CMakeLists.txt +++ b/imports/activitymanager/CMakeLists.txt @@ -43,6 +43,7 @@ KF5::KIOCore KF5::KIOWidgets KF5::WindowSystem + PW::LibTaskManager ${X11_X11_LIB} ) diff --git a/imports/activitymanager/switcherbackend.h b/imports/activitymanager/switcherbackend.h --- a/imports/activitymanager/switcherbackend.h +++ b/imports/activitymanager/switcherbackend.h @@ -53,6 +53,8 @@ static QObject *instance(QQmlEngine *engine, QJSEngine *scriptEngine); + Q_INVOKABLE void drop(QMimeData *, int modifiers, const QVariant &itemId); + Q_SIGNALS: void showSwitchNotification(const QString &id, const QString &name, const QString &icon); void shouldShowSwitcherChanged(bool value); diff --git a/imports/activitymanager/switcherbackend.cpp b/imports/activitymanager/switcherbackend.cpp --- a/imports/activitymanager/switcherbackend.cpp +++ b/imports/activitymanager/switcherbackend.cpp @@ -28,6 +28,7 @@ #include #include #include +#include // Qml and QtQuick #include @@ -39,6 +40,9 @@ #include #include #include +#include +#include +#include // X11 #include @@ -392,6 +396,47 @@ m_previousActivity = id; } +void SwitcherBackend::drop(QMimeData * mimeData, int modifiers, const QVariant &itemId) +{ + if (!mimeData) { + return; + } +#if HAVE_X11 + if (KWindowSystem::isPlatformX11()) { + bool ok; + + const QList &ids = TaskManager::XWindowTasksModel::winIdsFromMimeData(mimeData, &ok); + + if (!ok) { + return; + } + + QString newActivity = itemId.toString(); + const QStringList &runningActivities = m_activities.runningActivities(); + + if (!runningActivities.contains(newActivity)) { + return; + } + + for (const auto &id : ids) { + QStringList activities = KWindowInfo(id, NET::Properties(), NET::WM2Activities).activities(); + + if (modifiers & Qt::ControlModifier) { // 'copy' => add to activity + if (!activities.contains(newActivity)) + activities << newActivity; + } else { // 'move' to activity + // if on only one activity, set it to only the new activity + // if on >1 activity, remove it from the current activity and add it to the new activity + const QString currentActivity = m_activities.currentActivity(); + activities.removeAll(currentActivity); + activities << newActivity; + } + KWindowSystem::setOnActivities(id, activities); + } + } +#endif +} + bool SwitcherBackend::shouldShowSwitcher() const { return m_shouldShowSwitcher;