mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
input: slow trackpad scrolling now eventually scroll a line
Before, we converted each axis event's scroll amount to an integer and scrolled that many lines. However, axis events are speed sensitive - very slow scrolling will result in events with a scroll amount that is < 1.0. For us, this meant we never scrolled a single line. You could slow scroll all day if you wanted, and still we would never scroll a single line. Fix this by aggregating the scroll amount from axis events until the scroll amount is > 1.0, and then scroll.
This commit is contained in:
parent
03bdb40bd9
commit
00dbe12e41
3 changed files with 19 additions and 1 deletions
|
|
@ -48,6 +48,7 @@
|
|||
* Hostname in OSC 7 URI not being validated.
|
||||
* OSC 4 with multiple `c;spec` pairs.
|
||||
* Alt+Return to emit "ESC \r".
|
||||
* Trackpad sloooow scrolling to eventually scroll a line.
|
||||
|
||||
|
||||
### Security
|
||||
|
|
|
|||
18
input.c
18
input.c
|
|
@ -1295,7 +1295,18 @@ wl_pointer_axis(void *data, struct wl_pointer *wl_pointer,
|
|||
if (wayl->mouse.have_discrete)
|
||||
return;
|
||||
|
||||
mouse_scroll(wayl, wl_fixed_to_int(value));
|
||||
/*
|
||||
* Aggregate scrolled amount until we get at least 1.0
|
||||
*
|
||||
* Without this, very slow scrolling will never actually scroll
|
||||
* anything.
|
||||
*/
|
||||
wayl->mouse.axis_aggregated += wl_fixed_to_double(value);
|
||||
|
||||
if (fabs(wayl->mouse.axis_aggregated) >= 1.) {
|
||||
mouse_scroll(wayl, round(wayl->mouse.axis_aggregated));
|
||||
wayl->mouse.axis_aggregated = 0.;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -1327,6 +1338,11 @@ static void
|
|||
wl_pointer_axis_stop(void *data, struct wl_pointer *wl_pointer,
|
||||
uint32_t time, uint32_t axis)
|
||||
{
|
||||
if (axis != WL_POINTER_AXIS_VERTICAL_SCROLL)
|
||||
return;
|
||||
|
||||
struct wayland *wayl = data;
|
||||
wayl->mouse.axis_aggregated = 0.;
|
||||
}
|
||||
|
||||
const struct wl_pointer_listener pointer_listener = {
|
||||
|
|
|
|||
|
|
@ -292,6 +292,7 @@ struct wayland {
|
|||
struct timeval last_time;
|
||||
|
||||
/* We used a discrete axis event in the current pointer frame */
|
||||
double axis_aggregated;
|
||||
bool have_discrete;
|
||||
} mouse;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue