[gtk/wip/carlosg/for-master] gtk/gesturestylus: Convert motion history from surface coordinates




commit cf20cfd31e31fb0d5888119ef60e68ddf7582585
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Dec 24 19:55:39 2020 +0100

    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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]