From d312598f60efd8667b9a58b7decd783555d64d64 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Mon, 10 Jun 2019 17:30:25 +0300 Subject: [PATCH] provide builtin Activity,VDs switching --this way we will avoid also the crash on wayland produced by the deprecated PagerModel --- app/wm/abstractwindowinterface.cpp | 42 +++++++++++++++++++++++++++- app/wm/abstractwindowinterface.h | 6 ++++ app/wm/waylandinterface.cpp | 44 ++++++++++++++++++++++++++++++ app/wm/waylandinterface.h | 3 ++ app/wm/xwindowinterface.cpp | 34 +++++++++++++++++++++++ app/wm/xwindowinterface.h | 3 ++ 6 files changed, 131 insertions(+), 1 deletion(-) diff --git a/app/wm/abstractwindowinterface.cpp b/app/wm/abstractwindowinterface.cpp index 39bd5fefa..86180ceb5 100644 --- a/app/wm/abstractwindowinterface.cpp +++ b/app/wm/abstractwindowinterface.cpp @@ -25,6 +25,8 @@ #include "tracker/trackerwindows.h" #include "../lattecorona.h" +// KDE +#include namespace Latte { namespace WindowSystem { @@ -94,6 +96,44 @@ Tracker::Windows *AbstractWindowInterface::windowsTracker() const return m_windowsTracker; } +//! Activities switching +void AbstractWindowInterface::switchToNextActivity() +{ + QStringList runningActivities = m_activities->activities(KActivities::Info::State::Running); + if (runningActivities.count() <= 1) { + return; + } + + int curPos = runningActivities.indexOf(m_currentActivity); + int nextPos = curPos + 1; + + if (curPos == runningActivities.count() -1) { + nextPos = 0; + } + + KActivities::Controller activitiesController; + activitiesController.setCurrentActivity(runningActivities.at(nextPos)); +} + +void AbstractWindowInterface::switchToPreviousActivity() +{ + QStringList runningActivities = m_activities->activities(KActivities::Info::State::Running); + if (runningActivities.count() <= 1) { + return; + } + + int curPos = runningActivities.indexOf(m_currentActivity); + int nextPos = curPos - 1; + + if (curPos == 0) { + nextPos = runningActivities.count() - 1; + } + + KActivities::Controller activitiesController; + activitiesController.setCurrentActivity(runningActivities.at(nextPos)); +} + +//! Delay window changed trigerring void AbstractWindowInterface::considerWindowChanged(WindowId wid) { //! Consider if the windowChanged signal should be sent DIRECTLY or WAIT @@ -113,7 +153,7 @@ void AbstractWindowInterface::considerWindowChanged(WindowId wid) if (m_windowChangedWaiting != wid && m_windowWaitingTimer.isActive()) { m_windowWaitingTimer.stop(); //! sent previous waiting window - emit (m_windowChangedWaiting); + emit windowChanged(m_windowChangedWaiting); //! retrigger waiting for the upcoming window m_windowChangedWaiting = wid; diff --git a/app/wm/abstractwindowinterface.h b/app/wm/abstractwindowinterface.h index fbd4bb049..5880de436 100644 --- a/app/wm/abstractwindowinterface.h +++ b/app/wm/abstractwindowinterface.h @@ -117,6 +117,12 @@ public: QString currentDesktop() const; QString currentActivity() const; + void switchToNextActivity(); + void switchToPreviousActivity(); + + virtual void switchToNextVirtualDesktop() const = 0; + virtual void switchToPreviousVirtualDesktop() const = 0; + Latte::Corona *corona(); Tracker::Schemes *schemesTracker(); Tracker::Windows *windowsTracker() const; diff --git a/app/wm/waylandinterface.cpp b/app/wm/waylandinterface.cpp index 9b7a9d5ad..ee47ea83e 100644 --- a/app/wm/waylandinterface.cpp +++ b/app/wm/waylandinterface.cpp @@ -224,6 +224,50 @@ void WaylandInterface::setViewStruts(QWindow &view, const QRect &rect, Plasma::T } +void WaylandInterface::switchToNextVirtualDesktop() const +{ +#if KF5_VERSION_MINOR >= 52 + if (!m_virtualDesktopManagement || m_desktops.count() <= 1) { + return; + } + + int curPos = m_desktops.indexOf(m_currentDesktop); + int nextPos = curPos + 1; + + if (curPos == m_desktops.count()-1) { + nextPos = 0; + } + + KWayland::Client::PlasmaVirtualDesktop *desktopObj = m_virtualDesktopManagement->getVirtualDesktop(m_desktops[nextPos]); + + if (desktopObj) { + desktopObj->requestActivate(); + } +#endif +} + +void WaylandInterface::switchToPreviousVirtualDesktop() const +{ +#if KF5_VERSION_MINOR >= 52 + if (!m_virtualDesktopManagement || m_desktops.count() <= 1) { + return; + } + + int curPos = m_desktops.indexOf(m_currentDesktop); + int nextPos = curPos - 1; + + if (curPos == 0) { + nextPos = m_desktops.count()-1; + } + + KWayland::Client::PlasmaVirtualDesktop *desktopObj = m_virtualDesktopManagement->getVirtualDesktop(m_desktops[nextPos]); + + if (desktopObj) { + desktopObj->requestActivate(); + } +#endif +} + void WaylandInterface::setWindowOnActivities(QWindow &window, const QStringList &activities) { //! needs to updated to wayland case diff --git a/app/wm/waylandinterface.h b/app/wm/waylandinterface.h index bea8e5e54..0e7a82765 100644 --- a/app/wm/waylandinterface.h +++ b/app/wm/waylandinterface.h @@ -94,6 +94,9 @@ public: void setEdgeStateFor(QWindow *view, bool active) const override; + void switchToNextVirtualDesktop() const override; + void switchToPreviousVirtualDesktop() const override; + void initWindowManagement(KWayland::Client::PlasmaWindowManagement *windowManagement); #if KF5_VERSION_MINOR >= 52 diff --git a/app/wm/xwindowinterface.cpp b/app/wm/xwindowinterface.cpp index 2497b6d16..7c31ee2ee 100644 --- a/app/wm/xwindowinterface.cpp +++ b/app/wm/xwindowinterface.cpp @@ -142,6 +142,40 @@ void XWindowInterface::setViewStruts(QWindow &view, const QRect &rect ); } +void XWindowInterface::switchToNextVirtualDesktop() const +{ + int desktops = KWindowSystem::numberOfDesktops(); + if (desktops <= 1) { + return; + } + + int curPos = KWindowSystem::currentDesktop(); + int nextPos = curPos + 1; + + if (curPos == desktops -1) { + nextPos = 0; + } + + KWindowSystem::setCurrentDesktop(nextPos); +} + +void XWindowInterface::switchToPreviousVirtualDesktop() const +{ + int desktops = KWindowSystem::numberOfDesktops(); + if (desktops <= 1) { + return; + } + + int curPos = KWindowSystem::currentDesktop(); + int nextPos = curPos - 1; + + if (curPos == 0) { + nextPos = desktops - 1; + } + + KWindowSystem::setCurrentDesktop(nextPos); +} + void XWindowInterface::setWindowOnActivities(QWindow &window, const QStringList &activities) { KWindowSystem::setOnActivities(window.winId(), activities); diff --git a/app/wm/xwindowinterface.h b/app/wm/xwindowinterface.h index 023399432..4ad3e6b9c 100644 --- a/app/wm/xwindowinterface.h +++ b/app/wm/xwindowinterface.h @@ -78,6 +78,9 @@ public: void setEdgeStateFor(QWindow *view, bool active) const override; + void switchToNextVirtualDesktop() const override; + void switchToPreviousVirtualDesktop() const override; + private: bool hasScreenGeometry(const KWindowInfo &winfo) const; bool isValidWindow(WindowId wid) const;