aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/layout/MasterLayout.cpp148
-rw-r--r--src/layout/MasterLayout.hpp1
-rw-r--r--src/managers/KeybindManager.cpp2
3 files changed, 92 insertions, 59 deletions
diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp
index f8ee4b78..9c143a13 100644
--- a/src/layout/MasterLayout.cpp
+++ b/src/layout/MasterLayout.cpp
@@ -452,44 +452,18 @@ void CHyprMasterLayout::alterSplitRatioBy(CWindow* pWindow, float ratio) {
recalculateMonitor(pWindow->m_iMonitorID);
}
-std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::string message) {
- auto switchToWindow = [&](CWindow* PWINDOWTOCHANGETO) {
- g_pCompositor->focusWindow(PWINDOWTOCHANGETO);
- Vector2D middle = PWINDOWTOCHANGETO->m_vRealPosition.goalv() + PWINDOWTOCHANGETO->m_vRealSize.goalv() / 2.f;
- wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, middle.x, middle.y);
- };
+CWindow* CHyprMasterLayout::getNextWindow(CWindow* pWindow, bool next) {
+ if (!isWindowTiled(pWindow))
+ return nullptr;
- if (message == "swapwithmaster") {
-
- const auto PWINDOW = header.pWindow;
-
- if (!isWindowTiled(PWINDOW))
- return 0;
-
- const auto PMASTER = getMasterNodeOnWorkspace(PWINDOW->m_iWorkspaceID);
-
- if (!PMASTER || PMASTER->pWindow == PWINDOW)
- return 0;
-
- switchWindows(PWINDOW, PMASTER->pWindow);
-
- switchToWindow(PWINDOW);
-
- return 0;
- } else if (message == "cyclenext") {
- const auto PWINDOW = header.pWindow;
-
- if (!isWindowTiled(PWINDOW))
- return 0;
-
- const auto PNODE = getNodeFromWindow(PWINDOW);
+ const auto PNODE = getNodeFromWindow(pWindow);
+ if (next) {
if (PNODE->isMaster) {
// focus the first non master
for (auto n : m_lMasterNodesData) {
- if (n.pWindow != PWINDOW && n.workspaceID == PWINDOW->m_iWorkspaceID) {
- switchToWindow(n.pWindow);
- break;
+ if (n.pWindow != pWindow && n.workspaceID == pWindow->m_iWorkspaceID) {
+ return n.pWindow;
}
}
} else {
@@ -497,38 +471,28 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
bool reached = false;
bool found = false;
for (auto n : m_lMasterNodesData) {
- if (n.pWindow == PWINDOW) {
+ if (n.pWindow == pWindow) {
reached = true;
continue;
}
- if (n.workspaceID == PWINDOW->m_iWorkspaceID && reached) {
- switchToWindow(n.pWindow);
- found = true;
- break;
+ if (n.workspaceID == pWindow->m_iWorkspaceID && reached) {
+ return n.pWindow;
}
}
if (!found) {
- const auto PMASTER = getMasterNodeOnWorkspace(PWINDOW->m_iWorkspaceID);
+ const auto PMASTER = getMasterNodeOnWorkspace(pWindow->m_iWorkspaceID);
if (PMASTER)
- switchToWindow(PMASTER->pWindow);
+ return PMASTER->pWindow;
}
}
- } else if (message == "cycleprev") {
- const auto PWINDOW = header.pWindow;
-
- if (!isWindowTiled(PWINDOW))
- return 0;
-
- const auto PNODE = getNodeFromWindow(PWINDOW);
-
+ } else {
if (PNODE->isMaster) {
// focus the first non master
for (auto it = m_lMasterNodesData.rbegin(); it != m_lMasterNodesData.rend(); it++) {
- if (it->pWindow != PWINDOW && it->workspaceID == PWINDOW->m_iWorkspaceID) {
- switchToWindow(it->pWindow);
- break;
+ if (it->pWindow != pWindow && it->workspaceID == pWindow->m_iWorkspaceID) {
+ return it->pWindow;
}
}
} else {
@@ -536,26 +500,94 @@ std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::stri
bool reached = false;
bool found = false;
for (auto it = m_lMasterNodesData.rbegin(); it != m_lMasterNodesData.rend(); it++) {
- if (it->pWindow == PWINDOW) {
+ if (it->pWindow == pWindow) {
reached = true;
continue;
}
- if (it->workspaceID == PWINDOW->m_iWorkspaceID && reached) {
- switchToWindow(it->pWindow);
- found = true;
- break;
+ if (it->workspaceID == pWindow->m_iWorkspaceID && reached) {
+ return it->pWindow;
}
}
if (!found) {
- const auto PMASTER = getMasterNodeOnWorkspace(PWINDOW->m_iWorkspaceID);
+ const auto PMASTER = getMasterNodeOnWorkspace(pWindow->m_iWorkspaceID);
if (PMASTER)
- switchToWindow(PMASTER->pWindow);
+ return PMASTER->pWindow;
}
}
}
+ return nullptr;
+}
+
+std::any CHyprMasterLayout::layoutMessage(SLayoutMessageHeader header, std::string message) {
+ auto switchToWindow = [&](CWindow* PWINDOWTOCHANGETO) {
+ if (!g_pCompositor->windowValidMapped(PWINDOWTOCHANGETO))
+ return;
+
+ g_pCompositor->focusWindow(PWINDOWTOCHANGETO);
+ Vector2D middle = PWINDOWTOCHANGETO->m_vRealPosition.goalv() + PWINDOWTOCHANGETO->m_vRealSize.goalv() / 2.f;
+ wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, middle.x, middle.y);
+ };
+
+ if (message == "swapwithmaster") {
+
+ const auto PWINDOW = header.pWindow;
+
+ if (!isWindowTiled(PWINDOW))
+ return 0;
+
+ const auto PMASTER = getMasterNodeOnWorkspace(PWINDOW->m_iWorkspaceID);
+
+ if (!PMASTER || PMASTER->pWindow == PWINDOW)
+ return 0;
+
+ switchWindows(PWINDOW, PMASTER->pWindow);
+
+ switchToWindow(PWINDOW);
+
+ return 0;
+ } else if (message == "cyclenext") {
+ const auto PWINDOW = header.pWindow;
+
+ switchToWindow(getNextWindow(PWINDOW, true));
+ } else if (message == "cycleprev") {
+ const auto PWINDOW = header.pWindow;
+
+ switchToWindow(getNextWindow(PWINDOW, false));
+ } else if (message == "swapnext") {
+ if (!g_pCompositor->windowValidMapped(header.pWindow))
+ return 0;
+
+ if (header.pWindow->m_bIsFloating) {
+ g_pKeybindManager->m_mDispatchers["swapnext"]("");
+ return 0;
+ }
+
+ const auto PWINDOWTOSWAPWITH = getNextWindow(header.pWindow, true);
+
+ if (PWINDOWTOSWAPWITH) {
+ switchWindows(header.pWindow, PWINDOWTOSWAPWITH);
+ g_pCompositor->focusWindow(header.pWindow);
+ }
+ } else if (message == "swapprev") {
+ if (!g_pCompositor->windowValidMapped(header.pWindow))
+ return 0;
+
+ if (header.pWindow->m_bIsFloating) {
+ g_pKeybindManager->m_mDispatchers["swapnext"]("prev");
+ return 0;
+ }
+
+ const auto PWINDOWTOSWAPWITH = getNextWindow(header.pWindow, false);
+
+ if (PWINDOWTOSWAPWITH) {
+ switchWindows(header.pWindow, PWINDOWTOSWAPWITH);
+ g_pCompositor->focusWindow(header.pWindow);
+ }
+ }
+
return 0;
}
diff --git a/src/layout/MasterLayout.hpp b/src/layout/MasterLayout.hpp
index f7f40ea4..73a2c362 100644
--- a/src/layout/MasterLayout.hpp
+++ b/src/layout/MasterLayout.hpp
@@ -51,6 +51,7 @@ private:
SMasterNodeData* getNodeFromWindow(CWindow*);
SMasterNodeData* getMasterNodeOnWorkspace(const int&);
void calculateWorkspace(const int&);
+ CWindow* getNextWindow(CWindow*, bool);
friend struct SMasterNodeData;
}; \ No newline at end of file
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 75660304..a4ddd809 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -39,7 +39,7 @@ CKeybindManager::CKeybindManager() {
m_mDispatchers["dpms"] = dpms;
m_mDispatchers["movewindowpixel"] = moveWindow;
m_mDispatchers["resizewindowpixel"] = resizeWindow;
- m_mDispatchers["swapnext"] = swapNext;
+ m_mDispatchers["swapnext"] = swapnext;
m_tScrollTimer.reset();
}