diff options
| author | Barrett Ruth <62671086+barrettruth@users.noreply.github.com> | 2026-05-01 19:02:01 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-05-02 00:02:01 +0100 |
| commit | f9723133cc909874999e6181bddf286033070e0c (patch) | |
| tree | 18f7ba9eaa2cb38676ee114ea4485b2b61f28ecc /src | |
| parent | c7b8fe13c10d6a4392bfda9bcfc041e0ea0b7c00 (diff) | |
gestures: add live pinch cursor zoom (#14049)
Diffstat (limited to 'src')
| -rw-r--r-- | src/helpers/MonitorZoomController.cpp | 21 | ||||
| -rw-r--r-- | src/helpers/MonitorZoomController.hpp | 15 | ||||
| -rw-r--r-- | src/managers/input/trackpad/gestures/CursorZoomGesture.cpp | 57 | ||||
| -rw-r--r-- | src/managers/input/trackpad/gestures/CursorZoomGesture.hpp | 5 |
4 files changed, 86 insertions, 12 deletions
diff --git a/src/helpers/MonitorZoomController.cpp b/src/helpers/MonitorZoomController.cpp index c1b6cc6a..b59e1eb2 100644 --- a/src/helpers/MonitorZoomController.cpp +++ b/src/helpers/MonitorZoomController.cpp @@ -7,11 +7,27 @@ #include "desktop/DesktopTypes.hpp" #include "render/Renderer.hpp" +void CMonitorZoomController::pinAnchor(const Vector2D& anchor) { + m_pinnedAnchor = anchor; + m_anchorPinned = true; +} + +void CMonitorZoomController::clearAnchor() { + m_anchorPinned = false; +} + +Vector2D CMonitorZoomController::getAnchor(const PHLMONITORREF& monitor) { + if (m_anchorPinned) + return m_pinnedAnchor; + + return g_pInputManager->getMouseCoordsInternal() - monitor->m_position; +} + void CMonitorZoomController::zoomWithDetachedCamera(CBox& result, const Render::SRenderData& m_renderData) { const auto m = m_renderData.pMonitor; auto monbox = CBox(0, 0, m->m_size.x, m->m_size.y); const auto ZOOM = g_pHyprRenderer->m_renderData.mouseZoomFactor; - const auto MOUSE = g_pInputManager->getMouseCoordsInternal() - m->m_position; + const auto MOUSE = getAnchor(m); if (m_lastZoomLevel != ZOOM) { if (m_resetCameraState) { @@ -83,8 +99,7 @@ void CMonitorZoomController::applyZoomTransform(CBox& monbox, const Render::SRen if (*PZOOMDETACHEDCAMERA && !INITANIM) zoomWithDetachedCamera(monbox, m_renderData); else { - const auto ZOOMCENTER = - g_pHyprRenderer->m_renderData.mouseZoomUseMouse ? (g_pInputManager->getMouseCoordsInternal() - m->m_position) * m->m_scale : m->m_transformedSize / 2.f; + const auto ZOOMCENTER = g_pHyprRenderer->m_renderData.mouseZoomUseMouse ? getAnchor(m) * m->m_scale : m->m_transformedSize / 2.f; monbox.translate(-ZOOMCENTER).scale(ZOOM).translate(*PZOOMRIGID ? m->m_transformedSize / 2.0 : ZOOMCENTER); } diff --git a/src/helpers/MonitorZoomController.hpp b/src/helpers/MonitorZoomController.hpp index 94373baf..ce3ad554 100644 --- a/src/helpers/MonitorZoomController.hpp +++ b/src/helpers/MonitorZoomController.hpp @@ -1,6 +1,7 @@ #pragma once #include "./math/Math.hpp" +#include "../desktop/DesktopTypes.hpp" namespace Render { struct SRenderData; @@ -10,12 +11,18 @@ class CMonitorZoomController { public: bool m_resetCameraState = true; + void pinAnchor(const Vector2D& anchor); + void clearAnchor(); + void applyZoomTransform(CBox& monbox, const Render::SRenderData& m_renderData); private: - void zoomWithDetachedCamera(CBox& result, const Render::SRenderData& m_renderData); + void zoomWithDetachedCamera(CBox& result, const Render::SRenderData& m_renderData); + Vector2D getAnchor(const PHLMONITORREF& monitor); - CBox m_camera; - float m_lastZoomLevel = 1.0f; - bool m_padCamEdges = true; + CBox m_camera; + Vector2D m_pinnedAnchor = {}; + float m_lastZoomLevel = 1.0f; + bool m_padCamEdges = true; + bool m_anchorPinned = false; }; diff --git a/src/managers/input/trackpad/gestures/CursorZoomGesture.cpp b/src/managers/input/trackpad/gestures/CursorZoomGesture.cpp index 515edbb6..418b8f7a 100644 --- a/src/managers/input/trackpad/gestures/CursorZoomGesture.cpp +++ b/src/managers/input/trackpad/gestures/CursorZoomGesture.cpp @@ -2,19 +2,40 @@ #include "../../../../Compositor.hpp" #include "../../../../helpers/Monitor.hpp" +#include "../../../../managers/input/InputManager.hpp" +#include <hyprutils/string/Numeric.hpp> CCursorZoomTrackpadGesture::CCursorZoomTrackpadGesture(const std::string& first, const std::string& second) { - try { - m_zoomValue = std::stof(first); - } catch (...) { ; } + if (const auto n = Hyprutils::String::strToNumber<float>(first); n) + m_zoomValue = n.value(); if (second == "mult") m_mode = MODE_MULT; + else if (second == "live") + m_mode = MODE_LIVE; } void CCursorZoomTrackpadGesture::begin(const ITrackpadGesture::STrackpadGestureBegin& e) { ITrackpadGesture::begin(e); + if (m_mode == MODE_LIVE) { + if (!e.pinch) + return; + + m_monitor = g_pCompositor->getMonitorFromCursor(); + if (!m_monitor) + return; + + const auto PMONITOR = m_monitor.lock(); + if (!PMONITOR) + return; + + m_zoomBegin = std::clamp(PMONITOR->m_cursorZoom->value(), 1.0F, 100.0F); + PMONITOR->m_cursorZoom->setValueAndWarp(m_zoomBegin); + PMONITOR->m_zoomController.pinAnchor(g_pInputManager->getMouseCoordsInternal() - PMONITOR->m_position); + return; + } + if (m_mode == MODE_TOGGLE) m_zoomed = !m_zoomed; @@ -25,9 +46,35 @@ void CCursorZoomTrackpadGesture::begin(const ITrackpadGesture::STrackpadGestureB *m->m_cursorZoom = m_zoomed ? m_zoomValue : *PZOOMFACTOR; break; case MODE_MULT: *m->m_cursorZoom = std::clamp(m->m_cursorZoom->goal() * m_zoomValue, 1.0F, 100.0F); break; + case MODE_LIVE: break; } } } -void CCursorZoomTrackpadGesture::update(const ITrackpadGesture::STrackpadGestureUpdate& e) {} -void CCursorZoomTrackpadGesture::end(const ITrackpadGesture::STrackpadGestureEnd& e) {} +void CCursorZoomTrackpadGesture::update(const ITrackpadGesture::STrackpadGestureUpdate& e) { + if (m_mode != MODE_LIVE || !m_monitor || !e.pinch) + return; + + const auto PMONITOR = m_monitor.lock(); + if (!PMONITOR) + return; + + auto zoom = std::clamp(m_zoomBegin * static_cast<float>(e.pinch->scale), 1.0F, 100.0F); + + if (zoom < 1.05F) + zoom = 1.0F; + + PMONITOR->m_cursorZoom->setValueAndWarp(zoom); +} + +void CCursorZoomTrackpadGesture::end(const ITrackpadGesture::STrackpadGestureEnd& e) { + if (m_mode != MODE_LIVE || !m_monitor) + return; + + const auto PMONITOR = m_monitor.lock(); + if (!PMONITOR) + return; + + PMONITOR->m_zoomController.clearAnchor(); + m_monitor.reset(); +} diff --git a/src/managers/input/trackpad/gestures/CursorZoomGesture.hpp b/src/managers/input/trackpad/gestures/CursorZoomGesture.hpp index b53c81e9..3def907f 100644 --- a/src/managers/input/trackpad/gestures/CursorZoomGesture.hpp +++ b/src/managers/input/trackpad/gestures/CursorZoomGesture.hpp @@ -2,6 +2,8 @@ #include "ITrackpadGesture.hpp" +#include "../../../../desktop/DesktopTypes.hpp" + class CCursorZoomTrackpadGesture : public ITrackpadGesture { public: CCursorZoomTrackpadGesture(const std::string& zoomLevel, const std::string& mode); @@ -14,10 +16,13 @@ class CCursorZoomTrackpadGesture : public ITrackpadGesture { private: float m_zoomValue = 1.0; inline static bool m_zoomed = false; + PHLMONITORREF m_monitor; + float m_zoomBegin = 1.0; enum eMode : uint8_t { MODE_TOGGLE = 0, MODE_MULT, + MODE_LIVE, }; eMode m_mode = MODE_TOGGLE; |
