summaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-09-14 17:30:16 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-09-14 17:30:16 +0200
commit037d4ed422bb3bb34617f444a360a8abab6863cb (patch)
treec6ba498a459e88df756c60fd3f9a6e78b40094fc /src/layout
parent9f82278d65ab0b0434c14c0dbbd6556a40232f36 (diff)
handle multi-ws swaps in layouts
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/DwindleLayout.cpp7
-rw-r--r--src/layout/MasterLayout.cpp13
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) {