From 58c7093be9845ec0804b67149060efdec47aa73d Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Tue, 28 Sep 2021 22:03:20 +0300 Subject: [PATCH] fix #85,respect kwin vds navigation wrapping around --respect and track KWin option for Virtual Desktops navigation wrapping around setting --- app/wm/abstractwindowinterface.cpp | 59 +++++++++++++++++++++++++++++- app/wm/abstractwindowinterface.h | 11 ++++++ app/wm/waylandinterface.cpp | 16 ++++++-- app/wm/xwindowinterface.cpp | 12 +++++- 4 files changed, 91 insertions(+), 7 deletions(-) diff --git a/app/wm/abstractwindowinterface.cpp b/app/wm/abstractwindowinterface.cpp index bae106f03..202cf9aff 100644 --- a/app/wm/abstractwindowinterface.cpp +++ b/app/wm/abstractwindowinterface.cpp @@ -14,6 +14,7 @@ // Qt #include +#include // KDE #include @@ -24,8 +25,12 @@ namespace WindowSystem { #define MAXPLASMAPANELTHICKNESS 96 #define MAXSIDEPANELTHICKNESS 512 +#define KWINSERVICE "org.kde.KWin" +#define KWINVIRTUALDESKTOPMANAGERNAMESPACE "org.kde.KWin.VirtualDesktopManager" + AbstractWindowInterface::AbstractWindowInterface(QObject *parent) - : QObject(parent) + : QObject(parent), + m_kwinServiceWatcher(new QDBusServiceWatcher(this)) { m_activities = new KActivities::Consumer(this); m_currentActivity = m_activities->currentActivity(); @@ -56,6 +61,22 @@ AbstractWindowInterface::AbstractWindowInterface(QObject *parent) emit currentActivityChanged(); }); + //! KWin Service tracking + m_kwinServiceWatcher->setConnection(QDBusConnection::sessionBus()); + m_kwinServiceWatcher->setWatchedServices(QStringList({KWINSERVICE})); + connect(m_kwinServiceWatcher, &QDBusServiceWatcher::serviceRegistered, this, [this](const QString & serviceName) { + if (serviceName == KWINSERVICE && !m_isKWinInterfaceAvailable) { + initKWinInterface(); + } + }); + + connect(m_kwinServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, [this](const QString & serviceName) { + if (serviceName == KWINSERVICE && m_isKWinInterfaceAvailable) { + m_isKWinInterfaceAvailable = false; + } + }); + + initKWinInterface(); } AbstractWindowInterface::~AbstractWindowInterface() @@ -187,6 +208,42 @@ bool AbstractWindowInterface::inCurrentDesktopActivity(const WindowInfoWrap &win return (winfo.isValid() && winfo.isOnDesktop(currentDesktop()) && winfo.isOnActivity(currentActivity())); } +//! KWin Interface +void AbstractWindowInterface::initKWinInterface() +{ + QDBusInterface kwinIface(KWINSERVICE, "/VirtualDesktopManager", KWINVIRTUALDESKTOPMANAGERNAMESPACE, QDBusConnection::sessionBus()); + + if (kwinIface.isValid() && !m_isKWinInterfaceAvailable) { + m_isKWinInterfaceAvailable = true; + qDebug() << " KWIN SERVICE :: is available..."; + + QDBusReply navWrapAround = kwinIface.call("navigationWrappingAround"); + m_isVirtualDesktopNavigationWrappingAround = navWrapAround.value(); + + QDBusConnection bus = QDBusConnection::sessionBus(); + bool signalconnected = bus.connect(KWINSERVICE, + "/VirtualDesktopManager", + KWINVIRTUALDESKTOPMANAGERNAMESPACE, + "navigationWrappingAroundChanged", + this, + SLOT(onVirtualDesktopNavigationWrappingAroundChanged(bool))); + + if (!signalconnected) { + qDebug() << " KWIN SERVICE :: Virtual Desktop Manager :: navigationsWrappingSignal is not connected..."; + } + } +} + +bool AbstractWindowInterface::isVirtualDesktopNavigationWrappingAround() const +{ + return m_isVirtualDesktopNavigationWrappingAround; +} + +void AbstractWindowInterface::onVirtualDesktopNavigationWrappingAroundChanged(bool navigationWrappingAround) +{ + m_isVirtualDesktopNavigationWrappingAround = navigationWrappingAround; +} + //! Register Latte Ignored Windows in order to NOT be tracked void AbstractWindowInterface::registerIgnoredWindow(WindowId wid) { diff --git a/app/wm/abstractwindowinterface.h b/app/wm/abstractwindowinterface.h index de4492de3..16a1d4dfe 100644 --- a/app/wm/abstractwindowinterface.h +++ b/app/wm/abstractwindowinterface.h @@ -21,6 +21,7 @@ // Qt #include #include +#include #include #include #include @@ -174,13 +175,23 @@ protected: bool isPlasmaPanel(const QRect &wGeometry) const; bool isSidepanel(const QRect &wGeometry) const; + bool isVirtualDesktopNavigationWrappingAround() const; + private slots: + void initKWinInterface(); void windowRemovedSlot(WindowId wid); + void onVirtualDesktopNavigationWrappingAroundChanged(bool navigationWrappingAround); + private: + bool m_isKWinInterfaceAvailable{false}; + bool m_isVirtualDesktopNavigationWrappingAround{true}; + Latte::Corona *m_corona; Tracker::Schemes *m_schemesTracker; Tracker::Windows *m_windowsTracker; + + QDBusServiceWatcher *m_kwinServiceWatcher{nullptr}; }; } diff --git a/app/wm/waylandinterface.cpp b/app/wm/waylandinterface.cpp index 20758fc76..81f0db598 100644 --- a/app/wm/waylandinterface.cpp +++ b/app/wm/waylandinterface.cpp @@ -328,8 +328,12 @@ void WaylandInterface::switchToNextVirtualDesktop() int curPos = m_desktops.indexOf(m_currentDesktop); int nextPos = curPos + 1; - if (curPos == m_desktops.count()-1) { - nextPos = 0; + if (curPos >= m_desktops.count()-1) { + if (isVirtualDesktopNavigationWrappingAround()) { + nextPos = 0; + } else { + return; + } } KWayland::Client::PlasmaVirtualDesktop *desktopObj = m_virtualDesktopManagement->getVirtualDesktop(m_desktops[nextPos]); @@ -350,8 +354,12 @@ void WaylandInterface::switchToPreviousVirtualDesktop() int curPos = m_desktops.indexOf(m_currentDesktop); int nextPos = curPos - 1; - if (curPos == 0) { - nextPos = m_desktops.count()-1; + if (curPos <= 0) { + if (isVirtualDesktopNavigationWrappingAround()) { + nextPos = m_desktops.count()-1; + } else { + return; + } } KWayland::Client::PlasmaVirtualDesktop *desktopObj = m_virtualDesktopManagement->getVirtualDesktop(m_desktops[nextPos]); diff --git a/app/wm/xwindowinterface.cpp b/app/wm/xwindowinterface.cpp index 32676cd7f..3aeda6817 100644 --- a/app/wm/xwindowinterface.cpp +++ b/app/wm/xwindowinterface.cpp @@ -180,7 +180,11 @@ void XWindowInterface::switchToNextVirtualDesktop() int nextPos = curPos + 1; if (curPos == desktops) { - nextPos = 1; + if (isVirtualDesktopNavigationWrappingAround()) { + nextPos = 1; + } else { + return; + } } KWindowSystem::setCurrentDesktop(nextPos); @@ -197,7 +201,11 @@ void XWindowInterface::switchToPreviousVirtualDesktop() int nextPos = curPos - 1; if (curPos == 1) { - nextPos = desktops; + if (isVirtualDesktopNavigationWrappingAround()) { + nextPos = desktops; + } else { + return; + } } KWindowSystem::setCurrentDesktop(nextPos);