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.
This commit is contained in:
Matthias Clasen 2019-03-08 11:12:30 -05:00
parent c73972f7df
commit 06f790d663
2 changed files with 40 additions and 0 deletions

View File

@ -573,6 +573,13 @@ gdk_event_copy (const GdkEvent *event)
case GDK_LEAVE_NOTIFY: case GDK_LEAVE_NOTIFY:
if (event->crossing.child_surface != NULL) if (event->crossing.child_surface != NULL)
g_object_ref (event->crossing.child_surface); 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; break;
case GDK_DRAG_ENTER: case GDK_DRAG_ENTER:
@ -634,6 +641,11 @@ gdk_event_finalize (GObject *object)
case GDK_ENTER_NOTIFY: case GDK_ENTER_NOTIFY:
case GDK_LEAVE_NOTIFY: case GDK_LEAVE_NOTIFY:
g_clear_object (&event->crossing.child_surface); 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; break;
case GDK_DRAG_ENTER: case GDK_DRAG_ENTER:
@ -1916,6 +1928,29 @@ gdk_event_get_target (const GdkEvent *event)
return event->any.target; 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: * gdk_event_is_sent:
* @event: a #GdkEvent * @event: a #GdkEvent

View File

@ -303,6 +303,7 @@ struct _GdkEventCrossing
GdkNotifyType detail; GdkNotifyType detail;
gboolean focus; gboolean focus;
guint state; guint state;
GObject *related_target;
}; };
/* /*
@ -323,6 +324,7 @@ struct _GdkEventFocus
gint16 in; gint16 in;
GdkCrossingMode mode; GdkCrossingMode mode;
GdkNotifyType detail; GdkNotifyType detail;
GObject *related_target;
}; };
/* /*
@ -639,6 +641,9 @@ union _GdkEvent
void gdk_event_set_target (GdkEvent *event, void gdk_event_set_target (GdkEvent *event,
GObject *user_data); GObject *user_data);
GObject * gdk_event_get_target (const GdkEvent *event); 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__ */ #endif /* __GDK_EVENTS_PRIVATE_H__ */