summaryrefslogtreecommitdiff
path: root/gdk/gdkevents.c
diff options
context:
space:
mode:
authorpanoplie <59100-panoplie@users.noreply.gitlab.gnome.org>2022-02-21 16:22:57 +0100
committerpanoplie <59100-panoplie@users.noreply.gitlab.gnome.org>2022-03-19 00:41:26 +0100
commitfb4927827b71c3bd5d892cb338761a2862461f28 (patch)
tree333c7d76288052ec108cdb138a87e41d54e370ad /gdk/gdkevents.c
parent8f9ee48aaa50d79dbc49f98cdb6244aa6ff39975 (diff)
downloadgtk+-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.c48
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 */