summaryrefslogtreecommitdiff
path: root/src/managers
diff options
context:
space:
mode:
authorbea4dev <34712108+bea4dev@users.noreply.github.com>2026-02-10 23:51:51 +0900
committerGitHub <noreply@github.com>2026-02-10 14:51:51 +0000
commit171ad7d3387c8f1f090285ba913805c0bf27a342 (patch)
treea9201b284c016c2d5c86ebe56b31436389f01218 /src/managers
parentf16ebef00366d2f85499196b9c7fb702b9f1c547 (diff)
input: fix kinetic scroll (#13233)
Diffstat (limited to 'src/managers')
-rw-r--r--src/managers/PointerManager.cpp3
-rw-r--r--src/managers/PointerManager.hpp1
-rw-r--r--src/managers/input/InputManager.cpp16
-rw-r--r--src/managers/input/InputManager.hpp2
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);