diff options
-rw-r--r-- | src/layout/MasterLayout.cpp | 148 | ||||
-rw-r--r-- | src/layout/MasterLayout.hpp | 1 | ||||
-rw-r--r-- | src/managers/KeybindManager.cpp | 2 |
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(); } |