summaryrefslogtreecommitdiff
path: root/src/layout/MasterLayout.cpp
diff options
context:
space:
mode:
authorthejch <66577496+thejch@users.noreply.github.com>2023-12-22 03:37:38 -0800
committerGitHub <noreply@github.com>2023-12-22 12:37:38 +0100
commit7cec618fe47e457fe66ef772da00ef07665a8607 (patch)
tree4cec17bdf483dd232a4f0755d97ccb21dbdbe05a /src/layout/MasterLayout.cpp
parentbd952dcef2ead3b0b7e2d730930a3fc528813ee0 (diff)
master: add dispatchers rollnext and rollprev (#4209)
Diffstat (limited to 'src/layout/MasterLayout.cpp')
-rw-r--r--src/layout/MasterLayout.cpp44
1 files changed, 44 insertions, 0 deletions
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;