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,48 @@ m_previousActivity = id; } +void SwitcherBackend::drop(QMimeData * mimeData, int modifiers, const QVariant &itemId) +{ + qDebug() << "SwitcherBackend::drop()"; + 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;