summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-03-08 11:12:30 -0500
committerMatthias Clasen <mclasen@redhat.com>2019-03-16 21:24:45 -0400
commit06f790d6630d2265841571ded13f78b6d465c3e2 (patch)
tree8c97e99aca0dcdee7572e353fbb4716383a308d2
parentc73972f7df8bfc630ffca58f9f21502dab3f8fb7 (diff)
downloadgtk+-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.c35
-rw-r--r--gdk/gdkeventsprivate.h5
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__ */