mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-14 05:33:59 -04: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.
|
* Hostname in OSC 7 URI not being validated.
|
||||||
* OSC 4 with multiple `c;spec` pairs.
|
* OSC 4 with multiple `c;spec` pairs.
|
||||||
* Alt+Return to emit "ESC \r".
|
* Alt+Return to emit "ESC \r".
|
||||||
|
* Trackpad sloooow scrolling to eventually scroll a line.
|
||||||
|
|
||||||
|
|
||||||
### Security
|
### 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)
|
if (wayl->mouse.have_discrete)
|
||||||
return;
|
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
|
static void
|
||||||
|
|
@ -1327,6 +1338,11 @@ static void
|
||||||
wl_pointer_axis_stop(void *data, struct wl_pointer *wl_pointer,
|
wl_pointer_axis_stop(void *data, struct wl_pointer *wl_pointer,
|
||||||
uint32_t time, uint32_t axis)
|
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 = {
|
const struct wl_pointer_listener pointer_listener = {
|
||||||
|
|
|
||||||
|
|
@ -292,6 +292,7 @@ struct wayland {
|
||||||
struct timeval last_time;
|
struct timeval last_time;
|
||||||
|
|
||||||
/* We used a discrete axis event in the current pointer frame */
|
/* We used a discrete axis event in the current pointer frame */
|
||||||
|
double axis_aggregated;
|
||||||
bool have_discrete;
|
bool have_discrete;
|
||||||
} mouse;
|
} mouse;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue