From 6c2175ed525cbdc4bb263afbbcbf464ed091f4cd Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 24 Aug 2022 22:01:25 +0200 Subject: [PATCH] fixes to swapnext logic on dwindle --- src/Window.hpp | 3 +++ src/managers/KeybindManager.cpp | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Window.hpp b/src/Window.hpp index 21169796..0ee164dc 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -118,6 +118,9 @@ public: // For hidden windows and stuff bool m_bHidden = false; + // for proper cycling. While cycling we can't just move the pointers, so we need to keep track of the last cycled window. + CWindow* m_pLastCycledWindow = nullptr; + // Foreign Toplevel proto wlr_foreign_toplevel_handle_v1* m_phForeignToplevel = nullptr; diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index a4ddd809..e3799a7c 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -1448,12 +1448,24 @@ void CKeybindManager::swapnext(std::string arg) { const auto PLASTWINDOW = g_pCompositor->m_pLastWindow; + const auto PLASTCYCLED = g_pCompositor->windowValidMapped(g_pCompositor->m_pLastWindow->m_pLastCycledWindow) && g_pCompositor->m_pLastWindow->m_pLastCycledWindow->m_iWorkspaceID == PLASTWINDOW->m_iWorkspaceID ? g_pCompositor->m_pLastWindow->m_pLastCycledWindow : nullptr; + if (arg == "last" || arg == "l" || arg == "prev" || arg == "p") - toSwap = g_pCompositor->getPrevWindowOnWorkspace(PLASTWINDOW); + toSwap = g_pCompositor->getPrevWindowOnWorkspace(PLASTCYCLED ? PLASTCYCLED : PLASTWINDOW); else - toSwap = g_pCompositor->getNextWindowOnWorkspace(PLASTWINDOW); + toSwap = g_pCompositor->getNextWindowOnWorkspace(PLASTCYCLED ? PLASTCYCLED : PLASTWINDOW); + + // sometimes we may come back to ourselves. + if (toSwap == PLASTWINDOW) { + if (arg == "last" || arg == "l" || arg == "prev" || arg == "p") + toSwap = g_pCompositor->getPrevWindowOnWorkspace(PLASTWINDOW); + else + toSwap = g_pCompositor->getNextWindowOnWorkspace(PLASTWINDOW); + } g_pLayoutManager->getCurrentLayout()->switchWindows(PLASTWINDOW, toSwap); + PLASTWINDOW->m_pLastCycledWindow = toSwap; + g_pCompositor->focusWindow(PLASTWINDOW); }