From 7cec618fe47e457fe66ef772da00ef07665a8607 Mon Sep 17 00:00:00 2001 From: thejch <66577496+thejch@users.noreply.github.com> Date: Fri, 22 Dec 2023 03:37:38 -0800 Subject: [PATCH] master: add dispatchers rollnext and rollprev (#4209) --- src/layout/MasterLayout.cpp | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp index 086bcdac..def03236 100644 --- a/src/layout/MasterLayout.cpp +++ b/src/layout/MasterLayout.cpp @@ -1332,6 +1332,50 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri nd.percMaster = std::clamp(newMfact, 0.05f, 0.95f); } } + } else if (command == "rollnext") { + const auto PWINDOW = header.pWindow; + const auto PNODE = getNodeFromWindow(PWINDOW); + + const auto OLDMASTER = PNODE->isMaster ? PNODE : getMasterNodeOnWorkspace(PNODE->workspaceID); + const auto OLDMASTERIT = std::find(m_lMasterNodesData.begin(), m_lMasterNodesData.end(), *OLDMASTER); + + for (auto& nd : m_lMasterNodesData) { + if (nd.workspaceID == PNODE->workspaceID && !nd.isMaster) { + nd.isMaster = true; + const auto NEWMASTERIT = std::find(m_lMasterNodesData.begin(), m_lMasterNodesData.end(), nd); + m_lMasterNodesData.splice(OLDMASTERIT, m_lMasterNodesData, NEWMASTERIT); + const bool inheritFullscreen = prepareLoseFocus(PWINDOW); + switchToWindow(nd.pWindow); + prepareNewFocus(nd.pWindow, inheritFullscreen); + OLDMASTER->isMaster = false; + m_lMasterNodesData.splice(m_lMasterNodesData.end(), m_lMasterNodesData, OLDMASTERIT); + break; + } + } + + recalculateMonitor(PWINDOW->m_iMonitorID); + } else if (command == "rollprev") { + const auto PWINDOW = header.pWindow; + const auto PNODE = getNodeFromWindow(PWINDOW); + + const auto OLDMASTER = PNODE->isMaster ? PNODE : getMasterNodeOnWorkspace(PNODE->workspaceID); + const auto OLDMASTERIT = std::find(m_lMasterNodesData.begin(), m_lMasterNodesData.end(), *OLDMASTER); + + for (auto& nd : m_lMasterNodesData | std::views::reverse) { + if (nd.workspaceID == PNODE->workspaceID && !nd.isMaster) { + nd.isMaster = true; + const auto NEWMASTERIT = std::find(m_lMasterNodesData.begin(), m_lMasterNodesData.end(), nd); + m_lMasterNodesData.splice(OLDMASTERIT, m_lMasterNodesData, NEWMASTERIT); + const bool inheritFullscreen = prepareLoseFocus(PWINDOW); + switchToWindow(nd.pWindow); + prepareNewFocus(nd.pWindow, inheritFullscreen); + OLDMASTER->isMaster = false; + m_lMasterNodesData.splice(m_lMasterNodesData.begin(), m_lMasterNodesData, OLDMASTERIT); + break; + } + } + + recalculateMonitor(PWINDOW->m_iMonitorID); } return 0;