From d5950f7719d3c9ec5305208265366df5ce81b6c3 Mon Sep 17 00:00:00 2001 From: Niklas Haas Date: Wed, 14 Feb 2024 18:58:28 +0100 Subject: dwindle: add swapsplit dispatcher (#4702) This is distinct from `swapwindow` in that it allows swapping the entire tree node with its neighbour. Fixes: https://github.com/hyprwm/Hyprland/issues/4701 --- src/layout/DwindleLayout.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/layout/DwindleLayout.cpp') diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index 11be13ae..9db011d1 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -996,6 +996,8 @@ std::any CHyprDwindleLayout::layoutMessage(SLayoutMessageHeader header, std::str const auto ARGS = CVarList(message, 0, ' '); if (ARGS[0] == "togglesplit") { toggleSplit(header.pWindow); + } else if (ARGS[0] == "swapsplit") { + swapSplit(header.pWindow); } else if (ARGS[0] == "preselect") { std::string direction = ARGS[1]; @@ -1049,6 +1051,20 @@ void CHyprDwindleLayout::toggleSplit(CWindow* pWindow) { PNODE->pParent->recalcSizePosRecursive(); } +void CHyprDwindleLayout::swapSplit(CWindow* pWindow) { + const auto PNODE = getNodeFromWindow(pWindow); + + if (!PNODE || !PNODE->pParent) + return; + + if (pWindow->m_bIsFullscreen) + return; + + std::swap(PNODE->pParent->children[0], PNODE->pParent->children[1]); + + PNODE->pParent->recalcSizePosRecursive(); +} + void CHyprDwindleLayout::replaceWindowDataWith(CWindow* from, CWindow* to) { const auto PNODE = getNodeFromWindow(from); -- cgit v1.2.3