GtkTargetList *target_list;
GdkDragAction actions;
guint have_drag : 1;
+ guint track_motion : 1;
};
struct _GtkDragDestInfo
gboolean create)
{
GtkDragSourceInfo *info;
+
if (!dest_info_quark)
dest_info_quark = g_quark_from_static_string ("gtk-source-info");
gint n_targets,
GdkDragAction actions)
{
- GtkDragDestSite *site;
+ GtkDragDestSite *old_site, *site;
g_return_if_fail (GTK_IS_WIDGET (widget));
+ old_site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
+
gtk_drag_dest_unset (widget);
site = g_new (GtkDragDestSite, 1);
site->target_list = NULL;
site->actions = actions;
+ if (old_site)
+ site->track_motion = old_site->track_motion;
+ else
+ site->track_motion = FALSE;
+
if (GTK_WIDGET_REALIZED (widget))
gtk_drag_dest_realized (widget, site);
if ((site->flags & GTK_DEST_DEFAULT_HIGHLIGHT) && site->have_drag)
gtk_drag_unhighlight (widget);
- if (!(site->flags & GTK_DEST_DEFAULT_MOTION) || site->have_drag)
- g_signal_emit_by_name (widget, "drag_leave",
- context, time);
+ if (!(site->flags & GTK_DEST_DEFAULT_MOTION) || site->have_drag ||
+ site->track_motion)
+ g_signal_emit_by_name (widget, "drag_leave", context, time);
site->have_drag = FALSE;
}
site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
g_return_val_if_fail (site != NULL, FALSE);
- if (site->flags & GTK_DEST_DEFAULT_MOTION)
+ if (site->track_motion || site->flags & GTK_DEST_DEFAULT_MOTION)
{
if (context->suggested_action & site->actions)
action = context->suggested_action;
else
{
gdk_drag_status (context, 0, time);
- return TRUE;
+ if (!site->track_motion)
+ return TRUE;
}
}
gtk_drag_dest_set_track_motion (GtkWidget *widget,
gboolean track_motion)
{
+ GtkDragDestSite *site;
+
g_return_if_fail (GTK_IS_WIDGET (widget));
- /* FIXME: Implement */
+ site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
+
+ g_return_if_fail (site != NULL);
+
+ site->track_motion = track_motion != FALSE;
}
gboolean
gtk_drag_dest_get_track_motion (GtkWidget *widget)
{
+ GtkDragDestSite *site;
+
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
- /* FIXME: Implement */
+ site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
+
+ if (site)
+ return site->track_motion;
return FALSE;
}