Index: gtktreeview.c
===================================================================
--- gtktreeview.c	(revision 21770)
+++ gtktreeview.c	(working copy)
@@ -99,6 +99,9 @@
 
   guint source_set : 1;
   guint dest_set : 1;
+
+  GtkTreePath* path;
+  GtkTreeModel* model;
 };
 
 
@@ -6967,6 +6970,17 @@
   return path;
 }
 
+#ifdef GDK_WINDOWING_QUARTZ
+static void
+gtk_tree_view_catch_drag_begin (GtkWidget* widget,
+				GdkDragContext* context,
+				gpointer user_data)
+{
+	TreeViewDragInfo* drag_info = (TreeViewDragInfo*) user_data;
+	set_source_row (context, drag_info->model, drag_info->path);
+}
+#endif
+
 static gboolean
 gtk_tree_view_maybe_begin_dragging_row (GtkTreeView      *tree_view,
                                         GdkEventMotion   *event)
@@ -6979,6 +6993,7 @@
   gint cell_x, cell_y;
   GtkTreeModel *model;
   gboolean retval = FALSE;
+  gint drag_begin_id;
 
   di = get_info (tree_view);
 
@@ -7025,13 +7040,25 @@
 
   retval = TRUE;
 
+#ifdef GDK_WINDOWING_QUARTZ
+  /* catch drag-being signal */
+  di->model = model;
+  di->path = path;
+  drag_begin_id = g_signal_connect (tree_view, "drag-begin", G_CALLBACK (gtk_tree_view_catch_drag_begin), (gpointer) di);
+#endif
+
   context = gtk_drag_begin (widget,
                             gtk_drag_source_get_target_list (widget),
                             di->source_actions,
                             button,
                             (GdkEvent*)event);
 
+#ifndef GDK_WINDOWING_QUARTZ
   set_source_row (context, model, path);
+#else 
+  /* disconnect drag-begin and catch drag-end */
+  g_signal_handler_disconnect (tree_view, drag_begin_id);
+#endif
 
  out:
   if (path)
