summaryrefslogtreecommitdiff
path: root/src/managers/input/trackpad/gestures/FullscreenGesture.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/FullscreenGesture.cpp
parent378e130f1426648d8d734049800128f9882805bf (diff)
input: Add fully configurable trackpad gestures (#11490)
Adds configurable trackpad gestures
Diffstat (limited to 'src/managers/input/trackpad/gestures/FullscreenGesture.cpp')
-rw-r--r--src/managers/input/trackpad/gestures/FullscreenGesture.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/managers/input/trackpad/gestures/FullscreenGesture.cpp b/src/managers/input/trackpad/gestures/FullscreenGesture.cpp
new file mode 100644
index 00000000..14e99238
--- /dev/null
+++ b/src/managers/input/trackpad/gestures/FullscreenGesture.cpp
@@ -0,0 +1,97 @@
+#include "FullscreenGesture.hpp"
+
+#include "../../../../Compositor.hpp"
+#include "../../../../render/Renderer.hpp"
+#include "../../../animation/DesktopAnimationManager.hpp"
+
+constexpr const float MAX_DISTANCE = 250.F;
+
+//
+static Vector2D lerpVal(const Vector2D& from, const Vector2D& to, const float& t) {
+ return Vector2D{
+ from.x + ((to.x - from.x) * t),
+ from.y + ((to.y - from.y) * t),
+ };
+}
+
+CFullscreenTrackpadGesture::CFullscreenTrackpadGesture(const std::string_view& mode) {
+ std::string lc = std::string{mode};
+ std::ranges::transform(lc, lc.begin(), ::tolower);
+
+ if (lc.starts_with("fullscreen"))
+ m_mode = MODE_FULLSCREEN;
+ else if (lc.starts_with("maximize"))
+ m_mode == MODE_MAXIMIZE;
+ else
+ m_mode = MODE_FULLSCREEN;
+}
+
+void CFullscreenTrackpadGesture::begin(const ITrackpadGesture::STrackpadGestureBegin& e) {
+ ITrackpadGesture::begin(e);
+
+ m_window = g_pCompositor->m_lastWindow;
+
+ if (!m_window)
+ return;
+
+ m_posFrom = m_window->m_realPosition->goal();
+ m_sizeFrom = m_window->m_realSize->goal();
+
+ m_originalMode = m_window->m_fullscreenState.internal;
+
+ g_pCompositor->setWindowFullscreenInternal(m_window.lock(), m_window->m_fullscreenState.internal == FSMODE_NONE ? fsModeForMode(m_mode) : FSMODE_NONE);
+
+ m_posTo = m_window->m_realPosition->goal();
+ m_sizeTo = m_window->m_realSize->goal();
+
+ m_lastDelta = 0.F;
+}
+
+void CFullscreenTrackpadGesture::update(const ITrackpadGesture::STrackpadGestureUpdate& e) {
+ if (!m_window)
+ return;
+
+ g_pHyprRenderer->damageWindow(m_window.lock());
+
+ m_lastDelta += distance(e);
+
+ const auto FADEPERCENT = std::clamp(m_lastDelta / MAX_DISTANCE, 0.F, 1.F);
+
+ m_window->m_realPosition->setValueAndWarp(lerpVal(m_posFrom, m_posTo, FADEPERCENT));
+ m_window->m_realSize->setValueAndWarp(lerpVal(m_sizeFrom, m_sizeTo, FADEPERCENT));
+
+ g_pDesktopAnimationManager->overrideFullscreenFadeAmount(m_window->m_workspace, m_originalMode == FSMODE_NONE ? 1.F - FADEPERCENT : FADEPERCENT, m_window.lock());
+
+ g_pDecorationPositioner->onWindowUpdate(m_window.lock());
+
+ g_pHyprRenderer->damageWindow(m_window.lock());
+}
+
+void CFullscreenTrackpadGesture::end(const ITrackpadGesture::STrackpadGestureEnd& e) {
+ if (!m_window)
+ return;
+
+ const auto COMPLETION = std::clamp(m_lastDelta / MAX_DISTANCE, 0.F, 1.F);
+
+ if (COMPLETION < 0.2F) {
+ // revert the animation
+ g_pHyprRenderer->damageWindow(m_window.lock());
+ m_window->m_isFloating = !m_window->m_isFloating;
+ g_pDesktopAnimationManager->overrideFullscreenFadeAmount(m_window->m_workspace, m_originalMode == FSMODE_NONE ? 1.F : 0.F, m_window.lock());
+ g_pCompositor->setWindowFullscreenInternal(m_window.lock(), m_window->m_fullscreenState.internal == FSMODE_NONE ? m_originalMode : FSMODE_NONE);
+ return;
+ }
+
+ *m_window->m_realPosition = m_posTo;
+ *m_window->m_realSize = m_sizeTo;
+ g_pDesktopAnimationManager->overrideFullscreenFadeAmount(m_window->m_workspace, m_originalMode == FSMODE_NONE ? 0.F : 1.F);
+}
+
+eFullscreenMode CFullscreenTrackpadGesture::fsModeForMode(eMode mode) {
+ switch (mode) {
+ case MODE_FULLSCREEN: return FSMODE_FULLSCREEN;
+ case MODE_MAXIMIZE: return FSMODE_MAXIMIZED;
+ default: break;
+ }
+ return FSMODE_FULLSCREEN;
+}