diff options
author | Alexander Mikhaylenko <alexm@gnome.org> | 2022-04-29 19:39:03 +0400 |
---|---|---|
committer | Alexander Mikhaylenko <alexm@gnome.org> | 2022-04-29 19:39:03 +0400 |
commit | 7ac3e5ac5341185296f5b20f5e14a44714aa3549 (patch) | |
tree | 68ea3668fa12800051cfa2a24e4c84e656465735 | |
parent | b3f04413b486bd3eb7fbb13658b60aa4c517cd1c (diff) | |
download | gtk+-7ac3e5ac5341185296f5b20f5e14a44714aa3549.tar.gz |
events: Give scroll events pointer position
We'll need to have it for parity with touchpad swipes to use in GtkGesture.
FIXME: do we want to stop accumulation when position changes?
-rw-r--r-- | gdk/broadway/gdkeventsource.c | 2 | ||||
-rw-r--r-- | gdk/gdkevents.c | 39 | ||||
-rw-r--r-- | gdk/gdkeventsprivate.h | 8 | ||||
-rw-r--r-- | gdk/macos/gdkmacosdisplay-translate.c | 6 | ||||
-rw-r--r-- | gdk/wayland/gdkdevice-wayland.c | 8 | ||||
-rw-r--r-- | gdk/win32/gdkevents-win32.c | 4 | ||||
-rw-r--r-- | gdk/x11/gdkdevicemanager-xi2.c | 6 |
7 files changed, 72 insertions, 1 deletions
diff --git a/gdk/broadway/gdkeventsource.c b/gdk/broadway/gdkeventsource.c index 9ae9022a41..cab92dbf37 100644 --- a/gdk/broadway/gdkeventsource.c +++ b/gdk/broadway/gdkeventsource.c @@ -187,6 +187,8 @@ _gdk_broadway_events_got_input (GdkDisplay *display, NULL, message->base.time, message->pointer.state, + message->pointer.win_x, + message->pointer.win_y, message->scroll.dir == 0 ? GDK_SCROLL_UP : GDK_SCROLL_DOWN, diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index cc06e5e0c0..b43e9b3d3a 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -615,6 +615,8 @@ gdk_event_queue_handle_scroll_compression (GdkDisplay *display) GdkScrollUnit scroll_unit = GDK_SCROLL_UNIT_WHEEL; gboolean scroll_unit_defined = FALSE; GdkTimeCoord hist; + double x = 0.0, y = 0.0; + gboolean has_coords = FALSE; l = g_queue_peek_tail_link (&display->queued_events); @@ -622,6 +624,7 @@ gdk_event_queue_handle_scroll_compression (GdkDisplay *display) { GdkEvent *event = l->data; GdkScrollEvent *scroll_event = (GdkScrollEvent *) event; + double event_x, event_y; if (event->flags & GDK_EVENT_PENDING) break; @@ -642,6 +645,14 @@ gdk_event_queue_handle_scroll_compression (GdkDisplay *display) scroll_unit != scroll_event->unit) break; + gdk_event_get_position (event, &event_x, &event_y); + + if (has_coords && x != event_x) + break; + + if (has_coords && y != event_y) // FIXME do we want this? + break; + if (!last_event) last_event = event; @@ -649,6 +660,9 @@ gdk_event_queue_handle_scroll_compression (GdkDisplay *display) device = event->device; scroll_unit = scroll_event->unit; scroll_unit_defined = TRUE; + has_coords = TRUE; + x = event_x; + y = event_y; scrolls = l; l = l->prev; @@ -718,6 +732,8 @@ gdk_event_queue_handle_scroll_compression (GdkDisplay *display) gdk_event_get_device_tool (old_event), gdk_event_get_time (old_event), gdk_event_get_modifier_state (old_event), + x, + y, dx, dy, gdk_scroll_event_is_stop (old_event), @@ -2320,6 +2336,19 @@ gdk_scroll_event_get_state (GdkEvent *event) return self->state; } +static gboolean +gdk_scroll_event_get_position (GdkEvent *event, + double *x, + double *y) +{ + GdkScrollEvent *self = (GdkScrollEvent *) event; + + *x = self->x; + *y = self->y; + + return TRUE; +} + static GdkDeviceTool * gdk_scroll_event_get_tool (GdkEvent *event) { @@ -2333,7 +2362,7 @@ static const GdkEventTypeInfo gdk_scroll_event_info = { NULL, gdk_scroll_event_finalize, gdk_scroll_event_get_state, - NULL, + gdk_scroll_event_get_position, NULL, gdk_scroll_event_get_tool, NULL, @@ -2349,6 +2378,8 @@ gdk_scroll_event_new (GdkSurface *surface, GdkDeviceTool *tool, guint32 time, GdkModifierType state, + double x, + double y, double delta_x, double delta_y, gboolean is_stop, @@ -2359,6 +2390,8 @@ gdk_scroll_event_new (GdkSurface *surface, self->tool = tool != NULL ? g_object_ref (tool) : NULL; self->state = state; self->direction = GDK_SCROLL_SMOOTH; + self->x = x; + self->y = y; self->delta_x = delta_x; self->delta_y = delta_y; self->is_stop = is_stop; @@ -2373,6 +2406,8 @@ gdk_scroll_event_new_discrete (GdkSurface *surface, GdkDeviceTool *tool, guint32 time, GdkModifierType state, + double x, + double y, GdkScrollDirection direction, gboolean emulated) { @@ -2380,6 +2415,8 @@ gdk_scroll_event_new_discrete (GdkSurface *surface, self->tool = tool != NULL ? g_object_ref (tool) : NULL; self->state = state; + self->x = x; + self->y = y; self->direction = direction; self->pointer_emulated = emulated; self->unit = GDK_SCROLL_UNIT_WHEEL; diff --git a/gdk/gdkeventsprivate.h b/gdk/gdkeventsprivate.h index 3b1bcd4b94..4644180490 100644 --- a/gdk/gdkeventsprivate.h +++ b/gdk/gdkeventsprivate.h @@ -204,6 +204,8 @@ struct _GdkTouchEvent * @direction: the direction to scroll to (one of %GDK_SCROLL_UP, * %GDK_SCROLL_DOWN, %GDK_SCROLL_LEFT, %GDK_SCROLL_RIGHT or * %GDK_SCROLL_SMOOTH). + * @x: the x coordinate of the pointer + * @y: the y coordinate of the pointer * @delta_x: the x coordinate of the scroll delta * @delta_y: the y coordinate of the scroll delta * @pointer_emulated: whether the scroll event was the result of @@ -229,6 +231,8 @@ struct _GdkScrollEvent GdkModifierType state; GdkScrollDirection direction; + double x; + double y; double delta_x; double delta_y; gboolean pointer_emulated; @@ -486,6 +490,8 @@ GdkEvent * gdk_scroll_event_new (GdkSurface *surface, GdkDeviceTool *tool, guint32 time, GdkModifierType state, + double x, + double y, double delta_x, double delta_y, gboolean is_stop, @@ -496,6 +502,8 @@ GdkEvent * gdk_scroll_event_new_discrete (GdkSurface *surface, GdkDeviceTool *tool, guint32 time, GdkModifierType state, + double x, + double y, GdkScrollDirection direction, gboolean emulated); diff --git a/gdk/macos/gdkmacosdisplay-translate.c b/gdk/macos/gdkmacosdisplay-translate.c index 7767faef67..e3451b5903 100644 --- a/gdk/macos/gdkmacosdisplay-translate.c +++ b/gdk/macos/gdkmacosdisplay-translate.c @@ -644,6 +644,7 @@ fill_scroll_event (GdkMacosDisplay *self, NULL, get_time_from_ns_event (nsevent), state, + x, y, 0.0, 0.0, TRUE, GDK_SCROLL_UNIT_SURFACE); @@ -664,6 +665,8 @@ fill_scroll_event (GdkMacosDisplay *self, NULL, get_time_from_ns_event (nsevent), state, + x, + y, -sx, -sy, FALSE, @@ -700,6 +703,8 @@ fill_scroll_event (GdkMacosDisplay *self, NULL, get_time_from_ns_event (nsevent), state, + x, + y, direction, FALSE); } @@ -716,6 +721,7 @@ fill_scroll_event (GdkMacosDisplay *self, NULL, get_time_from_ns_event (nsevent), state, + x, y, 0.0, 0.0, TRUE, GDK_SCROLL_UNIT_SURFACE); } diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c index 2446bddab3..1a0dbe0d74 100644 --- a/gdk/wayland/gdkdevice-wayland.c +++ b/gdk/wayland/gdkdevice-wayland.c @@ -1394,6 +1394,8 @@ flush_discrete_scroll_event (GdkWaylandSeat *seat, NULL, seat->pointer_info.time, device_get_modifiers (seat->logical_pointer), + seat->pointer_info.surface_x, + seat->pointer_info.surface_y, direction, TRUE); @@ -1415,6 +1417,8 @@ flush_smooth_scroll_event (GdkWaylandSeat *seat, NULL, seat->pointer_info.time, device_get_modifiers (seat->logical_pointer), + seat->pointer_info.surface_x, + seat->pointer_info.surface_y, delta_x, delta_y, is_stop, GDK_SCROLL_UNIT_SURFACE); @@ -3994,6 +3998,8 @@ tablet_tool_handle_wheel (void *data, tablet->current_tool->tool, tablet->pointer_info.time, device_get_modifiers (tablet->logical_device), + tablet->pointer_info.surface_x, + tablet->pointer_info.surface_y, 0, clicks, FALSE, GDK_SCROLL_UNIT_WHEEL); @@ -4006,6 +4012,8 @@ tablet_tool_handle_wheel (void *data, tablet->current_tool->tool, tablet->pointer_info.time, device_get_modifiers (tablet->logical_device), + tablet->pointer_info.surface_x, + tablet->pointer_info.surface_y, clicks > 0 ? GDK_SCROLL_DOWN : GDK_SCROLL_UP, TRUE); diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index a5306a42cd..845ab48390 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -2727,6 +2727,8 @@ gdk_event_translate (MSG *msg, NULL, _gdk_win32_get_next_tick (msg->time), build_pointer_event_state (msg), + point.x, + point.y, delta_x, delta_y, FALSE, @@ -2748,6 +2750,8 @@ gdk_event_translate (MSG *msg, NULL, _gdk_win32_get_next_tick (msg->time), build_pointer_event_state (msg), + point.x, + point.y, direction, TRUE); diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c index 214f6b1ea2..860d2a30ef 100644 --- a/gdk/x11/gdkdevicemanager-xi2.c +++ b/gdk/x11/gdkdevicemanager-xi2.c @@ -1663,6 +1663,8 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator, NULL, xev->time, _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons, &xev->group), + (double) xev->event_x / scale, + (double) xev->event_x / scale, direction, FALSE); @@ -1766,6 +1768,8 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator, NULL, xev->time, state, + (double) xev->event_x / scale, + (double) xev->event_y / scale, direction, FALSE); } @@ -1776,6 +1780,8 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator, NULL, xev->time, state, + (double) xev->event_x / scale, + (double) xev->event_y / scale, delta_x, delta_y, delta_x == 0.0 && delta_y == 0.0, |