/* * Copyright (c) 2003 by the gtk2-perl team (see the file AUTHORS) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307 USA. * * $Id$ */ #include "gtk2perl.h" #define PREP_BOOL(object, path) \ gboolean ret; \ dSP; \ ENTER; \ SAVETMPS; \ PUSHMARK (SP); \ PUSHs (sv_2mortal (newSVGObject (G_OBJECT (object)))); \ XPUSHs (sv_2mortal (newSVGtkTreePath (path))); #define CALL_AND_RETURN_BOOL(name) \ PUTBACK; \ call_method (name, G_SCALAR); \ SPAGAIN; \ /* SvTRUE evaluates its arg more than once */ \ { \ SV * sv_ret = POPs; \ ret = SvTRUE (sv_ret); \ } \ PUTBACK; \ FREETMPS; \ LEAVE; \ return ret; static gboolean gtk2perl_tree_drag_source_row_draggable (GtkTreeDragSource *drag_source, GtkTreePath *path) { PREP_BOOL (drag_source, path); CALL_AND_RETURN_BOOL ("ROW_DRAGGABLE"); } static gboolean gtk2perl_tree_drag_source_drag_data_get (GtkTreeDragSource *drag_source, GtkTreePath *path, GtkSelectionData *selection_data) { PREP_BOOL (drag_source, path); XPUSHs (sv_2mortal (newSVGtkSelectionData (selection_data))); CALL_AND_RETURN_BOOL ("DRAG_DATA_GET"); } static gboolean gtk2perl_tree_drag_source_drag_data_delete (GtkTreeDragSource *drag_source, GtkTreePath *path) { PREP_BOOL (drag_source, path); CALL_AND_RETURN_BOOL ("DRAG_DATA_DELETE"); } static gboolean gtk2perl_tree_drag_dest_drag_data_received (GtkTreeDragDest *drag_dest, GtkTreePath *dest, GtkSelectionData *selection_data) { PREP_BOOL (drag_dest, dest); XPUSHs (sv_2mortal (newSVGtkSelectionData (selection_data))); CALL_AND_RETURN_BOOL ("DRAG_DATA_RECEIVED"); } static gboolean gtk2perl_tree_drag_dest_row_drop_possible (GtkTreeDragDest *drag_dest, GtkTreePath *dest_path, GtkSelectionData *selection_data) { PREP_BOOL (drag_dest, dest_path); XPUSHs (sv_2mortal (newSVGtkSelectionData (selection_data))); CALL_AND_RETURN_BOOL ("ROW_DROP_POSSIBLE"); } static void gtk2perl_tree_drag_source_iface_init (GtkTreeDragSourceIface * iface) { iface->row_draggable = gtk2perl_tree_drag_source_row_draggable; iface->drag_data_get = gtk2perl_tree_drag_source_drag_data_get; iface->drag_data_delete = gtk2perl_tree_drag_source_drag_data_delete; } static void gtk2perl_tree_drag_dest_iface_init (GtkTreeDragDestIface * iface) { iface->drag_data_received = gtk2perl_tree_drag_dest_drag_data_received; iface->row_drop_possible = gtk2perl_tree_drag_dest_row_drop_possible; } MODULE = Gtk2::TreeDnd PACKAGE = Gtk2::TreeDragSource PREFIX = gtk_tree_drag_source_ =for apidoc __hide__ =cut void _ADD_INTERFACE (class, const char * target_class) CODE: { static const GInterfaceInfo iface_info = { (GInterfaceInitFunc) gtk2perl_tree_drag_source_iface_init, (GInterfaceFinalizeFunc) NULL, (gpointer) NULL }; GType gtype = gperl_object_type_from_package (target_class); g_type_add_interface_static (gtype, GTK_TYPE_TREE_DRAG_SOURCE, &iface_info); } ## gboolean gtk_tree_drag_source_row_draggable (GtkTreeDragSource *drag_source, GtkTreePath *path) gboolean gtk_tree_drag_source_row_draggable (drag_source, path) GtkTreeDragSource *drag_source GtkTreePath *path ## gboolean gtk_tree_drag_source_drag_data_delete (GtkTreeDragSource *drag_source, GtkTreePath *path) gboolean gtk_tree_drag_source_drag_data_delete (drag_source, path) GtkTreeDragSource *drag_source GtkTreePath *path =for apidoc =for signature selection_data = $drag_source->drag_data_get ($path, $selection_data) Get selection data from a drag source. The data is written to $selection_data, or if $selection_data is not given then to a newly created Gtk2::SelectionData object with target type C. On success the return is the given or new object, or on failure the return is undef. =cut ### gboolean gtk_tree_drag_source_drag_data_get (GtkTreeDragSource *drag_source, GtkTreePath *path, GtkSelectionData *selection_data) void gtk_tree_drag_source_drag_data_get (GtkTreeDragSource *drag_source, GtkTreePath *path, GtkSelectionData *selection_data = NULL) PREINIT: SV *ret = &PL_sv_undef; CODE: if (selection_data) { if (gtk_tree_drag_source_drag_data_get (drag_source, path, selection_data)) ret = ST(2); } else { GtkSelectionData new_selection_data = { 0, }; new_selection_data.target = gdk_atom_intern ("GTK_TREE_MODEL_ROW", FALSE); new_selection_data.length = -1; if (gtk_tree_drag_source_drag_data_get (drag_source, path, &new_selection_data)) ret = sv_2mortal (newSVGtkSelectionData_copy (&new_selection_data)); } ST(0) = ret; XSRETURN(1); MODULE = Gtk2::TreeDnd PACKAGE = Gtk2::TreeDragDest PREFIX = gtk_tree_drag_dest_ =for apidoc __hide__ =cut void _ADD_INTERFACE (class, const char * target_class) CODE: { static const GInterfaceInfo iface_info = { (GInterfaceInitFunc) gtk2perl_tree_drag_dest_iface_init, (GInterfaceFinalizeFunc) NULL, (gpointer) NULL }; GType gtype = gperl_object_type_from_package (target_class); g_type_add_interface_static (gtype, GTK_TYPE_TREE_DRAG_DEST, &iface_info); } ## gboolean gtk_tree_drag_dest_drag_data_received (GtkTreeDragDest *drag_dest, GtkTreePath *dest, GtkSelectionData *selection_data) gboolean gtk_tree_drag_dest_drag_data_received (drag_dest, dest, selection_data) GtkTreeDragDest *drag_dest GtkTreePath *dest GtkSelectionData *selection_data ## gboolean gtk_tree_drag_dest_row_drop_possible (GtkTreeDragDest *drag_dest, GtkTreePath *dest_path, GtkSelectionData *selection_data) gboolean gtk_tree_drag_dest_row_drop_possible (drag_dest, dest_path, selection_data) GtkTreeDragDest *drag_dest GtkTreePath *dest_path GtkSelectionData *selection_data MODULE = Gtk2::TreeDnd PACKAGE = Gtk2::SelectionData PREFIX = gtk_tree_ ## gboolean gtk_tree_set_row_drag_data (GtkSelectionData *selection_data, GtkTreeModel *tree_model, GtkTreePath *path) gboolean gtk_tree_set_row_drag_data (selection_data, tree_model, path) GtkSelectionData *selection_data GtkTreeModel *tree_model GtkTreePath *path ## gboolean gtk_tree_get_row_drag_data (GtkSelectionData *selection_data, GtkTreeModel **tree_model, GtkTreePath **path) =for apidoc If $selection_data is not of target type GTK_TREE_MODEL_ROW then the return is an empty list. =for signature (tree_model, path) = $selection_data->get_row_drag_data =cut void gtk_tree_get_row_drag_data (selection_data) GtkSelectionData *selection_data PREINIT: GtkTreeModel *tree_model; GtkTreePath *path; PPCODE: if (! gtk_tree_get_row_drag_data (selection_data, &tree_model, &path)) XSRETURN_EMPTY; EXTEND (SP, 2); PUSHs (sv_2mortal (newSVGtkTreeModel (tree_model))); PUSHs (sv_2mortal (newSVGtkTreePath_own (path)));