From e63a43afe5420ec54572150e7f9cbc5489a2f49b Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Sun, 28 Oct 2018 10:03:22 +0200 Subject: [PATCH] enable requestMove through the visibilitymanager --- app/abstractwindowinterface.h | 4 +++ app/dock/visibilitymanager.cpp | 25 +++++++++++++++++ app/dock/visibilitymanager.h | 4 +++ app/dock/visibilitymanager_p.h | 3 +++ app/waylandinterface.cpp | 12 +++++++++ app/waylandinterface.h | 3 +++ app/windowinfowrap.h | 25 ++++++++++++++--- app/xwindowinterface.cpp | 34 ++++++++++++++++++++++++ app/xwindowinterface.h | 3 +++ containment/package/contents/ui/main.qml | 29 +++++++++++++++----- 10 files changed, 133 insertions(+), 9 deletions(-) diff --git a/app/abstractwindowinterface.h b/app/abstractwindowinterface.h index 1dbea9629..b6ab91132 100644 --- a/app/abstractwindowinterface.h +++ b/app/abstractwindowinterface.h @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -82,6 +83,9 @@ public: virtual void enableBlurBehind(QWindow &view) const = 0; virtual void setEdgeStateFor(QWindow *view, bool active) const = 0; + virtual void requestMoveActiveWindow(QPoint from) const = 0; + virtual bool activeWindowCanBeDragged() const = 0; + void addDock(WindowId wid); void removeDock(WindowId wid); diff --git a/app/dock/visibilitymanager.cpp b/app/dock/visibilitymanager.cpp index 724ec5f26..da0d3e1be 100644 --- a/app/dock/visibilitymanager.cpp +++ b/app/dock/visibilitymanager.cpp @@ -1040,6 +1040,19 @@ void VisibilityManagerPrivate::deleteEdgeGhostWindow() emit q->supportsKWinEdgesChanged(); } } + +//! Window Functions +void VisibilityManagerPrivate::requestMoveActiveWindow(int localX, int localY) +{ + QPoint globalPoint{dockView->x() + localX, dockView->y() + localY}; + wm->requestMoveActiveWindow(globalPoint); +} + +bool VisibilityManagerPrivate::activeWindowCanBeDragged() +{ + return wm->activeWindowCanBeDragged(); +} + //! END: VisibilityManagerPrivate implementation @@ -1187,5 +1200,17 @@ bool VisibilityManager::supportsKWinEdges() const return (d->edgeGhostWindow != nullptr); } +//! Window Functions +void VisibilityManager::requestMoveActiveWindow(int localX, int localY) +{ + d->requestMoveActiveWindow(localX, localY); +} + +bool VisibilityManager::activeWindowCanBeDragged() +{ + return d->activeWindowCanBeDragged(); +} + //! END: VisibilityManager implementation + } diff --git a/app/dock/visibilitymanager.h b/app/dock/visibilitymanager.h index 456cabc14..62aae83d9 100644 --- a/app/dock/visibilitymanager.h +++ b/app/dock/visibilitymanager.h @@ -104,6 +104,10 @@ public: bool supportsKWinEdges() const; +public slots: + Q_INVOKABLE void requestMoveActiveWindow(int localX, int localY); + Q_INVOKABLE bool activeWindowCanBeDragged(); + signals: void mustBeShown(QPrivateSignal); void mustBeHide(QPrivateSignal); diff --git a/app/dock/visibilitymanager_p.h b/app/dock/visibilitymanager_p.h index 53923af14..3383e82da 100644 --- a/app/dock/visibilitymanager_p.h +++ b/app/dock/visibilitymanager_p.h @@ -82,6 +82,9 @@ public: void updateStrutsBasedOnLayoutsAndActivities(); + void requestMoveActiveWindow(int localX, int localY); + bool activeWindowCanBeDragged(); + void saveConfig(); void restoreConfig(); diff --git a/app/waylandinterface.cpp b/app/waylandinterface.cpp index 7b2336913..8bbc4b457 100644 --- a/app/waylandinterface.cpp +++ b/app/waylandinterface.cpp @@ -285,6 +285,8 @@ WindowInfoWrap WaylandInterface::requestInfoActive() const winfoWrap.setIsKeepAbove(w->isKeepAbove()); + winfoWrap.setHasSkipTaskbar(w->skipTaskbar()); + return winfoWrap; } @@ -346,6 +348,16 @@ WindowInfoWrap WaylandInterface::requestInfo(WindowId wid) const return winfoWrap; } +bool WaylandInterface::activeWindowCanBeDragged() const +{ + WindowInfoWrap activeInfo = requestInfoActive(); + return (activeInfo.isValid() && !activeInfo.isPlasmaDesktop() && !activeInfo.hasSkipTaskbar()); +} + +void WaylandInterface::requestMoveActiveWindow(QPoint from) const +{ + //to be supported +} inline bool WaylandInterface::isValidWindow(const KWayland::Client::PlasmaWindow *w) const { diff --git a/app/waylandinterface.h b/app/waylandinterface.h index a5d6b03ea..b751f1fa3 100644 --- a/app/waylandinterface.h +++ b/app/waylandinterface.h @@ -75,6 +75,9 @@ public: void slideWindow(QWindow &view, Slide location) const override; void enableBlurBehind(QWindow &view) const override; + void requestMoveActiveWindow(QPoint from) const override; + bool activeWindowCanBeDragged() const; + void setEdgeStateFor(QWindow *view, bool active) const override; void initWindowManagement(KWayland::Client::PlasmaWindowManagement *windowManagement); diff --git a/app/windowinfowrap.h b/app/windowinfowrap.h index e85812c08..38363987f 100644 --- a/app/windowinfowrap.h +++ b/app/windowinfowrap.h @@ -42,7 +42,8 @@ public: , m_isFullscreen(false) , m_isShaded(false) , m_isPlasmaDesktop(false) - , m_isKeepAbove(false) { + , m_isKeepAbove(false) + , m_hasSkipTaskbar(false) { } WindowInfoWrap(const WindowInfoWrap &o) noexcept @@ -56,7 +57,8 @@ public: , m_isFullscreen(o.m_isFullscreen) , m_isShaded(o.m_isShaded) , m_isPlasmaDesktop(o.m_isPlasmaDesktop) - , m_isKeepAbove(o.m_isKeepAbove) { + , m_isKeepAbove(o.m_isKeepAbove) + , m_hasSkipTaskbar(o.m_hasSkipTaskbar) { } WindowInfoWrap(WindowInfoWrap &&o) noexcept @@ -70,7 +72,8 @@ public: , m_isFullscreen(o.m_isFullscreen) , m_isShaded(o.m_isShaded) , m_isPlasmaDesktop(o.m_isPlasmaDesktop) - , m_isKeepAbove(o.m_isKeepAbove) { + , m_isKeepAbove(o.m_isKeepAbove) + , m_hasSkipTaskbar(o.m_hasSkipTaskbar) { } inline WindowInfoWrap &operator=(WindowInfoWrap &&rhs) noexcept; @@ -108,6 +111,9 @@ public: inline bool isKeepAbove() const noexcept; inline void setIsKeepAbove(bool isKeepAbove) noexcept; + inline bool hasSkipTaskbar() const noexcept; + inline void setHasSkipTaskbar(bool skipTaskbar) noexcept; + inline QRect geometry() const noexcept; inline void setGeometry(const QRect &geometry) noexcept; @@ -127,6 +133,7 @@ private: bool m_isShaded : 1; bool m_isPlasmaDesktop : 1; bool m_isKeepAbove: 1; + bool m_hasSkipTaskbar: 1; }; // BEGIN: definitions @@ -143,6 +150,7 @@ inline WindowInfoWrap &WindowInfoWrap::operator=(WindowInfoWrap &&rhs) noexcept m_isShaded = rhs.m_isShaded; m_isPlasmaDesktop = rhs.m_isPlasmaDesktop; m_isKeepAbove = rhs.m_isKeepAbove; + m_hasSkipTaskbar = rhs.m_hasSkipTaskbar; return *this; } @@ -159,6 +167,7 @@ inline WindowInfoWrap &WindowInfoWrap::operator=(const WindowInfoWrap &rhs) noex m_isShaded = rhs.m_isShaded; m_isPlasmaDesktop = rhs.m_isPlasmaDesktop; m_isKeepAbove = rhs.m_isKeepAbove; + m_hasSkipTaskbar = rhs.m_hasSkipTaskbar; return *this; } @@ -272,6 +281,16 @@ inline void WindowInfoWrap::setIsKeepAbove(bool isKeepAbove) noexcept m_isKeepAbove = isKeepAbove; } +inline bool WindowInfoWrap::hasSkipTaskbar() const noexcept +{ + return m_hasSkipTaskbar; +} + +inline void WindowInfoWrap::setHasSkipTaskbar(bool skipTaskbar) noexcept +{ + m_hasSkipTaskbar = skipTaskbar; +} + inline QRect WindowInfoWrap::geometry() const noexcept { return m_geometry; diff --git a/app/xwindowinterface.cpp b/app/xwindowinterface.cpp index 39bfcf0b3..25ca4c893 100644 --- a/app/xwindowinterface.cpp +++ b/app/xwindowinterface.cpp @@ -311,15 +311,49 @@ WindowInfoWrap XWindowInterface::requestInfo(WindowId wid) const winfoWrap.setIsShaded(winfo.hasState(NET::Shaded)); winfoWrap.setGeometry(winfo.frameGeometry()); winfoWrap.setIsKeepAbove(winfo.hasState(NET::KeepAbove)); + winfoWrap.setHasSkipTaskbar(winfo.hasState(NET::SkipTaskbar)); } else if (m_desktopId == wid) { winfoWrap.setIsValid(true); winfoWrap.setIsPlasmaDesktop(true); winfoWrap.setWid(wid); + winfoWrap.setHasSkipTaskbar(true); } return winfoWrap; } +bool XWindowInterface::activeWindowCanBeDragged() const +{ + WindowInfoWrap activeInfo = requestInfoActive(); + return (activeInfo.isValid() && !activeInfo.isPlasmaDesktop() && !activeInfo.hasSkipTaskbar()); +} + +void XWindowInterface::requestMoveActiveWindow(QPoint from) const +{ + WindowInfoWrap activeInfo = requestInfoActive(); + + if (!activeInfo.isValid() || activeInfo.isPlasmaDesktop()) { + return; + } + + int borderX{activeInfo.geometry().width() > 120 ? 60 : 10}; + int borderY{10}; + + //! find min/max values for x,y based on active window geometry + int minX = activeInfo.geometry().x() + borderX; + int maxX = activeInfo.geometry().x() + activeInfo.geometry().width() - borderX; + int minY = activeInfo.geometry().y() + borderY; + int maxY = activeInfo.geometry().y() + activeInfo.geometry().height() - borderY; + + //! set the point from which this window will be moved, + //! make sure that it is in window boundaries + int validX = qBound(minX, from.x(), maxX); + int validY = qBound(minY, from.y(), maxY); + + NETRootInfo ri(QX11Info::connection(), NET::WMMoveResize); + ri.moveResizeRequest(activeInfo.wid().toUInt(), validX, validY, NET::Move); +} + bool XWindowInterface::isValidWindow(const KWindowInfo &winfo) const { diff --git a/app/xwindowinterface.h b/app/xwindowinterface.h index 18eef551e..0af55e0fa 100644 --- a/app/xwindowinterface.h +++ b/app/xwindowinterface.h @@ -58,6 +58,9 @@ public: void slideWindow(QWindow &view, Slide location) const override; void enableBlurBehind(QWindow &view) const override; + void requestMoveActiveWindow(QPoint from) const override; + bool activeWindowCanBeDragged() const override; + void setEdgeStateFor(QWindow *view, bool active) const override; private: diff --git a/containment/package/contents/ui/main.qml b/containment/package/contents/ui/main.qml index b562fd726..48a0658c4 100644 --- a/containment/package/contents/ui/main.qml +++ b/containment/package/contents/ui/main.qml @@ -1641,7 +1641,9 @@ DragDrop.DropArea { } onPressed: { - drawWindowTimer.start(); + if (dock.visibility.activeWindowCanBeDragged()) { + drawWindowTimer.start(); + } } onDoubleClicked: { @@ -1654,10 +1656,10 @@ DragDrop.DropArea { id: drawWindowTimer interval: 350 onTriggered: { - if (rootMouseArea.pressed) { - dock.disableGrabItemBehavior(); - tasksModel.requestMove(tasksModel.activeTask); - restoreGrabberTimer.start(); + if (rootMouseArea.pressed && dock.visibility.activeWindowCanBeDragged()) { + dock.disableGrabItemBehavior(); + dock.visibility.requestMoveActiveWindow(rootMouseArea.mouseX, rootMouseArea.mouseY); + restoreGrabberTimer.start(); } } } @@ -1671,15 +1673,30 @@ DragDrop.DropArea { } } + ////////// Dragging windows etc.... TaskManager.TasksModel { id: tasksModel sortMode: TaskManager.TasksModel.SortVirtualDesktop groupMode: TaskManager.TasksModel.GroupDisabled + virtualDesktop: virtualDesktopInfo.currentDesktop + activity: activityInfo.currentActivity screenGeometry: plasmoid.screenGeometry - filterByScreen: plasmoid.configuration.showForCurrentScreenOnly + + filterByVirtualDesktop: true + filterByScreen: true + filterByActivity: true + } + TaskManager.VirtualDesktopInfo { + id: virtualDesktopInfo } + TaskManager.ActivityInfo { + id: activityInfo + } + + ////////// Dragging windows etc.... + Loader{ active: root.debugModeWindow sourceComponent: DebugWindow{}