diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-07-07 11:52:12 +0200 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-07-07 13:49:04 +0200 |
| commit | 4b796d30c190e14aa39a9540395523cee27bd348 (patch) | |
| tree | 3ad84df935c95aa18bbc47e80f290e1f38a8f365 /src/managers/input/Swipe.cpp | |
| parent | 1cf2f378d4a0e5e3da757d90404c2816a6765626 (diff) | |
Added swipe workspace gestures
Diffstat (limited to 'src/managers/input/Swipe.cpp')
| -rw-r--r-- | src/managers/input/Swipe.cpp | 149 |
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 |
