--- old/gtk+-2.24.23/gtk/gtkdnd-quartz.c 2013-10-16 11:29:55.000000000 -0400 +++ new/gtk+-2.24.23/gtk/gtkdnd-quartz.c 2015-07-20 14:53:33.000000000 -0400 @@ -1928,16 +1928,29 @@ static gboolean drag_drop_finished_idle_cb (gpointer data) { - gtk_drag_source_info_destroy (data); + GtkDragSourceInfo* info = (GtkDragSourceInfo*) data; + if (info->success) + { + gtk_drag_source_info_destroy (data); + } return FALSE; } static void -gtk_drag_drop_finished (GtkDragSourceInfo *info) +gtk_drag_drop_finished (GtkDragSourceInfo *info, GtkDragResult result) { - if (info->success && info->delete) - g_signal_emit_by_name (info->source_widget, "drag-data-delete", - info->context); + gboolean success = (result == GTK_DRAG_RESULT_SUCCESS); + + if (!success) { + g_signal_emit_by_name (info->source_widget, "drag-failed", + info->context, GTK_DRAG_RESULT_NO_TARGET, &success); + } + + if (success && info->delete) { + g_signal_emit_by_name (info->source_widget, "drag-data-delete", + info->context); + } + /* Workaround for the fact that the NS API blocks until the drag is * over. This way the context is still valid when returning from @@ -1963,6 +1976,7 @@ { GtkDragSourceInfo *info; GdkDragContext *context; + GtkDragResult result; g_return_if_fail (widget != NULL); g_return_if_fail (event != NULL); @@ -1975,7 +1989,8 @@ switch (event->type) { case GDK_DROP_FINISHED: - gtk_drag_drop_finished (info); + result = (gdk_drag_context_get_dest_window (context) != NULL) ? GTK_DRAG_RESULT_SUCCESS : GTK_DRAG_RESULT_NO_TARGET; + gtk_drag_drop_finished (info, result); break; default: g_assert_not_reached ();