summaryrefslogtreecommitdiff
path: root/src/managers/input/trackpad/gestures/MoveGesture.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2025-08-28 11:20:29 +0200
committerGitHub <noreply@github.com>2025-08-28 11:20:29 +0200
commit81bf4eccba449bfe2b6adfb51260108aec710d4f (patch)
tree215c5b536cbcf1df9888081aadd3de16eb4b3ebe /src/managers/input/trackpad/gestures/MoveGesture.cpp
parent378e130f1426648d8d734049800128f9882805bf (diff)
input: Add fully configurable trackpad gestures (#11490)
Adds configurable trackpad gestures
Diffstat (limited to 'src/managers/input/trackpad/gestures/MoveGesture.cpp')
-rw-r--r--src/managers/input/trackpad/gestures/MoveGesture.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/managers/input/trackpad/gestures/MoveGesture.cpp b/src/managers/input/trackpad/gestures/MoveGesture.cpp
new file mode 100644
index 00000000..6ceb02ec
--- /dev/null
+++ b/src/managers/input/trackpad/gestures/MoveGesture.cpp
@@ -0,0 +1,66 @@
+#include "MoveGesture.hpp"
+
+#include "../../../../Compositor.hpp"
+#include "../../../../managers/LayoutManager.hpp"
+#include "../../../../render/Renderer.hpp"
+
+void CMoveTrackpadGesture::begin(const ITrackpadGesture::STrackpadGestureBegin& e) {
+ ITrackpadGesture::begin(e);
+
+ m_window = g_pCompositor->m_lastWindow;
+ m_lastDelta = {};
+}
+
+void CMoveTrackpadGesture::update(const ITrackpadGesture::STrackpadGestureUpdate& e) {
+ if (!m_window)
+ return;
+
+ const auto DELTA = e.swipe ? e.swipe->delta : e.pinch->delta;
+
+ if (m_window->m_isFloating) {
+ g_pLayoutManager->getCurrentLayout()->moveActiveWindow(DELTA, m_window.lock());
+ m_window->m_realSize->warp();
+ m_window->m_realPosition->warp();
+ return;
+ }
+
+ // tiled window -> displace, then execute a move dispatcher on end.
+
+ g_pHyprRenderer->damageWindow(m_window.lock());
+
+ // funny name but works on tiled too lmao
+ m_lastDelta += DELTA;
+ m_window->m_floatingOffset = (m_lastDelta * 0.5F).clamp(Vector2D{-100.F, -100.F}, Vector2D{100.F, 100.F});
+
+ g_pHyprRenderer->damageWindow(m_window.lock());
+}
+
+void CMoveTrackpadGesture::end(const ITrackpadGesture::STrackpadGestureEnd& e) {
+
+ if (!m_window)
+ return;
+
+ if (m_window->m_isFloating || m_lastDelta.size() < 0.1F)
+ return;
+
+ // tiled: attempt to move window in the given direction
+
+ const auto WINDOWPOS = m_window->m_realPosition->goal() + m_window->m_floatingOffset;
+
+ m_window->m_floatingOffset = {};
+
+ if (std::abs(m_lastDelta.x) > std::abs(m_lastDelta.y)) {
+ // horizontal
+ g_pLayoutManager->getCurrentLayout()->moveWindowTo(m_window.lock(), m_lastDelta.x > 0 ? "r" : "l");
+ } else {
+ // vertical
+ g_pLayoutManager->getCurrentLayout()->moveWindowTo(m_window.lock(), m_lastDelta.y > 0 ? "b" : "t");
+ }
+
+ const auto GOAL = m_window->m_realPosition->goal();
+
+ m_window->m_realPosition->setValueAndWarp(WINDOWPOS);
+ *m_window->m_realPosition = GOAL;
+
+ m_window.reset();
+}