From d0a224a4915b5a90555818ed3f9e49e1a61b7cdb Mon Sep 17 00:00:00 2001 From: Agent00Ming <107314235+Agent00Ming@users.noreply.github.com> Date: Mon, 3 Jun 2024 16:47:02 -0400 Subject: [PATCH] seat: discrete round away from zero + high res scrolling (#6317) * Discrete scrolling round away from zero e.deltaDiscrete can be multiples of 30 instead of the usual 120 causing the rounded value to be 0 when too small causing erratic scrolling. * Send value120 alongside discrete Fixes sensitivity issues for clients that support value120 axis events --- src/managers/SeatManager.cpp | 6 ++++-- src/managers/SeatManager.hpp | 4 +++- src/managers/input/InputManager.cpp | 6 ++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp index ce40650d..5fa3d1ae 100644 --- a/src/managers/SeatManager.cpp +++ b/src/managers/SeatManager.cpp @@ -290,7 +290,7 @@ void CSeatManager::sendPointerFrame(WP pResource) { } } -void CSeatManager::sendPointerAxis(uint32_t timeMs, wl_pointer_axis axis, double value, int32_t discrete, wl_pointer_axis_source source, +void CSeatManager::sendPointerAxis(uint32_t timeMs, wl_pointer_axis axis, double value, int32_t discrete, int32_t value120, wl_pointer_axis_source source, wl_pointer_axis_relative_direction relative) { if (!state.pointerFocusResource) return; @@ -303,8 +303,10 @@ void CSeatManager::sendPointerAxis(uint32_t timeMs, wl_pointer_axis axis, double p->sendAxisSource(source); p->sendAxisRelativeDirection(axis, relative); - if (source == 0) + if (source == 0) { + p->sendAxisValue120(axis, value120); p->sendAxisDiscrete(axis, discrete); + } if (value == 0) p->sendAxisStop(timeMs, axis); diff --git a/src/managers/SeatManager.hpp b/src/managers/SeatManager.hpp index b88058a8..35456cb3 100644 --- a/src/managers/SeatManager.hpp +++ b/src/managers/SeatManager.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include "../helpers/WLListener.hpp" #include "../macros.hpp" @@ -65,7 +66,8 @@ class CSeatManager { void sendPointerButton(uint32_t timeMs, uint32_t key, wl_pointer_button_state state); void sendPointerFrame(); void sendPointerFrame(WP pResource); - void sendPointerAxis(uint32_t timeMs, wl_pointer_axis axis, double value, int32_t discrete, wl_pointer_axis_source source, wl_pointer_axis_relative_direction relative); + void sendPointerAxis(uint32_t timeMs, wl_pointer_axis axis, double value, int32_t discrete, int32_t value120, wl_pointer_axis_source source, + wl_pointer_axis_relative_direction relative); void sendTouchDown(wlr_surface* surf, uint32_t timeMs, int32_t id, const Vector2D& local); void sendTouchUp(uint32_t timeMs, int32_t id); diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 5a7688cd..27d04699 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -1,6 +1,7 @@ #include "InputManager.hpp" #include "../../Compositor.hpp" #include "wlr/types/wlr_switch.h" +#include #include #include "../../config/ConfigValue.hpp" #include "../../desktop/Window.hpp" @@ -782,8 +783,9 @@ void CInputManager::onMouseWheel(IPointer::SAxisEvent e) { } } } - - g_pSeatManager->sendPointerAxis(e.timeMs, e.axis, factor * e.delta, std::round(factor * e.deltaDiscrete / 120), e.source, WL_POINTER_AXIS_RELATIVE_DIRECTION_IDENTICAL); + double deltaDiscrete = factor * e.deltaDiscrete / std::abs(e.deltaDiscrete); + g_pSeatManager->sendPointerAxis(e.timeMs, e.axis, factor * e.delta, deltaDiscrete > 0 ? std::ceil(deltaDiscrete) : std::floor(deltaDiscrete), + std::round(factor * e.deltaDiscrete), e.source, WL_POINTER_AXIS_RELATIVE_DIRECTION_IDENTICAL); } Vector2D CInputManager::getMouseCoordsInternal() {