summaryrefslogtreecommitdiff
path: root/src/layout/DwindleLayout.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-06-06 19:32:14 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-06-06 19:32:14 +0200
commit663fba76ae08407f196c1cc1b2c775d52b9fdfc9 (patch)
tree5d7e9235567f03cc9692af48fa62a854025b9c9d /src/layout/DwindleLayout.cpp
parentd73e05cc681cb7227d69d67c32e735b2705743a6 (diff)
Added resizeactive
Diffstat (limited to 'src/layout/DwindleLayout.cpp')
-rw-r--r--src/layout/DwindleLayout.cpp156
1 files changed, 87 insertions, 69 deletions
diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp
index e5cbf46c..ce63ace6 100644
--- a/src/layout/DwindleLayout.cpp
+++ b/src/layout/DwindleLayout.cpp
@@ -517,95 +517,113 @@ void CHyprDwindleLayout::onMouseMove(const Vector2D& mousePos) {
g_pXWaylandManager->setWindowSize(DRAGGINGWINDOW, DRAGGINGWINDOW->m_vRealSize.goalv());
} else {
- // we need to adjust the splitratio
+ resizeActiveWindow(TICKDELTA, DRAGGINGWINDOW);
+ }
+ }
- // get some data about our window
- const auto PNODE = getNodeFromWindow(DRAGGINGWINDOW);
- const auto PMONITOR = g_pCompositor->getMonitorFromID(DRAGGINGWINDOW->m_iMonitorID);
- const bool DISPLAYLEFT = STICKS(DRAGGINGWINDOW->m_vPosition.x, PMONITOR->vecPosition.x + PMONITOR->vecReservedTopLeft.x);
- const bool DISPLAYRIGHT = STICKS(DRAGGINGWINDOW->m_vPosition.x + DRAGGINGWINDOW->m_vSize.x, PMONITOR->vecPosition.x + PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x);
- const bool DISPLAYTOP = STICKS(DRAGGINGWINDOW->m_vPosition.y, PMONITOR->vecPosition.y + PMONITOR->vecReservedTopLeft.y);
- const bool DISPLAYBOTTOM = STICKS(DRAGGINGWINDOW->m_vPosition.y + DRAGGINGWINDOW->m_vSize.y, PMONITOR->vecPosition.y + PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y);
+ // get middle point
+ Vector2D middle = DRAGGINGWINDOW->m_vRealPosition.vec() + DRAGGINGWINDOW->m_vRealSize.vec() / 2.f;
- // construct allowed movement
- Vector2D allowedMovement = TICKDELTA;
- if (DISPLAYLEFT && DISPLAYRIGHT)
- allowedMovement.x = 0;
+ // and check its monitor
+ const auto PMONITOR = g_pCompositor->getMonitorFromVector(middle);
- if (DISPLAYBOTTOM && DISPLAYTOP)
- allowedMovement.y = 0;
+ if (PMONITOR) {
+ DRAGGINGWINDOW->m_iMonitorID = PMONITOR->ID;
+ DRAGGINGWINDOW->m_iWorkspaceID = PMONITOR->activeWorkspace;
+ }
- // get the correct containers to apply splitratio to
- const auto PPARENT = PNODE->pParent;
+ g_pHyprRenderer->damageWindow(DRAGGINGWINDOW);
+}
- if (!PPARENT)
- return; // the only window on a workspace, ignore
+void CHyprDwindleLayout::resizeActiveWindow(const Vector2D& pixResize, CWindow* pWindow) {
- const bool PARENTSIDEBYSIDE = !PPARENT->splitTop;
+ const auto PWINDOW = pWindow ? pWindow : g_pCompositor->m_pLastWindow;
- // Get the parent's parent
- auto PPARENT2 = PPARENT->pParent;
+ if (!g_pCompositor->windowValidMapped(PWINDOW))
+ return;
- // No parent means we have only 2 windows, and thus one axis of freedom
- if (!PPARENT2) {
- 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();
- } else {
- allowedMovement.y *= 2.f / PPARENT->size.y;
- PPARENT->splitRatio = std::clamp(PPARENT->splitRatio + allowedMovement.y, (double)0.1f, (double)1.9f);
- PPARENT->recalcSizePosRecursive();
- }
+ const auto PNODE = getNodeFromWindow(PWINDOW);
- return;
- }
+ if (!PNODE) {
+ PWINDOW->m_vRealSize.setValueAndWarp(PWINDOW->m_vRealSize.goalv() + pixResize);
+ PWINDOW->m_vRealSize.setValueAndWarp(Vector2D(std::clamp(PWINDOW->m_vRealSize.vec().x, (double)20, (double)999999), std::clamp(PWINDOW->m_vRealSize.vec().y, (double)20, (double)999999)));
- // Get first parent with other split
- while(PPARENT2 && PPARENT2->splitTop == !PARENTSIDEBYSIDE)
- PPARENT2 = PPARENT2->pParent;
-
- // no parent, one axis of freedom
- if (!PPARENT2) {
- 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();
- } else {
- allowedMovement.y *= 2.f / PPARENT->size.y;
- PPARENT->splitRatio = std::clamp(PPARENT->splitRatio + allowedMovement.y, (double)0.1f, (double)1.9f);
- PPARENT->recalcSizePosRecursive();
- }
-
- return;
- }
+ g_pXWaylandManager->setWindowSize(PWINDOW, PWINDOW->m_vRealSize.goalv());
+
+ return;
+ }
+
+ // get some data about our window
+ const auto PMONITOR = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID);
+ const bool DISPLAYLEFT = STICKS(PWINDOW->m_vPosition.x, PMONITOR->vecPosition.x + PMONITOR->vecReservedTopLeft.x);
+ const bool DISPLAYRIGHT = STICKS(PWINDOW->m_vPosition.x + PWINDOW->m_vSize.x, PMONITOR->vecPosition.x + PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x);
+ const bool DISPLAYTOP = STICKS(PWINDOW->m_vPosition.y, PMONITOR->vecPosition.y + PMONITOR->vecReservedTopLeft.y);
+ const bool DISPLAYBOTTOM = STICKS(PWINDOW->m_vPosition.y + PWINDOW->m_vSize.y, PMONITOR->vecPosition.y + PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y);
- // 2 axes of freedom
- const auto SIDECONTAINER = PARENTSIDEBYSIDE ? PPARENT : PPARENT2;
- const auto TOPCONTAINER = PARENTSIDEBYSIDE ? PPARENT2 : PPARENT;
+ // construct allowed movement
+ Vector2D allowedMovement = pixResize;
+ if (DISPLAYLEFT && DISPLAYRIGHT)
+ allowedMovement.x = 0;
- allowedMovement.x *= 2.f / SIDECONTAINER->size.x;
- allowedMovement.y *= 2.f / TOPCONTAINER->size.y;
+ if (DISPLAYBOTTOM && DISPLAYTOP)
+ allowedMovement.y = 0;
- 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();
+ // get the correct containers to apply splitratio to
+ const auto PPARENT = PNODE->pParent;
+
+ if (!PPARENT)
+ return; // the only window on a workspace, ignore
+
+ const bool PARENTSIDEBYSIDE = !PPARENT->splitTop;
+
+ // Get the parent's parent
+ auto PPARENT2 = PPARENT->pParent;
+
+ // No parent means we have only 2 windows, and thus one axis of freedom
+ if (!PPARENT2) {
+ 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();
+ } else {
+ allowedMovement.y *= 2.f / PPARENT->size.y;
+ PPARENT->splitRatio = std::clamp(PPARENT->splitRatio + allowedMovement.y, (double)0.1f, (double)1.9f);
+ PPARENT->recalcSizePosRecursive();
}
+
+ return;
}
- // get middle point
- Vector2D middle = DRAGGINGWINDOW->m_vRealPosition.vec() + DRAGGINGWINDOW->m_vRealSize.vec() / 2.f;
+ // Get first parent with other split
+ while (PPARENT2 && PPARENT2->splitTop == !PARENTSIDEBYSIDE)
+ PPARENT2 = PPARENT2->pParent;
- // and check its monitor
- const auto PMONITOR = g_pCompositor->getMonitorFromVector(middle);
+ // no parent, one axis of freedom
+ if (!PPARENT2) {
+ 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();
+ } else {
+ allowedMovement.y *= 2.f / PPARENT->size.y;
+ PPARENT->splitRatio = std::clamp(PPARENT->splitRatio + allowedMovement.y, (double)0.1f, (double)1.9f);
+ PPARENT->recalcSizePosRecursive();
+ }
- if (PMONITOR) {
- DRAGGINGWINDOW->m_iMonitorID = PMONITOR->ID;
- DRAGGINGWINDOW->m_iWorkspaceID = PMONITOR->activeWorkspace;
+ return;
}
- g_pHyprRenderer->damageWindow(DRAGGINGWINDOW);
+ // 2 axes of freedom
+ const auto SIDECONTAINER = PARENTSIDEBYSIDE ? PPARENT : PPARENT2;
+ const auto TOPCONTAINER = PARENTSIDEBYSIDE ? PPARENT2 : PPARENT;
+
+ allowedMovement.x *= 2.f / SIDECONTAINER->size.x;
+ allowedMovement.y *= 2.f / TOPCONTAINER->size.y;
+
+ 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();
}
void CHyprDwindleLayout::onWindowCreatedFloating(CWindow* pWindow) {