[gtk] widget: Don't duplicate events to translate coordinates



commit 960e766206a643bff3b8c6441a23f1355562b4bd
Author: Timm Bäder <mail baedert org>
Date:   Tue Aug 13 12:29:00 2019 +0200

    widget: Don't duplicate events to translate coordinates

 gtk/gtkwidget.c        | 64 +++++++++++++++++++++++++++++---------------------
 gtk/gtkwidget.h        |  2 +-
 gtk/gtkwidgetprivate.h |  4 ++--
 3 files changed, 40 insertions(+), 30 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index f8060611d1..8f26578cb1 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -652,8 +652,8 @@ static void             gtk_widget_propagate_state              (GtkWidget
                                                                  const GtkStateData *data);
 static void             gtk_widget_update_alpha                 (GtkWidget        *widget);
 
-static gint            gtk_widget_event_internal               (GtkWidget        *widget,
-                                                                 const GdkEvent   *event);
+static gboolean         gtk_widget_event_internal               (GtkWidget        *widget,
+                                                                 GdkEvent         *event);
 static gboolean                gtk_widget_real_mnemonic_activate       (GtkWidget        *widget,
                                                                 gboolean          group_cycling);
 static void             gtk_widget_real_measure                 (GtkWidget        *widget,
@@ -5167,8 +5167,8 @@ gtk_widget_real_mnemonic_activate (GtkWidget *widget,
  *               the event was handled)
  **/
 gboolean
-gtk_widget_event (GtkWidget       *widget,
-                 const GdkEvent  *event)
+gtk_widget_event (GtkWidget *widget,
+                  GdkEvent  *event)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
   g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE);
@@ -5229,13 +5229,16 @@ gtk_widget_run_controllers (GtkWidget           *widget,
 
 static gboolean
 translate_event_coordinates (GdkEvent  *event,
+                             double     event_x,
+                             double     event_y,
                              GtkWidget *widget);
 gboolean
-_gtk_widget_captured_event (GtkWidget      *widget,
-                            const GdkEvent *event)
+_gtk_widget_captured_event (GtkWidget *widget,
+                            GdkEvent  *event)
 {
   gboolean return_val = FALSE;
-  GdkEvent *event_copy;
+  double old_x, old_y;
+  gboolean reset_event = FALSE;
 
   g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
   g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE);
@@ -5243,13 +5246,17 @@ _gtk_widget_captured_event (GtkWidget      *widget,
   if (!event_surface_is_still_viewable (event))
     return TRUE;
 
-  event_copy = gdk_event_copy (event);
-  translate_event_coordinates (event_copy, widget);
+  if (gdk_event_get_coords (event, &old_x, &old_y))
+    {
+      reset_event = TRUE;
+      translate_event_coordinates (event, old_x, old_y, widget);
+    }
 
-  return_val = gtk_widget_run_controllers (widget, event_copy, GTK_PHASE_CAPTURE);
-  return_val |= !WIDGET_REALIZED_FOR_EVENT (widget, event_copy);
+  return_val = gtk_widget_run_controllers (widget, event, GTK_PHASE_CAPTURE);
+  return_val |= !WIDGET_REALIZED_FOR_EVENT (widget, event);
 
-  g_object_unref (event_copy);
+  if (reset_event)
+    gdk_event_set_coords (event, old_x, old_y);
 
   return return_val;
 }
@@ -5293,20 +5300,18 @@ event_surface_is_still_viewable (const GdkEvent *event)
 
 static gboolean
 translate_event_coordinates (GdkEvent  *event,
+                             double     event_x,
+                             double     event_y,
                              GtkWidget *widget)
 {
   GtkWidget *event_widget;
-  double x, y;
   graphene_point_t p;
 
-  if (!gdk_event_get_coords (event, &x, &y))
-    return TRUE;
-
   event_widget = gtk_get_event_widget (event);
 
   if (!gtk_widget_compute_point (event_widget,
                                  widget,
-                                 &GRAPHENE_POINT_INIT (x, y),
+                                 &GRAPHENE_POINT_INIT (event_x, event_y),
                                  &p))
     return FALSE;
 
@@ -5316,11 +5321,12 @@ translate_event_coordinates (GdkEvent  *event,
 }
 
 static gboolean
-gtk_widget_event_internal (GtkWidget      *widget,
-                           const GdkEvent *event)
+gtk_widget_event_internal (GtkWidget *widget,
+                           GdkEvent  *event)
 {
   gboolean return_val = FALSE;
-  GdkEvent *event_copy;
+  gboolean reset_event = FALSE;
+  double old_x, old_y;
 
   /* We check only once for is-still-visible; if someone
    * hides the window in on of the signals on the widget,
@@ -5333,22 +5339,26 @@ gtk_widget_event_internal (GtkWidget      *widget,
   if (!_gtk_widget_get_mapped (widget))
     return FALSE;
 
-  event_copy = gdk_event_copy (event);
-
-  translate_event_coordinates (event_copy, widget);
+  if (gdk_event_get_coords (event, &old_x, &old_y))
+    {
+      reset_event = TRUE;
+      translate_event_coordinates (event, old_x, old_y, widget);
+    }
 
-  if (widget == gtk_get_event_target (event_copy))
-    return_val |= gtk_widget_run_controllers (widget, event_copy, GTK_PHASE_TARGET);
+  if (widget == gtk_get_event_target (event))
+    return_val |= gtk_widget_run_controllers (widget, event, GTK_PHASE_TARGET);
 
   if (return_val == FALSE)
-    return_val |= gtk_widget_run_controllers (widget, event_copy, GTK_PHASE_BUBBLE);
-  g_object_unref (event_copy);
+    return_val |= gtk_widget_run_controllers (widget, event, GTK_PHASE_BUBBLE);
 
   if (return_val == FALSE &&
       (event->any.type == GDK_KEY_PRESS ||
        event->any.type == GDK_KEY_RELEASE))
     return_val |= gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *) event);
 
+  if (reset_event)
+    gdk_event_set_coords (event, old_x, old_y);
+
   return return_val;
 }
 
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index 3f383ad2a9..cc511f5f26 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -443,7 +443,7 @@ gboolean   gtk_widget_mnemonic_activate   (GtkWidget           *widget,
                                            gboolean             group_cycling);
 GDK_AVAILABLE_IN_ALL
 gboolean   gtk_widget_event               (GtkWidget           *widget,
-                                           const GdkEvent      *event);
+                                           GdkEvent            *event);
 
 GDK_AVAILABLE_IN_ALL
 gboolean   gtk_widget_activate               (GtkWidget        *widget);
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index c724af58e0..68595f7aa9 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -281,8 +281,8 @@ void              _gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
                                                             gpointer   user_data);
 GtkStyleContext * _gtk_widget_peek_style_context           (GtkWidget *widget);
 
-gboolean          _gtk_widget_captured_event               (GtkWidget      *widget,
-                                                            const GdkEvent *event);
+gboolean          _gtk_widget_captured_event               (GtkWidget *widget,
+                                                            GdkEvent  *event);
 
 GtkWidgetPath *   _gtk_widget_create_path                  (GtkWidget    *widget);
 void              gtk_widget_clear_path                    (GtkWidget    *widget);


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