From 51c11071dd13d54051df2ad933f24a87122d2dba Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Sun, 2 Jun 2019 01:57:03 +0300 Subject: [PATCH] support toggle onAllDesktops for LastActiveWindow --- app/wm/abstractwindowinterface.h | 1 + app/wm/tracker/lastactivewindow.cpp | 5 ++++ app/wm/tracker/lastactivewindow.h | 1 + app/wm/waylandinterface.cpp | 19 +++++++++++++++ app/wm/waylandinterface.h | 1 + app/wm/xwindowinterface.cpp | 38 +++++++++++++++-------------- app/wm/xwindowinterface.h | 1 + 7 files changed, 48 insertions(+), 18 deletions(-) diff --git a/app/wm/abstractwindowinterface.h b/app/wm/abstractwindowinterface.h index 1d5cf291c..f94e35036 100644 --- a/app/wm/abstractwindowinterface.h +++ b/app/wm/abstractwindowinterface.h @@ -105,6 +105,7 @@ public: virtual void requestActivate(WindowId wid) const = 0; virtual void requestClose(WindowId wid) const = 0; virtual void requestMoveWindow(WindowId wid, QPoint from) const = 0; + virtual void requestToggleIsOnAllDesktops(WindowId wid) const = 0; virtual void requestToggleKeepAbove(WindowId wid) const = 0; virtual void requestToggleMinimized(WindowId wid) const = 0; virtual void requestToggleMaximized(WindowId wid) const = 0; diff --git a/app/wm/tracker/lastactivewindow.cpp b/app/wm/tracker/lastactivewindow.cpp index 4b7652302..7f681cf55 100644 --- a/app/wm/tracker/lastactivewindow.cpp +++ b/app/wm/tracker/lastactivewindow.cpp @@ -296,6 +296,11 @@ void LastActiveWindow::requestMove(int localX, int localY) emit draggingStarted(); } +void LastActiveWindow::requestToggleIsOnAllDesktops() +{ + m_wm->requestToggleIsOnAllDesktops(m_winId); +} + void LastActiveWindow::requestToggleKeepAbove() { m_wm->requestToggleKeepAbove(m_winId); diff --git a/app/wm/tracker/lastactivewindow.h b/app/wm/tracker/lastactivewindow.h index 5a6bd46b1..ae882d01a 100644 --- a/app/wm/tracker/lastactivewindow.h +++ b/app/wm/tracker/lastactivewindow.h @@ -89,6 +89,7 @@ public slots: Q_INVOKABLE void requestActivate(); Q_INVOKABLE void requestClose(); Q_INVOKABLE void requestMove(int localX, int localY); + Q_INVOKABLE void requestToggleIsOnAllDesktops(); Q_INVOKABLE void requestToggleKeepAbove(); Q_INVOKABLE void requestToggleMinimized(); Q_INVOKABLE void requestToggleMaximized(); diff --git a/app/wm/waylandinterface.cpp b/app/wm/waylandinterface.cpp index 4c1f1553f..9a672da76 100644 --- a/app/wm/waylandinterface.cpp +++ b/app/wm/waylandinterface.cpp @@ -479,6 +479,25 @@ void WaylandInterface::requestMoveWindow(WindowId wid, QPoint from) const } } +void WaylandInterface::requestToggleIsOnAllDesktops(WindowId wid) const +{ +#if KF5_VERSION_MINOR >= 52 + auto w = windowFor(wid); + + if (w && isValidWindow(w) && m_desktops.count() > 1) { + if (w->isOnAllDesktops()) { + w->requestEnterVirtualDesktop(m_currentDesktop); + } else { + const QStringList &now = w->plasmaVirtualDesktops(); + + foreach (const QString &desktop, now) { + w->requestLeaveVirtualDesktop(desktop); + } + } + } +#endif +} + void WaylandInterface::requestToggleKeepAbove(WindowId wid) const { auto w = windowFor(wid); diff --git a/app/wm/waylandinterface.h b/app/wm/waylandinterface.h index 613be31a5..3cec9d1d1 100644 --- a/app/wm/waylandinterface.h +++ b/app/wm/waylandinterface.h @@ -83,6 +83,7 @@ public: void requestActivate(WindowId wid) const override; void requestClose(WindowId wid) const override; void requestMoveWindow(WindowId wid, QPoint from) const override; + void requestToggleIsOnAllDesktops(WindowId wid) const override; void requestToggleKeepAbove(WindowId wid) const override; void requestToggleMinimized(WindowId wid) const override; void requestToggleMaximized(WindowId wid) const override; diff --git a/app/wm/xwindowinterface.cpp b/app/wm/xwindowinterface.cpp index 1db893927..121d763c3 100644 --- a/app/wm/xwindowinterface.cpp +++ b/app/wm/xwindowinterface.cpp @@ -454,6 +454,26 @@ void XWindowInterface::requestMoveWindow(WindowId wid, QPoint from) const ri.moveResizeRequest(wInfo.wid().toUInt(), validX, validY, NET::Move); } +void XWindowInterface::requestToggleIsOnAllDesktops(WindowId wid) const +{ + WindowInfoWrap wInfo = requestInfo(wid); + + if (!wInfo.isValid() || wInfo.isPlasmaDesktop()) { + return; + } + + if (KWindowSystem::numberOfDesktops() <= 1) { + return; + } + + if (wInfo.isOnAllDesktops()) { + KWindowSystem::setOnDesktop(wid.toUInt(), KWindowSystem::currentDesktop()); + KWindowSystem::forceActiveWindow(wid.toUInt()); + } else { + KWindowSystem::setOnAllDesktops(wid.toUInt(), true); + } +} + void XWindowInterface::requestToggleKeepAbove(WindowId wid) const { WindowInfoWrap wInfo = requestInfo(wid); @@ -613,24 +633,6 @@ void XWindowInterface::windowChangedProxy(WId wid, NET::Properties prop1, NET::P return; } - //! when only WMState changed we can whitelist the acceptable states - if ((prop1 & NET::WMState) - && !(prop1 & NET::WMGeometry) - && !(prop1 & NET::ActiveWindow) - && !(prop1 & NET::WMDesktop) - && !(prop1 & (NET::WMName | NET::WMVisibleName)) ) { - KWindowInfo info(wid, NET::WMState); - - if (info.valid()) { - if ( !info.hasState(NET::KeepAbove) && !info.hasState(NET::Sticky) && !info.hasState(NET::Shaded) - && !info.hasState(NET::FullScreen) && !info.hasState(NET::Hidden)) { - return; - } - } else { - return; - } - } - //! ignore windows that do not respect normal windows types if (!isValidWindow(wid)) { return; diff --git a/app/wm/xwindowinterface.h b/app/wm/xwindowinterface.h index 94f02b063..fe2471fae 100644 --- a/app/wm/xwindowinterface.h +++ b/app/wm/xwindowinterface.h @@ -67,6 +67,7 @@ public: void requestActivate(WindowId wid) const override; void requestClose(WindowId wid) const override; void requestMoveWindow(WindowId wid, QPoint from) const override; + void requestToggleIsOnAllDesktops(WindowId wid) const override; void requestToggleKeepAbove(WindowId wid) const override; void requestToggleMinimized(WindowId wid) const override; void requestToggleMaximized(WindowId wid) const override;