From 128dfe09fdcf2dcda94462a87f5bc2330e6d5ca9 Mon Sep 17 00:00:00 2001 From: Yuki Joou Date: Wed, 11 Sep 2024 23:52:42 +0200 Subject: [PATCH] VirtualDesktops: POC per-output desktops --- src/virtualdesktops.cpp | 47 ++++++++++++++++++++++++++++++++++++++++- src/virtualdesktops.h | 7 ++++++ src/window.cpp | 4 +++- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/virtualdesktops.cpp b/src/virtualdesktops.cpp index a0a09040d4..146afb94ba 100644 --- a/src/virtualdesktops.cpp +++ b/src/virtualdesktops.cpp @@ -10,6 +10,7 @@ #include "virtualdesktops.h" #include "input.h" #include "wayland/plasmavirtualdesktop.h" +#include "workspace.h" // KDE #include #include @@ -519,6 +520,15 @@ VirtualDesktop *VirtualDesktopManager::currentDesktop() const return m_current; } +VirtualDesktop *VirtualDesktopManager::currentDesktop(Output *output) const +{ + if (!m_currentForOutput.contains(output)) { + qInfo("Output not in list :/"); + return m_current; + } + return m_currentForOutput[output]; +} + bool VirtualDesktopManager::setCurrent(uint newDesktop) { if (newDesktop < 1 || newDesktop > count()) { @@ -538,6 +548,33 @@ bool VirtualDesktopManager::setCurrent(VirtualDesktop *newDesktop) VirtualDesktop *oldDesktop = currentDesktop(); m_current = newDesktop; Q_EMIT currentChanged(oldDesktop, newDesktop); + for (auto *output : Workspace::self()->outputs()) { + m_currentForOutput[output] = m_current; + } + return true; +} + +bool VirtualDesktopManager::setCurrentForOutput(uint newDesktop, Output *targetOutput) +{ + if (newDesktop < 1 || newDesktop > count()) { + return false; + } + auto d = desktopForX11Id(newDesktop); + Q_ASSERT(d); + return setCurrentForOutput(d, targetOutput); +} + +bool VirtualDesktopManager::setCurrentForOutput(VirtualDesktop *newDesktop, Output *targetOutput) +{ + Q_ASSERT(newDesktop); + Q_ASSERT(targetOutput); + Q_ASSERT(m_currentForOutput.contains(targetOutput)); + if (m_currentForOutput[targetOutput] == newDesktop) { + return false; + } + VirtualDesktop *oldDesktop = m_currentForOutput[targetOutput]; + m_currentForOutput[targetOutput] = newDesktop; + Q_EMIT currentChanged(oldDesktop, newDesktop); return true; } @@ -594,6 +631,12 @@ void VirtualDesktopManager::setCount(uint count) updateLayout(); updateRootInfo(); + // TODO: Figure out a better place + qInfo("setCount()"); + for (Output *output : Workspace::self()->outputs()) { + m_currentForOutput[output] = m_current; + } + if (!s_loadingDesktopSettings) { save(); } @@ -883,7 +926,9 @@ void VirtualDesktopManager::slotSwitchTo() if (!ok) { return; } - setCurrent(i); + qInfo("Active output: %p", Workspace::self()->activeOutput()); + qInfo("Setting to desktop %d on output %p", i, Workspace::self()->activeOutput()); + setCurrentForOutput(i, Workspace::self()->activeOutput()); } void VirtualDesktopManager::setNavigationWrappingAround(bool enabled) diff --git a/src/virtualdesktops.h b/src/virtualdesktops.h index 04fd4356ca..3985091dad 100644 --- a/src/virtualdesktops.h +++ b/src/virtualdesktops.h @@ -30,6 +30,7 @@ namespace KWin class Options; class PlasmaVirtualDesktopManagementInterface; +class Output; class KWIN_EXPORT VirtualDesktop : public QObject { @@ -197,6 +198,8 @@ public: */ VirtualDesktop *currentDesktop() const; + VirtualDesktop *currentDesktop(Output *output) const; + /** * Moves to the desktop through the algorithm described by Direction. * @param wrap If @c true wraps around to the other side of the layout @@ -352,6 +355,9 @@ public Q_SLOTS: */ bool setCurrent(VirtualDesktop *current); + bool setCurrentForOutput(VirtualDesktop *current, Output *output); + bool setCurrentForOutput(uint current, Output *output); + /** * Updates the layout to a new number of rows. The number of columns will be calculated accordingly */ @@ -515,6 +521,7 @@ private: QList m_desktops; QPointer m_current; + QHash> m_currentForOutput; quint32 m_rows = 2; bool m_navigationWrapsAround; VirtualDesktopGrid m_grid; diff --git a/src/window.cpp b/src/window.cpp index 4ca69f9b77..21557d90e2 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -834,7 +834,9 @@ bool Window::isOnDesktop(VirtualDesktop *desktop) const bool Window::isOnCurrentDesktop() const { - return isOnDesktop(VirtualDesktopManager::self()->currentDesktop()); + bool is = isOnDesktop(VirtualDesktopManager::self()->currentDesktop(output())); + qInfo("isOnDesktop %d", is); + return isOnDesktop(VirtualDesktopManager::self()->currentDesktop(output())); } ShadeMode Window::shadeMode() const