gtkeventcontrollerscroll: Always accumulate discrete deltas

When GTK_EVENT_CONTROLLER_SCROLL_DISCRETE is set, accumulate deltas also
for mouse scroll so a high-resolution mouse wheel click behaves in the
in the same manner as a low-resolution mouse wheel click.
This commit is contained in:
José Expósito 2021-09-20 20:00:04 +02:00 committed by Carlos Garnacho
parent 37a561eb53
commit 95860d4989

View File

@ -85,6 +85,8 @@ struct _GtkEventControllerScroll
/* For discrete event coalescing */
double cur_dx;
double cur_dy;
double last_cur_dx;
double last_cur_dy;
GdkScrollUnit cur_unit;
@ -337,6 +339,17 @@ gtk_event_controller_scroll_handle_hold_event (GtkEventController *controller,
return GDK_EVENT_PROPAGATE;
}
static gboolean
should_reset_discrete_acc (double current_delta,
double last_delta)
{
if (last_delta == 0)
return TRUE;
return (current_delta < 0 && last_delta > 0) ||
(current_delta > 0 && last_delta < 0);
}
static gboolean
gtk_event_controller_scroll_handle_event (GtkEventController *controller,
GdkEvent *event,
@ -422,6 +435,45 @@ gtk_event_controller_scroll_handle_event (GtkEventController *controller,
dy = 0;
if ((scroll->flags & GTK_EVENT_CONTROLLER_SCROLL_HORIZONTAL) == 0)
dx = 0;
if (scroll->flags & GTK_EVENT_CONTROLLER_SCROLL_DISCRETE)
{
int steps;
if (dx != 0)
{
if (should_reset_discrete_acc (dx, scroll->last_cur_dx))
scroll->cur_dx = 0;
scroll->last_cur_dx = dx;
}
if (dy != 0)
{
if (should_reset_discrete_acc (dy, scroll->last_cur_dy))
scroll->cur_dy = 0;
scroll->last_cur_dy = dy;
}
scroll->cur_dx += dx;
scroll->cur_dy += dy;
dx = dy = 0;
if (ABS (scroll->cur_dx) >= 1)
{
steps = trunc (scroll->cur_dx);
scroll->cur_dx -= steps;
dx = steps;
}
if (ABS (scroll->cur_dy) >= 1)
{
steps = trunc (scroll->cur_dy);
scroll->cur_dy -= steps;
dy = steps;
}
}
}
scroll->cur_unit = scroll_unit;