From 037d4ed422bb3bb34617f444a360a8abab6863cb Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 14 Sep 2022 17:30:16 +0200 Subject: [PATCH] handle multi-ws swaps in layouts --- src/layout/DwindleLayout.cpp | 7 +++++-- src/layout/MasterLayout.cpp | 13 +++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index 2f9b00fa..0d5cfde3 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -1008,8 +1008,8 @@ void CHyprDwindleLayout::switchWindows(CWindow* pWindow, CWindow* pWindow2) { return; if (PNODE->workspaceID != PNODE2->workspaceID) { - Debug::log(ERR, "Dwindle: Rejecting a swap between workspaces"); - return; + std::swap(pWindow2->m_iMonitorID, pWindow->m_iMonitorID); + std::swap(pWindow2->m_iWorkspaceID, pWindow->m_iWorkspaceID); } // swap the windows and recalc @@ -1018,6 +1018,9 @@ void CHyprDwindleLayout::switchWindows(CWindow* pWindow, CWindow* pWindow2) { // recalc the workspace getMasterNodeOnWorkspace(PNODE->workspaceID)->recalcSizePosRecursive(); + + if (PNODE2->workspaceID != PNODE->workspaceID) + getMasterNodeOnWorkspace(PNODE2->workspaceID)->recalcSizePosRecursive(); } void CHyprDwindleLayout::alterSplitRatioBy(CWindow* pWindow, float ratio) { diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp index 8f00db47..759c46d0 100644 --- a/src/layout/MasterLayout.cpp +++ b/src/layout/MasterLayout.cpp @@ -425,16 +425,17 @@ void CHyprMasterLayout::switchWindows(CWindow* pWindow, CWindow* pWindow2) { return; if (PNODE->workspaceID != PNODE2->workspaceID) { - Debug::log(ERR, "Master: Rejecting a swap between workspaces"); - return; + std::swap(pWindow2->m_iMonitorID, pWindow->m_iMonitorID); + std::swap(pWindow2->m_iWorkspaceID, pWindow->m_iWorkspaceID); } // massive hack: just swap window pointers, lol - const auto PWINDOW1 = PNODE->pWindow; - PNODE->pWindow = PNODE2->pWindow; - PNODE2->pWindow = PWINDOW1; + PNODE->pWindow = pWindow2; + PNODE2->pWindow = pWindow; - recalculateMonitor(PWINDOW1->m_iMonitorID); + recalculateMonitor(pWindow->m_iMonitorID); + if (PNODE2->workspaceID != PNODE->workspaceID) + recalculateMonitor(pWindow2->m_iMonitorID); } void CHyprMasterLayout::alterSplitRatioBy(CWindow* pWindow, float ratio) {