summaryrefslogtreecommitdiff
path: root/src/layout/DwindleLayout.cpp
diff options
context:
space:
mode:
authoroutfoxxed <outfoxxed@outfoxxed.me>2023-04-25 15:53:18 +0000
committerGitHub <noreply@github.com>2023-04-25 16:53:18 +0100
commit849d65759546bb453481a4a7b5699c540027a05f (patch)
tree28db817daa1d961b8ee526c22a0609893d6d729a /src/layout/DwindleLayout.cpp
parentbf27066fd7479ec161b7e52467bca56d1fa65e6d (diff)
Window resizing for pseudotiled windows (#2140)
* Window resizing for pseudotiled windows * Use `m_vRealSize` to determine scaled window size
Diffstat (limited to 'src/layout/DwindleLayout.cpp')
-rw-r--r--src/layout/DwindleLayout.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp
index b1aad296..2bf91809 100644
--- a/src/layout/DwindleLayout.cpp
+++ b/src/layout/DwindleLayout.cpp
@@ -497,6 +497,12 @@ bool CHyprDwindleLayout::isWindowTiled(CWindow* pWindow) {
return getNodeFromWindow(pWindow) != nullptr;
}
+void CHyprDwindleLayout::onBeginDragWindow() {
+ m_PseudoDragFlags.started = false;
+ m_PseudoDragFlags.pseudo = false;
+ IHyprLayout::onBeginDragWindow();
+}
+
void CHyprDwindleLayout::resizeActiveWindow(const Vector2D& pixResize, CWindow* pWindow) {
const auto PWINDOW = pWindow ? pWindow : g_pCompositor->m_pLastWindow;
@@ -521,6 +527,44 @@ void CHyprDwindleLayout::resizeActiveWindow(const Vector2D& pixResize, CWindow*
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);
+ if (PWINDOW->m_bIsPseudotiled) {
+ if (!m_PseudoDragFlags.started) {
+ m_PseudoDragFlags.started = true;
+
+ const auto pseudoSize = PWINDOW->m_vRealSize.goalv();
+ const auto mouseOffset = g_pInputManager->getMouseCoordsInternal() - (PNODE->position + ((PNODE->size / 2) - (pseudoSize / 2)));
+
+ if (mouseOffset.x > 0 && mouseOffset.x < pseudoSize.x && mouseOffset.y > 0 && mouseOffset.y < pseudoSize.y) {
+ m_PseudoDragFlags.pseudo = true;
+ m_PseudoDragFlags.xExtent = mouseOffset.x > pseudoSize.x / 2;
+ m_PseudoDragFlags.yExtent = mouseOffset.y > pseudoSize.y / 2;
+
+ PWINDOW->m_vPseudoSize = pseudoSize;
+ } else {
+ m_PseudoDragFlags.pseudo = false;
+ }
+ }
+
+ if (m_PseudoDragFlags.pseudo) {
+ if (m_PseudoDragFlags.xExtent)
+ PWINDOW->m_vPseudoSize.x += pixResize.x * 2;
+ else
+ PWINDOW->m_vPseudoSize.x -= pixResize.x * 2;
+ if (m_PseudoDragFlags.yExtent)
+ PWINDOW->m_vPseudoSize.y += pixResize.y * 2;
+ else
+ PWINDOW->m_vPseudoSize.y -= pixResize.y * 2;
+
+ PWINDOW->m_vPseudoSize.x = std::clamp(PWINDOW->m_vPseudoSize.x, 30.0, PNODE->size.x);
+ PWINDOW->m_vPseudoSize.y = std::clamp(PWINDOW->m_vPseudoSize.y, 30.0, PNODE->size.y);
+
+ PWINDOW->m_vLastFloatingSize = PWINDOW->m_vPseudoSize;
+ PNODE->recalcSizePosRecursive(*PANIMATE == 0);
+
+ return;
+ }
+ }
+
// construct allowed movement
Vector2D allowedMovement = pixResize;
if (DISPLAYLEFT && DISPLAYRIGHT)