summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Mikhaylenko <alexm@gnome.org>2022-04-29 19:39:03 +0400
committerAlexander Mikhaylenko <alexm@gnome.org>2022-04-29 19:39:03 +0400
commit7ac3e5ac5341185296f5b20f5e14a44714aa3549 (patch)
tree68ea3668fa12800051cfa2a24e4c84e656465735
parentb3f04413b486bd3eb7fbb13658b60aa4c517cd1c (diff)
downloadgtk+-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.c2
-rw-r--r--gdk/gdkevents.c39
-rw-r--r--gdk/gdkeventsprivate.h8
-rw-r--r--gdk/macos/gdkmacosdisplay-translate.c6
-rw-r--r--gdk/wayland/gdkdevice-wayland.c8
-rw-r--r--gdk/win32/gdkevents-win32.c4
-rw-r--r--gdk/x11/gdkdevicemanager-xi2.c6
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,