diff options
author | panoplie <59100-panoplie@users.noreply.gitlab.gnome.org> | 2022-02-21 16:22:57 +0100 |
---|---|---|
committer | panoplie <59100-panoplie@users.noreply.gitlab.gnome.org> | 2022-03-19 00:41:26 +0100 |
commit | fb4927827b71c3bd5d892cb338761a2862461f28 (patch) | |
tree | 333c7d76288052ec108cdb138a87e41d54e370ad /gdk/gdkevents.c | |
parent | 8f9ee48aaa50d79dbc49f98cdb6244aa6ff39975 (diff) | |
download | gtk+-fb4927827b71c3bd5d892cb338761a2862461f28.tar.gz |
gdk: Add enum to indicate the unit of scroll deltas
Add a new GdkScrollUnit enum that represent the
unit of scroll deltas provided by GdkScrollEvent.
The unit is accessible through
gdk_scroll_event_get_unit().
Diffstat (limited to 'gdk/gdkevents.c')
-rw-r--r-- | gdk/gdkevents.c | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index 127e92e547..2ce9b8b72a 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -597,7 +597,8 @@ _gdk_event_unqueue (GdkDisplay *display) /* * If the last N events in the event queue are smooth scroll events - * for the same surface and device, combine them into one. + * for the same surface, the same device and the same scroll unit, + * combine them into one. * * We give the remaining event a history with N items, and deltas * that are the sum over the history entries. @@ -611,6 +612,8 @@ gdk_event_queue_handle_scroll_compression (GdkDisplay *display) GdkEvent *last_event = NULL; GList *scrolls = NULL; GArray *history = NULL; + GdkScrollUnit scroll_unit = GDK_SCROLL_UNIT_WHEEL; + gboolean scroll_unit_defined = FALSE; GdkTimeCoord hist; l = g_queue_peek_tail_link (&display->queued_events); @@ -618,6 +621,7 @@ gdk_event_queue_handle_scroll_compression (GdkDisplay *display) while (l) { GdkEvent *event = l->data; + GdkScrollEvent *scroll_event = (GdkScrollEvent *) event; if (event->flags & GDK_EVENT_PENDING) break; @@ -634,11 +638,17 @@ gdk_event_queue_handle_scroll_compression (GdkDisplay *display) device != event->device) break; + if (scroll_unit_defined && + scroll_unit != scroll_event->unit) + break; + if (!last_event) last_event = event; surface = event->surface; device = event->device; + scroll_unit = scroll_event->unit; + scroll_unit_defined = TRUE; scrolls = l; l = l->prev; @@ -710,7 +720,8 @@ gdk_event_queue_handle_scroll_compression (GdkDisplay *display) gdk_event_get_modifier_state (old_event), dx, dy, - gdk_scroll_event_is_stop (old_event)); + gdk_scroll_event_is_stop (old_event), + scroll_unit); ((GdkScrollEvent *)event)->history = history; @@ -2334,7 +2345,8 @@ gdk_scroll_event_new (GdkSurface *surface, GdkModifierType state, double delta_x, double delta_y, - gboolean is_stop) + gboolean is_stop, + GdkScrollUnit unit) { GdkScrollEvent *self = gdk_event_alloc (GDK_SCROLL, surface, device, time); @@ -2344,6 +2356,7 @@ gdk_scroll_event_new (GdkSurface *surface, self->delta_x = delta_x; self->delta_y = delta_y; self->is_stop = is_stop; + self->unit = unit; return (GdkEvent *) self; } @@ -2363,6 +2376,7 @@ gdk_scroll_event_new_discrete (GdkSurface *surface, self->state = state; self->direction = direction; self->pointer_emulated = emulated; + self->unit = GDK_SCROLL_UNIT_WHEEL; return (GdkEvent *) self; } @@ -2396,6 +2410,9 @@ gdk_scroll_event_get_direction (GdkEvent *event) * * The deltas will be zero unless the scroll direction * is %GDK_SCROLL_SMOOTH. + * + * For the representation unit of these deltas, see + * [method@Gdk.ScrollEvent.get_unit]. */ void gdk_scroll_event_get_deltas (GdkEvent *event, @@ -2438,6 +2455,31 @@ gdk_scroll_event_is_stop (GdkEvent *event) return self->is_stop; } +/** + * gdk_scroll_event_get_unit: + * @event: (type GdkScrollEvent): a scroll event. + * + * Extracts the scroll delta unit of a scroll event. + * + * The unit will always be %GDK_SCROLL_UNIT_WHEEL if the scroll direction is not + * %GDK_SCROLL_SMOOTH. + * + * Returns: the scroll unit. + * + * Since: 4.8 + */ +GdkScrollUnit +gdk_scroll_event_get_unit (GdkEvent *event) +{ + GdkScrollEvent *self = (GdkScrollEvent *) event; + + g_return_val_if_fail (GDK_IS_EVENT (event), GDK_SCROLL_UNIT_WHEEL); + g_return_val_if_fail (GDK_IS_EVENT_TYPE (event, GDK_SCROLL), + GDK_SCROLL_UNIT_WHEEL); + + return self->unit; +} + /* }}} */ /* {{{ GdkTouchpadEvent */ |