diff options
| author | bea4dev <34712108+bea4dev@users.noreply.github.com> | 2026-02-10 23:51:51 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-10 14:51:51 +0000 |
| commit | 171ad7d3387c8f1f090285ba913805c0bf27a342 (patch) | |
| tree | a9201b284c016c2d5c86ebe56b31436389f01218 /src/managers | |
| parent | f16ebef00366d2f85499196b9c7fb702b9f1c547 (diff) | |
input: fix kinetic scroll (#13233)
Diffstat (limited to 'src/managers')
| -rw-r--r-- | src/managers/PointerManager.cpp | 3 | ||||
| -rw-r--r-- | src/managers/PointerManager.hpp | 1 | ||||
| -rw-r--r-- | src/managers/input/InputManager.cpp | 16 | ||||
| -rw-r--r-- | src/managers/input/InputManager.hpp | 2 |
4 files changed, 21 insertions, 1 deletions
diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index 5db37cb0..57e25791 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -935,10 +935,11 @@ void CPointerManager::attachPointer(SP<IPointer> pointer) { PROTO::idle->onActivity(); }); - listener->axis = pointer->m_pointerEvents.axis.listen([weak = WP<IPointer>(pointer)](const IPointer::SAxisEvent& event) { + listener->axis = pointer->m_pointerEvents.axis.listen([weak = WP<IPointer>(pointer)](const IPointer::SAxisEvent& event) { g_pInputManager->onMouseWheel(event, weak.lock()); PROTO::idle->onActivity(); }); + listener->frame = pointer->m_pointerEvents.frame.listen([] { g_pInputManager->onPointerFrame(); }); listener->swipeBegin = pointer->m_pointerEvents.swipeBegin.listen([](const IPointer::SSwipeBeginEvent& event) { g_pInputManager->onSwipeBegin(event); diff --git a/src/managers/PointerManager.hpp b/src/managers/PointerManager.hpp index 29603513..4b8ec65a 100644 --- a/src/managers/PointerManager.hpp +++ b/src/managers/PointerManager.hpp @@ -93,6 +93,7 @@ class CPointerManager { CHyprSignalListener motionAbsolute; CHyprSignalListener button; CHyprSignalListener axis; + CHyprSignalListener frame; CHyprSignalListener swipeBegin; CHyprSignalListener swipeEnd; diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 054677fa..860a4b78 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -952,6 +952,22 @@ void CInputManager::onMouseWheel(IPointer::SAxisEvent e, SP<IPointer> pointer) { int32_t deltaDiscrete = std::abs(discrete) != 0 && std::abs(discrete) < 1 ? std::copysign(1, discrete) : std::round(discrete); g_pSeatManager->sendPointerAxis(e.timeMs, e.axis, delta, deltaDiscrete, value120, e.source, WL_POINTER_AXIS_RELATIVE_DIRECTION_IDENTICAL); + + const bool deferPointerFrame = e.source == WL_POINTER_AXIS_SOURCE_FINGER || e.source == WL_POINTER_AXIS_SOURCE_CONTINUOUS; + if (deferPointerFrame) { + m_pointerAxisFramePending = true; + return; + } + + m_pointerAxisFramePending = false; + g_pSeatManager->sendPointerFrame(); +} + +void CInputManager::onPointerFrame() { + if (!m_pointerAxisFramePending) + return; + + m_pointerAxisFramePending = false; g_pSeatManager->sendPointerFrame(); } diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp index 239f6140..c1e0bbfb 100644 --- a/src/managers/input/InputManager.hpp +++ b/src/managers/input/InputManager.hpp @@ -91,6 +91,7 @@ class CInputManager { void onMouseWarp(IPointer::SMotionAbsoluteEvent); void onMouseButton(IPointer::SButtonEvent); void onMouseWheel(IPointer::SAxisEvent, SP<IPointer> pointer = nullptr); + void onPointerFrame(); void onKeyboardKey(const IKeyboard::SKeyEvent&, SP<IKeyboard>); void onKeyboardMod(SP<IKeyboard>); @@ -299,6 +300,7 @@ class CInputManager { uint32_t lastEventTime = 0; uint32_t accumulatedScroll = 0; } m_scrollWheelState; + bool m_pointerAxisFramePending = false; bool shareKeyFromAllKBs(uint32_t key, bool pressed); uint32_t shareModsFromAllKBs(uint32_t depressed); |
