The low-level API consists of the GTK+ DND API, augmented by some treeview utility functions: Gtk.Tree_View.Set_Drag_Dest_Row, Gtk.Tree_View.Get_Drag_Dest_Row, Gtk.Tree_View.Get_Dest_Row_At_Pos, Gtk.Tree_View.Create_Row_Drag_Icon, Set_Row_Drag_Data and Get_Row_Drag_Data. This API leaves a lot of flexibility, but nothing is done automatically, and implementing advanced features like hover-to-open-rows or autoscrolling on top of this API is a lot of work.
On the other hand, if you write to the high-level API, then all the bookkeeping of rows is done for you, as well as things like hover-to-open and auto-scroll, but your models have to implement the Gtk_Tree_Drag_Source and Gtk_Tree_Drag_Dest interfaces.
This function can only be used if Selection_Data originates from the same process that's calling this function, because a pointer to the tree model is being passed around. If you aren't in the same process, then you'll get memory corruption. In the Gtk_Tree_Drag_Dest drag_data_received handler, you can assume that selection data of type GTK_TREE_MODEL_ROW is in from the current process.
The returned path must be freed with