diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index be1c23d8..42f77760 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -1,7 +1,7 @@ #include "DwindleLayout.hpp" #include "../Compositor.hpp" -void SDwindleNodeData::recalcSizePosRecursive() { +void SDwindleNodeData::recalcSizePosRecursive(bool force) { // check the group, if we are in one and not active, ignore. if (pGroupParent && pGroupParent->groupMembers[pGroupParent->groupMemberActive] != this) { @@ -47,7 +47,7 @@ void SDwindleNodeData::recalcSizePosRecursive() { children[0]->recalcSizePosRecursive(); children[1]->recalcSizePosRecursive(); } else { - layout->applyNodeDataToWindow(this); + layout->applyNodeDataToWindow(this, force); } } @@ -94,7 +94,7 @@ SDwindleNodeData* CHyprDwindleLayout::getMasterNodeOnWorkspace(const int& id) { return nullptr; } -void CHyprDwindleLayout::applyNodeDataToWindow(SDwindleNodeData* pNode) { +void CHyprDwindleLayout::applyNodeDataToWindow(SDwindleNodeData* pNode, bool force) { // Don't set nodes, only windows. if (pNode->isNode) return; @@ -203,6 +203,11 @@ void CHyprDwindleLayout::applyNodeDataToWindow(SDwindleNodeData* pNode) { g_pXWaylandManager->setWindowSize(PWINDOW, calcSize); } + if (force) { + PWINDOW->m_vRealPosition.warp(); + PWINDOW->m_vRealSize.warp(); + } + PWINDOW->updateWindowDecos(); } @@ -504,11 +509,11 @@ void CHyprDwindleLayout::resizeActiveWindow(const Vector2D& pixResize, CWindow* if (PARENTSIDEBYSIDE) { allowedMovement.x *= 2.f / PPARENT->size.x; PPARENT->splitRatio = std::clamp(PPARENT->splitRatio + allowedMovement.x, (double)0.1f, (double)1.9f); - PPARENT->recalcSizePosRecursive(); + PPARENT->recalcSizePosRecursive(true); } else { allowedMovement.y *= 2.f / PPARENT->size.y; PPARENT->splitRatio = std::clamp(PPARENT->splitRatio + allowedMovement.y, (double)0.1f, (double)1.9f); - PPARENT->recalcSizePosRecursive(); + PPARENT->recalcSizePosRecursive(true); } return; @@ -523,11 +528,11 @@ void CHyprDwindleLayout::resizeActiveWindow(const Vector2D& pixResize, CWindow* if (PARENTSIDEBYSIDE) { allowedMovement.x *= 2.f / PPARENT->size.x; PPARENT->splitRatio = std::clamp(PPARENT->splitRatio + allowedMovement.x, (double)0.1f, (double)1.9f); - PPARENT->recalcSizePosRecursive(); + PPARENT->recalcSizePosRecursive(true); } else { allowedMovement.y *= 2.f / PPARENT->size.y; PPARENT->splitRatio = std::clamp(PPARENT->splitRatio + allowedMovement.y, (double)0.1f, (double)1.9f); - PPARENT->recalcSizePosRecursive(); + PPARENT->recalcSizePosRecursive(true); } return; @@ -542,8 +547,8 @@ void CHyprDwindleLayout::resizeActiveWindow(const Vector2D& pixResize, CWindow* SIDECONTAINER->splitRatio = std::clamp(SIDECONTAINER->splitRatio + allowedMovement.x, (double)0.1f, (double)1.9f); TOPCONTAINER->splitRatio = std::clamp(TOPCONTAINER->splitRatio + allowedMovement.y, (double)0.1f, (double)1.9f); - SIDECONTAINER->recalcSizePosRecursive(); - TOPCONTAINER->recalcSizePosRecursive(); + SIDECONTAINER->recalcSizePosRecursive(true); + TOPCONTAINER->recalcSizePosRecursive(true); } void CHyprDwindleLayout::fullscreenRequestForWindow(CWindow* pWindow, eFullscreenMode fullscreenMode, bool on) { diff --git a/src/layout/DwindleLayout.hpp b/src/layout/DwindleLayout.hpp index 1dceb0c5..3392efb2 100644 --- a/src/layout/DwindleLayout.hpp +++ b/src/layout/DwindleLayout.hpp @@ -37,7 +37,7 @@ struct SDwindleNodeData { return pWindow == rhs.pWindow && workspaceID == rhs.workspaceID && position == rhs.position && size == rhs.size && pParent == rhs.pParent && children[0] == rhs.children[0] && children[1] == rhs.children[1]; } - void recalcSizePosRecursive(); + void recalcSizePosRecursive(bool force = false); void getAllChildrenRecursive(std::deque*); CHyprDwindleLayout* layout = nullptr; }; @@ -65,7 +65,7 @@ private: std::list m_lDwindleNodesData; int getNodesOnWorkspace(const int&); - void applyNodeDataToWindow(SDwindleNodeData*); + void applyNodeDataToWindow(SDwindleNodeData*, bool force = false); SDwindleNodeData* getNodeFromWindow(CWindow*); SDwindleNodeData* getFirstNodeOnWorkspace(const int&); SDwindleNodeData* getMasterNodeOnWorkspace(const int&); diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp index edff28d0..5199f76f 100644 --- a/src/layout/MasterLayout.cpp +++ b/src/layout/MasterLayout.cpp @@ -250,6 +250,11 @@ void CHyprMasterLayout::applyNodeDataToWindow(SMasterNodeData* pNode) { g_pXWaylandManager->setWindowSize(PWINDOW, calcSize); } + if (m_bForceWarps) { + PWINDOW->m_vRealPosition.warp(); + PWINDOW->m_vRealSize.warp(); + } + PWINDOW->updateWindowDecos(); } @@ -278,6 +283,8 @@ void CHyprMasterLayout::resizeActiveWindow(const Vector2D& pixResize, CWindow* p if (getNodesOnWorkspace(PWINDOW->m_iWorkspaceID) < 2) return; + m_bForceWarps = true; + float delta = pixResize.x / PMONITOR->vecSize.x; PMASTER->percMaster += delta; @@ -285,6 +292,8 @@ void CHyprMasterLayout::resizeActiveWindow(const Vector2D& pixResize, CWindow* p std::clamp(PMASTER->percMaster, 0.05f, 0.95f); recalculateMonitor(PMONITOR->ID); + + m_bForceWarps = false; } void CHyprMasterLayout::fullscreenRequestForWindow(CWindow* pWindow, eFullscreenMode fullscreenMode, bool on) { diff --git a/src/layout/MasterLayout.hpp b/src/layout/MasterLayout.hpp index 318f8940..f7f40ea4 100644 --- a/src/layout/MasterLayout.hpp +++ b/src/layout/MasterLayout.hpp @@ -44,6 +44,8 @@ private: std::list m_lMasterNodesData; + bool m_bForceWarps = false; + int getNodesOnWorkspace(const int&); void applyNodeDataToWindow(SMasterNodeData*); SMasterNodeData* getNodeFromWindow(CWindow*);