[gtk/wip/matthiasc/focus2: 50/50] Add gtk_get_event_related_target



commit 1ecc34347269369db2d4e525cb42b959fbac2129
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Mar 7 06:39:10 2019 -0500

    Add gtk_get_event_related_target
    
    This is meant to return the 'other' endpoint,
    crossing events.

 gtk/gtkmain.c    | 34 ++++++++++++++++++++++++++++------
 gtk/gtkmain.h    |  3 +++
 gtk/gtkprivate.h |  2 ++
 3 files changed, 33 insertions(+), 6 deletions(-)
---
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 96b3036248..4e46d23b48 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1407,7 +1407,8 @@ static void
 synth_crossing (GtkWidget       *widget,
                 GtkWidget       *toplevel,
                 gboolean         enter,
-                GtkWidget       *other_widget,
+                GtkWidget       *target,
+                GtkWidget       *related_target,
                 GdkEvent        *source,
                 GdkNotifyType    notify_type,
                 GdkCrossingMode  crossing_mode)
@@ -1430,8 +1431,8 @@ synth_crossing (GtkWidget       *widget,
     {
       gdouble x, y;
       event = gdk_event_new (enter ? GDK_ENTER_NOTIFY : GDK_LEAVE_NOTIFY);
-      if (other_widget)
-        event->crossing.child_surface = g_object_ref (gtk_widget_get_surface (other_widget));
+      if (related_target)
+        event->crossing.child_surface = g_object_ref (gtk_widget_get_surface (related_target));
       gdk_event_get_coords (source, &x, &y);
       event->crossing.x = x;
       event->crossing.y = y;
@@ -1441,7 +1442,8 @@ synth_crossing (GtkWidget       *widget,
       flags = GTK_STATE_FLAG_PRELIGHT;
     }
 
-  gdk_event_set_user_data (event, G_OBJECT (widget));
+  gdk_event_set_user_data (event, G_OBJECT (target));
+  gtk_set_event_related_target (event, related_target);
   gdk_event_set_device (event, gdk_event_get_device (source));
   gdk_event_set_source_device (event, gdk_event_get_source_device (source));
 
@@ -1500,7 +1502,7 @@ gtk_synthesize_crossing_events (GtkWindow       *toplevel,
             leave_type : get_virtual_notify_type (leave_type);
 
           synth_crossing (widget, GTK_WIDGET (toplevel), FALSE,
-                          new_target, event, notify_type, mode);
+                          old_target, new_target, event, notify_type, mode);
           widget = gtk_widget_get_parent (widget);
         }
     }
@@ -1525,7 +1527,7 @@ gtk_synthesize_crossing_events (GtkWindow       *toplevel,
             enter_type : get_virtual_notify_type (enter_type);
 
           synth_crossing (widget, GTK_WIDGET (toplevel), TRUE,
-                          old_target, event, notify_type, mode);
+                          new_target, old_target, event, notify_type, mode);
         }
     }
 }
@@ -2427,6 +2429,26 @@ gtk_get_event_target (const GdkEvent *event)
   return GTK_WIDGET (gdk_event_get_user_data (event));
 }
 
+void
+gtk_set_event_related_target (GdkEvent  *event,
+                              GtkWidget *widget)
+{
+  g_object_set_data (G_OBJECT (event), "related-target", widget);
+}
+
+GtkWidget *
+gtk_get_event_related_target (const GdkEvent *event)
+{
+  gpointer ret;
+
+  ret = g_object_get_data (G_OBJECT (event), "related-target");
+
+  if (ret)
+    return GTK_WIDGET (ret);
+
+  return NULL;
+}
+
 /**
  * gtk_get_event_target_with_type:
  * @event: a #GdkEvent
diff --git a/gtk/gtkmain.h b/gtk/gtkmain.h
index 81c1e574ad..b1199e6f93 100644
--- a/gtk/gtkmain.h
+++ b/gtk/gtkmain.h
@@ -155,6 +155,9 @@ GtkWidget *gtk_get_event_widget         (const GdkEvent  *event);
 GDK_AVAILABLE_IN_ALL
 GtkWidget *gtk_get_event_target         (const GdkEvent  *event);
 
+GDK_AVAILABLE_IN_ALL
+GtkWidget *gtk_get_event_related_target (const GdkEvent  *event);
+
 GDK_AVAILABLE_IN_ALL
 GtkWidget *gtk_get_event_target_with_type (GdkEvent *event,
                                            GType     type);
diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h
index 81f9068693..94d8d82fd3 100644
--- a/gtk/gtkprivate.h
+++ b/gtk/gtkprivate.h
@@ -93,6 +93,8 @@ gboolean _gtk_translate_keyboard_accel_state   (GdkKeymap       *keymap,
 void             gtk_propagate_event_internal  (GtkWidget       *widget,
                                                 GdkEvent        *event,
                                                 GtkWidget       *topmost);
+void             gtk_set_event_related_target (GdkEvent  *event,
+                                               GtkWidget *widget);
 
 gdouble _gtk_get_slowdown (void);
 void    _gtk_set_slowdown (gdouble slowdown_factor);


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