diff --git a/app/abstractwindowinterface.h b/app/abstractwindowinterface.h index 0eee40c67..640f4e06a 100644 --- a/app/abstractwindowinterface.h +++ b/app/abstractwindowinterface.h @@ -68,6 +68,7 @@ public: virtual WindowInfoWrap requestInfo(WindowId wid) const = 0; virtual WindowInfoWrap requestInfoActive() const = 0; virtual bool isOnCurrentDesktop(WindowId wid) const = 0; + virtual bool isOnCurrentActivity(WindowId wid) const = 0; virtual const std::list &windows() const = 0; virtual void skipTaskBar(const QDialog &dialog) const = 0; diff --git a/app/visibilitymanager.cpp b/app/visibilitymanager.cpp index dd67b8a4c..dbd7cd240 100644 --- a/app/visibilitymanager.cpp +++ b/app/visibilitymanager.cpp @@ -344,7 +344,7 @@ void VisibilityManagerPrivate::dodgeActive(WindowId wid) winfo = wm->requestInfo(wm->activeWindow()); } - if (wm->isOnCurrentDesktop(wid)) + if (wm->isOnCurrentDesktop(wid) && wm->isOnCurrentActivity(wid)) raiseDock(!intersects(winfo)); } @@ -367,15 +367,17 @@ void VisibilityManagerPrivate::dodgeMaximized(WindowId wid) auto isMaxVert = [&]() noexcept -> bool { return winfo.isMaxVert() - || (view->screen() && view->screen()->availableSize().height() <= winfo.geometry().height() && intersects(winfo)); + || (view->screen() && view->screen()->availableSize().height() <= winfo.geometry().height() + && intersects(winfo)); }; auto isMaxHoriz = [&]() noexcept -> bool { return winfo.isMaxHoriz() - || (view->screen() && view->screen()->availableSize().width() <= winfo.geometry().width() && intersects(winfo)); + || (view->screen() && view->screen()->availableSize().width() <= winfo.geometry().width() + && intersects(winfo)); }; - if (wm->isOnCurrentDesktop(wid) && !winfo.isMinimized() && intersects(winfo)) + if (wm->isOnCurrentDesktop(wid) && wm->isOnCurrentActivity(wid)) raiseDock(view->formFactor() == Plasma::Types::Vertical ? !isMaxHoriz() : !isMaxVert()); } @@ -391,7 +393,7 @@ void VisibilityManagerPrivate::dodgeWindows(WindowId wid) windows[wid] = wm->requestInfo(wid); auto &winfo = windows[wid]; - if (!winfo.isValid() || !wm->isOnCurrentDesktop(wid)) + if (!winfo.isValid() || !wm->isOnCurrentDesktop(wid) || !wm->isOnCurrentActivity(wid)) return; if (intersects(winfo)) @@ -409,7 +411,7 @@ void VisibilityManagerPrivate::checkAllWindows() for (const auto &winfo : windows) { // - if (!winfo.isValid() || !wm->isOnCurrentDesktop(winfo.wid())) + if (!winfo.isValid() || !wm->isOnCurrentDesktop(winfo.wid()) || !wm->isOnCurrentActivity(winfo.wid())) continue; if (winfo.isFullscreen()) { diff --git a/app/waylandinterface.h b/app/waylandinterface.h index 37a48d038..624875d28 100644 --- a/app/waylandinterface.h +++ b/app/waylandinterface.h @@ -55,6 +55,7 @@ public: WindowInfoWrap requestInfo(WindowId wid) const override; WindowInfoWrap requestInfoActive() const override; bool isOnCurrentDesktop(WindowId wid) const override; + bool isOnCurrentActivity(WindowId wid) const override; const std::list &windows() const override; void skipTaskBar(const QDialog &dialog) const override; diff --git a/app/xwindowinterface.cpp b/app/xwindowinterface.cpp index 2d4ef6de7..73cc6009a 100644 --- a/app/xwindowinterface.cpp +++ b/app/xwindowinterface.cpp @@ -204,6 +204,14 @@ bool XWindowInterface::isOnCurrentDesktop(WindowId wid) const return winfo.valid() && winfo.isOnCurrentDesktop(); } +bool XWindowInterface::isOnCurrentActivity(WindowId wid) const +{ + KWindowInfo winfo(wid.value(), 0, NET::WM2Activities); + + return winfo.valid() + && (winfo.activities().contains(m_activities->currentActivity()) || winfo.activities().empty()); +} + WindowInfoWrap XWindowInterface::requestInfo(WindowId wid) const { const KWindowInfo winfo{wid.value(), NET::WMFrameExtents diff --git a/app/xwindowinterface.h b/app/xwindowinterface.h index b1b5270f4..6557e9a3a 100644 --- a/app/xwindowinterface.h +++ b/app/xwindowinterface.h @@ -48,6 +48,7 @@ public: WindowInfoWrap requestInfo(WindowId wid) const override; WindowInfoWrap requestInfoActive() const override; bool isOnCurrentDesktop(WindowId wid) const override; + bool isOnCurrentActivity(WindowId wid) const override; const std::list &windows() const override; void skipTaskBar(const QDialog &dialog) const override;