Index: ruby-gnome2-0.19.1/gtk/src/rbgtktreedrag.c
===================================================================
--- ruby-gnome2-0.19.1.orig/gtk/src/rbgtktreedrag.c	2009-08-20 15:05:27.987213034 +0200
+++ ruby-gnome2-0.19.1/gtk/src/rbgtktreedrag.c	2009-08-20 15:05:28.007211725 +0200
@@ -54,24 +54,25 @@
 }
 
 static void
-_rb_marshal_BOOLEAN__BOXED_BOXED(GClosure     *closure,
-                                 GValue       *return_value,
-                                 guint         n_param_values,
-                                 const GValue *param_values,
-                                 gpointer      invocation_hint,
-                                 gpointer      marshal_data)
-{
-  typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_BOXED) (gpointer     data1,
-                                                         gpointer     arg_1,
-                                                         gpointer     arg_2,
-                                                         gpointer     data2);
-  register GMarshalFunc_BOOLEAN__BOXED_BOXED callback;
+_rb_marshal_BOOLEAN__BOXED_OBJECT_BOXED(GClosure     *closure,
+                                        GValue       *return_value,
+                                        guint         n_param_values,
+                                        const GValue *param_values,
+                                        gpointer      invocation_hint,
+                                        gpointer      marshal_data)
+{
+  typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_OBJECT_BOXED) (gpointer     data1,
+                                                                gpointer     arg_1,
+                                                                gpointer     arg_2,
+                                                                gpointer     arg_3,
+                                                                gpointer     data2);
+  register GMarshalFunc_BOOLEAN__BOXED_OBJECT_BOXED callback;
   register GCClosure *cc = (GCClosure*) closure;
   register gpointer data1, data2;
   gboolean v_return;
 
   g_return_if_fail (return_value != NULL);
-  g_return_if_fail (n_param_values == 3);
+  g_return_if_fail (n_param_values == 4);
 
   if (G_CCLOSURE_SWAP_DATA (closure))
     {
@@ -83,11 +84,12 @@
       data1 = g_value_peek_pointer (param_values + 0);
       data2 = closure->data;
     }
-  callback = (GMarshalFunc_BOOLEAN__BOXED_BOXED) (marshal_data ? marshal_data : cc->callback);
+  callback = (GMarshalFunc_BOOLEAN__BOXED_OBJECT_BOXED) (marshal_data ? marshal_data : cc->callback);
 
   v_return = callback (data1,
                        g_marshal_value_peek_boxed (param_values + 1),
-                       g_marshal_value_peek_boxed (param_values + 2),
+                       g_marshal_value_peek_object (param_values + 2),
+                       g_marshal_value_peek_boxed (param_values + 3),
                        data2);
 
   g_value_set_boolean (return_value, v_return);
@@ -110,10 +112,11 @@
                  G_SIGNAL_RUN_LAST,
                  0,
                  NULL, NULL,
-                 _rb_marshal_BOOLEAN__BOXED_BOXED,
-                 G_TYPE_BOOLEAN, 2,
+                 _rb_marshal_BOOLEAN__BOXED_OBJECT_BOXED,
+                 G_TYPE_BOOLEAN, 3,
                  GTK_TYPE_TREE_PATH,
-                 GTK_TYPE_SELECTION_DATA);
+                 GTK_TYPE_TREE_MODEL,
+                 GTK_TYPE_TREE_PATH);
 }
 
 static gboolean
@@ -146,11 +149,20 @@
 
   guint signal_id = g_signal_lookup("row-drop-possible", G_TYPE_FROM_INSTANCE(drag_dest));
 
+  GtkTreeModel* source_model = NULL;
+  GtkTreePath* source_path = NULL;
+  /* The selection_data must be of type GTK_TREE_MODEL_ROW, otherwise
+     the get function returns false and the out values are hopefully left
+     as-is. */
+  gtk_tree_get_row_drag_data(selection_data, &source_model, &source_path);
+
   if(g_signal_has_handler_pending(drag_dest, signal_id, 0, FALSE))
-    g_signal_emit(drag_dest, signal_id, 0, dest_path, selection_data, &retval);
+    g_signal_emit(drag_dest, signal_id, 0, dest_path, source_model, source_path, &retval);
   else
     retval = TRUE; /* default value */
 
+  if(source_path)
+    gtk_tree_path_free(source_path);
   return retval;
 }
 
