diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-03-08 11:12:30 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2019-03-16 21:24:45 -0400 |
commit | 06f790d6630d2265841571ded13f78b6d465c3e2 (patch) | |
tree | 8c97e99aca0dcdee7572e353fbb4716383a308d2 | |
parent | c73972f7df8bfc630ffca58f9f21502dab3f8fb7 (diff) | |
download | gtk+-06f790d6630d2265841571ded13f78b6d465c3e2.tar.gz |
gdk: Add a related_target field to some events
Crossing and focus change events are emitted between
two widgets, and want to associate both with the
events.
-rw-r--r-- | gdk/gdkevents.c | 35 | ||||
-rw-r--r-- | gdk/gdkeventsprivate.h | 5 |
2 files changed, 40 insertions, 0 deletions
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index bacc1eb777..d9e9af6eef 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -573,6 +573,13 @@ gdk_event_copy (const GdkEvent *event) case GDK_LEAVE_NOTIFY: if (event->crossing.child_surface != NULL) g_object_ref (event->crossing.child_surface); + if (event->crossing.related_target) + g_object_ref (event->crossing.related_target); + break; + + case GDK_FOCUS_CHANGE: + if (event->focus_change.related_target) + g_object_ref (event->focus_change.related_target); break; case GDK_DRAG_ENTER: @@ -634,6 +641,11 @@ gdk_event_finalize (GObject *object) case GDK_ENTER_NOTIFY: case GDK_LEAVE_NOTIFY: g_clear_object (&event->crossing.child_surface); + g_clear_object (&event->crossing.related_target); + break; + + case GDK_FOCUS_CHANGE: + g_clear_object (&event->focus_change.related_target); break; case GDK_DRAG_ENTER: @@ -1916,6 +1928,29 @@ gdk_event_get_target (const GdkEvent *event) return event->any.target; } +void +gdk_event_set_related_target (GdkEvent *event, + GObject *target) +{ + if (event->any.type == GDK_ENTER_NOTIFY || + event->any.type == GDK_LEAVE_NOTIFY) + g_set_object (&event->crossing.related_target, target); + else if (event->any.type == GDK_FOCUS_CHANGE) + g_set_object (&event->focus_change.related_target, target); +} + +GObject * +gdk_event_get_related_target (const GdkEvent *event) +{ + if (event->any.type == GDK_ENTER_NOTIFY || + event->any.type == GDK_LEAVE_NOTIFY) + return event->crossing.related_target; + else if (event->any.type == GDK_FOCUS_CHANGE) + return event->focus_change.related_target; + + return NULL; +} + /** * gdk_event_is_sent: * @event: a #GdkEvent diff --git a/gdk/gdkeventsprivate.h b/gdk/gdkeventsprivate.h index f3ccd3d9f7..2db43d9a82 100644 --- a/gdk/gdkeventsprivate.h +++ b/gdk/gdkeventsprivate.h @@ -303,6 +303,7 @@ struct _GdkEventCrossing GdkNotifyType detail; gboolean focus; guint state; + GObject *related_target; }; /* @@ -323,6 +324,7 @@ struct _GdkEventFocus gint16 in; GdkCrossingMode mode; GdkNotifyType detail; + GObject *related_target; }; /* @@ -639,6 +641,9 @@ union _GdkEvent void gdk_event_set_target (GdkEvent *event, GObject *user_data); GObject * gdk_event_get_target (const GdkEvent *event); +void gdk_event_set_related_target (GdkEvent *event, + GObject *user_data); +GObject * gdk_event_get_related_target (const GdkEvent *event); #endif /* __GDK_EVENTS_PRIVATE_H__ */ |