From 6295cbe9cb39b67e8d2dae1e4edeb281d84f5483 Mon Sep 17 00:00:00 2001 From: MightyPlaza <123664421+MightyPlaza@users.noreply.github.com> Date: Tue, 8 Aug 2023 16:52:20 +0000 Subject: keybinds: Keep aspect ratio (#2907) --- src/layout/IHyprLayout.cpp | 58 +++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 16 deletions(-) (limited to 'src/layout/IHyprLayout.cpp') diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index baae6616..f39b190a 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -235,7 +235,7 @@ void IHyprLayout::onBeginDragWindow() { } } - if (g_pInputManager->dragMode != MBIND_RESIZE) + if (g_pInputManager->dragMode != MBIND_RESIZE && g_pInputManager->dragMode != MBIND_RESIZE_FORCE_RATIO && g_pInputManager->dragMode != MBIND_RESIZE_BLOCK_RATIO) g_pInputManager->setCursorImageUntilUnset("grab"); g_pHyprRenderer->damageWindow(DRAGGINGWINDOW); @@ -314,29 +314,55 @@ void IHyprLayout::onMouseMove(const Vector2D& mousePos) { } g_pXWaylandManager->setWindowSize(DRAGGINGWINDOW, DRAGGINGWINDOW->m_vRealSize.goalv()); - } else if (g_pInputManager->dragMode == MBIND_RESIZE) { + } else if (g_pInputManager->dragMode == MBIND_RESIZE || g_pInputManager->dragMode == MBIND_RESIZE_FORCE_RATIO || g_pInputManager->dragMode == MBIND_RESIZE_BLOCK_RATIO) { if (DRAGGINGWINDOW->m_bIsFloating) { - const auto MAXSIZE = g_pXWaylandManager->getMaxSizeForWindow(DRAGGINGWINDOW); - - // calc the new size and pos + Vector2D MINSIZE = Vector2D(20, 20); + Vector2D MAXSIZE = g_pXWaylandManager->getMaxSizeForWindow(DRAGGINGWINDOW); Vector2D newSize = m_vBeginDragSizeXY; Vector2D newPos = m_vBeginDragPositionXY; - if (m_eGrabbedCorner == CORNER_BOTTOMRIGHT) { - newSize = (newSize + DELTA).clamp(Vector2D(20, 20), MAXSIZE); - } else if (m_eGrabbedCorner == CORNER_TOPLEFT) { - newSize = (newSize - DELTA).clamp(Vector2D(20, 20), MAXSIZE); - newPos = newPos - newSize + m_vBeginDragSizeXY; - } else if (m_eGrabbedCorner == CORNER_TOPRIGHT) { - newSize = (newSize + Vector2D(DELTA.x, -DELTA.y)).clamp(Vector2D(20, 20), MAXSIZE); - newPos = newPos + Vector2D(0, (m_vBeginDragSizeXY - newSize).y); - } else if (m_eGrabbedCorner == CORNER_BOTTOMLEFT) { - newSize = (newSize + Vector2D(-DELTA.x, DELTA.y)).clamp(Vector2D(20, 20), MAXSIZE); - newPos = newPos + Vector2D((m_vBeginDragSizeXY - newSize).x, 0); + if (m_eGrabbedCorner == CORNER_BOTTOMRIGHT) + newSize = newSize + DELTA; + else if (m_eGrabbedCorner == CORNER_TOPLEFT) + newSize = newSize - DELTA; + else if (m_eGrabbedCorner == CORNER_TOPRIGHT) + newSize = newSize + Vector2D(DELTA.x, -DELTA.y); + else if (m_eGrabbedCorner == CORNER_BOTTOMLEFT) + newSize = newSize + Vector2D(-DELTA.x, DELTA.y); + + if ((m_vBeginDragSizeXY.x >= 1 && m_vBeginDragSizeXY.y >= 1) && + (g_pInputManager->dragMode == MBIND_RESIZE_FORCE_RATIO || + (!(g_pInputManager->dragMode == MBIND_RESIZE_BLOCK_RATIO) && DRAGGINGWINDOW->m_sAdditionalConfigData.keepAspectRatio))) { + + const float RATIO = m_vBeginDragSizeXY.y / m_vBeginDragSizeXY.x; + + if (MINSIZE.x * RATIO > MINSIZE.y) + MINSIZE = Vector2D(MINSIZE.x, MINSIZE.x * RATIO); + else + MINSIZE = Vector2D(MINSIZE.y / RATIO, MINSIZE.y); + + if (MAXSIZE.x * RATIO < MAXSIZE.y) + MAXSIZE = Vector2D(MAXSIZE.x, MAXSIZE.x * RATIO); + else + MAXSIZE = Vector2D(MAXSIZE.y / RATIO, MAXSIZE.y); + + if (newSize.x * RATIO > newSize.y) + newSize = Vector2D(newSize.x, newSize.x * RATIO); + else + newSize = Vector2D(newSize.y / RATIO, newSize.y); } + newSize = newSize.clamp(MINSIZE, MAXSIZE); + + if (m_eGrabbedCorner == CORNER_TOPLEFT) + newPos = newPos - newSize + m_vBeginDragSizeXY; + else if (m_eGrabbedCorner == CORNER_TOPRIGHT) + newPos = newPos + Vector2D(0, (m_vBeginDragSizeXY - newSize).y); + else if (m_eGrabbedCorner == CORNER_BOTTOMLEFT) + newPos = newPos + Vector2D((m_vBeginDragSizeXY - newSize).x, 0); + if (*PANIMATE) { DRAGGINGWINDOW->m_vRealSize = newSize; DRAGGINGWINDOW->m_vRealPosition = newPos; -- cgit v1.2.3