_gtk_drag_dest_handle_event (GtkWidget *toplevel,
GdkEvent *event)
{
- GtkDragDestInfo *info;
+ GtkDropTarget *dest;
GdkDrop *drop;
GdkEventType event_type;
event_type = gdk_event_get_event_type (event);
drop = gdk_event_get_drop (event);
- info = gtk_drag_get_dest_info (drop, TRUE);
-
/* Find the widget for the event */
switch ((guint) event_type)
{
break;
case GDK_DRAG_LEAVE:
- if (info->dest)
+ dest = gtk_drop_get_current_dest (drop);
+ if (dest)
{
- gtk_drop_target_emit_drag_leave (info->dest, drop);
- gtk_drag_dest_set_target (info, NULL);
+ gtk_drop_target_emit_drag_leave (dest, drop);
+ gtk_drop_set_current_dest (drop, NULL);
}
break;
-
+
case GDK_DRAG_MOTION:
case GDK_DROP_START:
{
return FALSE;
}
-void
-gtk_drag_dest_set_target (GtkDragDestInfo *info,
- GtkDropTarget *dest)
+static void
+clear_current_dest (gpointer data, GObject *former_object)
{
- if (info->dest)
- g_object_remove_weak_pointer (G_OBJECT (info->dest), (gpointer *) &info->dest);
-
- info->dest = dest;
-
- if (info->dest)
- g_object_add_weak_pointer (G_OBJECT (info->dest), (gpointer *) &info->dest);
+ g_object_set_data (G_OBJECT (data), "current-dest", NULL);
}
-static void
-gtk_drag_dest_info_destroy (gpointer data)
+void
+gtk_drop_set_current_dest (GdkDrop *drop,
+ GtkDropTarget *dest)
{
- GtkDragDestInfo *info = (GtkDragDestInfo *)data;
+ GtkDropTarget *old_dest;
+
+ old_dest = g_object_get_data (G_OBJECT (drop), "current-dest");
+
+ if (old_dest)
+ g_object_weak_unref (G_OBJECT (old_dest), clear_current_dest, drop);
- gtk_drag_dest_set_target (info, NULL);
+ g_object_set_data (G_OBJECT (drop), "current-dest", dest);
- g_slice_free (GtkDragDestInfo, data);
+ if (dest)
+ g_object_weak_ref (G_OBJECT (dest), clear_current_dest, drop);
}
-GtkDragDestInfo *
-gtk_drag_get_dest_info (GdkDrop *drop,
- gboolean create)
+GtkDropTarget *
+gtk_drop_get_current_dest (GdkDrop *drop)
{
- GtkDragDestInfo *info;
- static GQuark info_quark = 0;
- if (!info_quark)
- info_quark = g_quark_from_static_string ("gtk-dest-info");
-
- info = g_object_get_qdata (G_OBJECT (drop), info_quark);
- if (!info && create)
- {
- info = g_slice_new0 (GtkDragDestInfo);
- info->drop = drop;
- g_object_set_qdata_full (G_OBJECT (drop), info_quark,
- info, gtk_drag_dest_info_destroy);
- }
-
- return info;
+ return g_object_get_data (G_OBJECT (drop), "current-dest");
}
G_BEGIN_DECLS
-void _gtk_drag_dest_handle_event (GtkWidget *toplevel,
- GdkEvent *event);
+void _gtk_drag_dest_handle_event (GtkWidget *toplevel,
+ GdkEvent *event);
-typedef struct _GtkDragDestInfo GtkDragDestInfo;
-
-struct _GtkDragDestInfo
-{
- GtkDropTarget *dest;
- GdkDrop *drop; /* drop */
-};
-
-GtkDragDestInfo * gtk_drag_get_dest_info (GdkDrop *drop,
- gboolean create);
-void gtk_drag_dest_set_target (GtkDragDestInfo *info,
- GtkDropTarget *dest);
+void gtk_drop_set_current_dest (GdkDrop *drop,
+ GtkDropTarget *dest);
+GtkDropTarget *gtk_drop_get_current_dest (GdkDrop *drop);
G_END_DECLS
{
GtkDropTarget *dest = GTK_DROP_TARGET (controller);
GdkDrop *drop;
- GtkDragDestInfo *info;
+ GtkDropTarget *old_dest;
double x, y;
gboolean found = FALSE;
gdk_event_get_coords (event, &x, &y);
drop = gdk_event_get_drop (event);
- info = gtk_drag_get_dest_info (drop, TRUE);
+ old_dest = gtk_drop_get_current_dest (drop);
switch ((int)gdk_event_get_event_type (event))
{
/* We send a leave before the drop so that the widget unhighlights
* properly.
*/
- if (info->dest)
+ if (old_dest)
{
- gtk_drop_target_emit_drag_leave (info->dest, drop);
- gtk_drag_dest_set_target (info, NULL);
+ gtk_drop_target_emit_drag_leave (old_dest, drop);
+ gtk_drop_set_current_dest (drop, NULL);
}
found = gtk_drop_target_emit_drag_drop (dest, drop, x, y);
if (found)
{
- if (info->dest && info->dest != dest)
+ if (old_dest && old_dest != dest)
{
- gtk_drop_target_emit_drag_leave (info->dest, drop);
- gtk_drag_dest_set_target (info, NULL);
+ gtk_drop_target_emit_drag_leave (old_dest, drop);
+ gtk_drop_set_current_dest (drop, NULL);
}
- gtk_drag_dest_set_target (info, dest);
+ gtk_drop_set_current_dest (drop, dest);
}
return found;