summaryrefslogtreecommitdiff
path: root/src/managers/input/Swipe.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-07-07 11:52:12 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-07-07 13:49:04 +0200
commit4b796d30c190e14aa39a9540395523cee27bd348 (patch)
tree3ad84df935c95aa18bbc47e80f290e1f38a8f365 /src/managers/input/Swipe.cpp
parent1cf2f378d4a0e5e3da757d90404c2816a6765626 (diff)
Added swipe workspace gestures
Diffstat (limited to 'src/managers/input/Swipe.cpp')
-rw-r--r--src/managers/input/Swipe.cpp149
1 files changed, 149 insertions, 0 deletions
diff --git a/src/managers/input/Swipe.cpp b/src/managers/input/Swipe.cpp
new file mode 100644
index 00000000..df88782f
--- /dev/null
+++ b/src/managers/input/Swipe.cpp
@@ -0,0 +1,149 @@
+#include "InputManager.hpp"
+#include "../../Compositor.hpp"
+
+void CInputManager::onSwipeBegin(wlr_pointer_swipe_begin_event* e) {
+
+ static auto *const PSWIPE = &g_pConfigManager->getConfigValuePtr("gestures:workspace_swipe")->intValue;
+
+ if (e->fingers < 3 || *PSWIPE == 0)
+ return;
+
+ const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(g_pCompositor->m_pLastMonitor->activeWorkspace);
+
+ Debug::log(LOG, "Starting a swipe from %s", PWORKSPACE->m_szName.c_str());
+
+ m_sActiveSwipe.pWorkspaceBegin = PWORKSPACE;
+ m_sActiveSwipe.delta = 0;
+ m_sActiveSwipe.pMonitor = g_pCompositor->m_pLastMonitor;
+ m_sActiveSwipe.avgSpeed = 0;
+ m_sActiveSwipe.speedPoints = 0;
+}
+
+void CInputManager::onSwipeEnd(wlr_pointer_swipe_end_event* e) {
+
+ static auto *const PSWIPEPERC = &g_pConfigManager->getConfigValuePtr("gestures:workspace_swipe_cancel_ratio")->floatValue;
+ static auto *const PSWIPEDIST = &g_pConfigManager->getConfigValuePtr("gestures:workspace_swipe_distance")->intValue;
+ static auto *const PSWIPEFORC = &g_pConfigManager->getConfigValuePtr("gestures:workspace_swipe_min_speed_to_force")->intValue;
+
+ // commit
+ std::string wsname = "";
+ auto workspaceIDLeft = getWorkspaceIDFromString("m-1", wsname);
+ auto workspaceIDRight = getWorkspaceIDFromString("m+1", wsname);
+
+ const auto PWORKSPACER = g_pCompositor->getWorkspaceByID(workspaceIDRight);
+ const auto PWORKSPACEL = g_pCompositor->getWorkspaceByID(workspaceIDLeft);
+
+ const auto RENDEROFFSETMIDDLE = m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset.vec();
+
+ if ((abs(m_sActiveSwipe.delta) < *PSWIPEDIST * *PSWIPEPERC && (*PSWIPEFORC == 0 || (*PSWIPEFORC != 0 && m_sActiveSwipe.avgSpeed < *PSWIPEFORC))) || abs(m_sActiveSwipe.delta) < 2) {
+ // revert
+ if (m_sActiveSwipe.delta < 0) {
+ // to left
+ PWORKSPACEL->m_vRenderOffset = Vector2D({-m_sActiveSwipe.pMonitor->vecSize.x, 0});
+ } else {
+ // to right
+ PWORKSPACER->m_vRenderOffset = Vector2D({m_sActiveSwipe.pMonitor->vecSize.x, 0});
+ }
+
+ m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset = Vector2D();
+ } else if (m_sActiveSwipe.delta < 0) {
+ // switch to left
+ const auto RENDEROFFSET = PWORKSPACEL->m_vRenderOffset.vec();
+
+ g_pKeybindManager->m_mDispatchers["workspace"]("[internal]" + std::to_string(workspaceIDLeft));
+
+ PWORKSPACEL->m_vRenderOffset.setValue(RENDEROFFSET);
+ PWORKSPACEL->m_fAlpha.setValueAndWarp(255.f);
+
+ Debug::log(LOG, "Ended swipe to the left");
+ } else {
+ // switch to right
+ const auto RENDEROFFSET = PWORKSPACER->m_vRenderOffset.vec();
+
+ g_pKeybindManager->m_mDispatchers["workspace"]("[internal]" + std::to_string(workspaceIDRight));
+
+ PWORKSPACER->m_vRenderOffset.setValue(RENDEROFFSET);
+ PWORKSPACER->m_fAlpha.setValueAndWarp(255.f);
+
+ Debug::log(LOG, "Ended swipe to the right");
+ }
+
+ m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset.setValue(RENDEROFFSETMIDDLE);
+ m_sActiveSwipe.pWorkspaceBegin->m_fAlpha.setValueAndWarp(255.f);
+
+ PWORKSPACEL->m_bForceRendering = false;
+ PWORKSPACER->m_bForceRendering = false;
+ m_sActiveSwipe.pWorkspaceBegin->m_bForceRendering = false;
+
+ m_sActiveSwipe.pWorkspaceBegin = nullptr;
+
+ g_pInputManager->refocus();
+}
+
+void CInputManager::onSwipeUpdate(wlr_pointer_swipe_update_event* e) {
+ if (!m_sActiveSwipe.pWorkspaceBegin)
+ return;
+
+ static auto *const PSWIPEDIST = &g_pConfigManager->getConfigValuePtr("gestures:workspace_swipe_distance")->intValue;
+ static auto *const PSWIPEINVR = &g_pConfigManager->getConfigValuePtr("gestures:workspace_swipe_invert")->intValue;
+
+ m_sActiveSwipe.delta += *PSWIPEINVR ? -e->dx : e->dx;
+
+ m_sActiveSwipe.avgSpeed = (m_sActiveSwipe.avgSpeed * m_sActiveSwipe.speedPoints + abs(e->dx)) / (m_sActiveSwipe.speedPoints + 1);
+ m_sActiveSwipe.speedPoints++;
+
+ std::string wsname = "";
+ auto workspaceIDLeft = getWorkspaceIDFromString("m-1", wsname);
+ auto workspaceIDRight = getWorkspaceIDFromString("m+1", wsname);
+
+ if (workspaceIDLeft == INT_MAX || workspaceIDRight == INT_MAX)
+ return;
+
+ m_sActiveSwipe.delta = std::clamp(m_sActiveSwipe.delta, (double)-*PSWIPEDIST, (double)*PSWIPEDIST);
+
+ if (m_sActiveSwipe.delta < 0) {
+ if (workspaceIDLeft > m_sActiveSwipe.pWorkspaceBegin->m_iID){
+ m_sActiveSwipe.delta = 0;
+ return;
+ }
+
+ const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(workspaceIDLeft);
+
+ PWORKSPACE->m_bForceRendering = true;
+
+ if (workspaceIDLeft != workspaceIDRight) {
+ const auto PWORKSPACER = g_pCompositor->getWorkspaceByID(workspaceIDRight);
+
+ PWORKSPACER->m_bForceRendering = false;
+ }
+
+ PWORKSPACE->m_vRenderOffset.setValueAndWarp(Vector2D(((- m_sActiveSwipe.delta) / *PSWIPEDIST) * m_sActiveSwipe.pMonitor->vecSize.x - m_sActiveSwipe.pMonitor->vecSize.x, 0));
+ m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset.setValueAndWarp(Vector2D(((- m_sActiveSwipe.delta) / *PSWIPEDIST) * m_sActiveSwipe.pMonitor->vecSize.x, 0));
+
+ g_pCompositor->updateWorkspaceWindowDecos(workspaceIDLeft);
+ } else {
+ if (workspaceIDRight < m_sActiveSwipe.pWorkspaceBegin->m_iID){
+ m_sActiveSwipe.delta = 0;
+ return;
+ }
+
+ const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(workspaceIDRight);
+
+ PWORKSPACE->m_bForceRendering = true;
+
+ if (workspaceIDLeft != workspaceIDRight) {
+ const auto PWORKSPACEL = g_pCompositor->getWorkspaceByID(workspaceIDLeft);
+
+ PWORKSPACEL->m_bForceRendering = false;
+ }
+
+ PWORKSPACE->m_vRenderOffset.setValueAndWarp(Vector2D(((- m_sActiveSwipe.delta) / *PSWIPEDIST) * m_sActiveSwipe.pMonitor->vecSize.x + m_sActiveSwipe.pMonitor->vecSize.x, 0));
+ m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset.setValueAndWarp(Vector2D(((- m_sActiveSwipe.delta) / *PSWIPEDIST) * m_sActiveSwipe.pMonitor->vecSize.x, 0));
+
+ g_pCompositor->updateWorkspaceWindowDecos(workspaceIDRight);
+ }
+
+ g_pHyprRenderer->damageMonitor(m_sActiveSwipe.pMonitor);
+
+ g_pCompositor->updateWorkspaceWindowDecos(m_sActiveSwipe.pWorkspaceBegin->m_iID);
+} \ No newline at end of file