From cf20cfd31e31fb0d5888119ef60e68ddf7582585 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 24 Dec 2020 19:55:39 +0100 Subject: gtk/gesturestylus: Convert motion history from surface coordinates Motion history coordinates are based on GdkSurface coordinates. Transform the coordinates from the GtkNative they are received on, accounting for the possible transforms (e.g. due to window borders and shadows). Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3491 --- gtk/gtkgesturestylus.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/gtk/gtkgesturestylus.c b/gtk/gtkgesturestylus.c index bd6238f3a8..2d49783baf 100644 --- a/gtk/gtkgesturestylus.c +++ b/gtk/gtkgesturestylus.c @@ -35,6 +35,7 @@ #include "gtkintl.h" #include "gtkmarshalers.h" #include "gtkmain.h" +#include "gtknative.h" G_DEFINE_TYPE (GtkGestureStylus, gtk_gesture_stylus, GTK_TYPE_GESTURE_SINGLE) @@ -319,6 +320,8 @@ gtk_gesture_stylus_get_backlog (GtkGestureStylus *gesture, GArray *backlog_array; GdkTimeCoord *history = NULL; guint n_coords = 0, i; + double surf_x, surf_y; + GtkNative *native; g_return_val_if_fail (GTK_IS_GESTURE_STYLUS (gesture), FALSE); g_return_val_if_fail (backlog != NULL && n_elems != NULL, FALSE); @@ -331,6 +334,9 @@ gtk_gesture_stylus_get_backlog (GtkGestureStylus *gesture, if (!history) return FALSE; + native = gtk_widget_get_native (gtk_get_event_widget (event)); + gtk_native_get_surface_transform (native, &surf_x, &surf_y); + backlog_array = g_array_new (FALSE, FALSE, sizeof (GdkTimeCoord)); for (i = 0; i < n_coords; i++) { @@ -339,10 +345,11 @@ gtk_gesture_stylus_get_backlog (GtkGestureStylus *gesture, g_array_append_val (backlog_array, *time_coord); time_coord = &g_array_index (backlog_array, GdkTimeCoord, backlog_array->len - 1); - if (gtk_widget_compute_point (gtk_get_event_widget (event), + + if (gtk_widget_compute_point (GTK_WIDGET (native), gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)), - &GRAPHENE_POINT_INIT (time_coord->axes[GDK_AXIS_X], - time_coord->axes[GDK_AXIS_Y]), + &GRAPHENE_POINT_INIT (time_coord->axes[GDK_AXIS_X] - surf_x, + time_coord->axes[GDK_AXIS_Y] - surf_y), &p)) { time_coord->axes[GDK_AXIS_X] = p.x; -- cgit v1.2.1