/* * 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" static void init_child_property_value (GObject * object, const char * name, GValue * value) { GParamSpec * pspec; pspec = gtk_container_class_find_child_property (G_OBJECT_GET_CLASS (object), name); if (!pspec) croak ("property %s not found in object class %s", name, G_OBJECT_TYPE_NAME (object)); g_value_init (value, G_PARAM_SPEC_VALUE_TYPE (pspec)); } static void gtk2perl_foreach_callback (GtkWidget * widget, GPerlCallback * callback) { gperl_callback_invoke (callback, NULL, widget); } MODULE = Gtk2::Container PACKAGE = Gtk2::Container PREFIX = gtk_container_ void gtk_container_set_border_width (container, border_width) GtkContainer *container guint border_width guint gtk_container_get_border_width (container) GtkContainer *container void gtk_container_add (container, widget) GtkContainer *container GtkWidget *widget void gtk_container_remove (container, widget) GtkContainer *container GtkWidget *widget void gtk_container_set_resize_mode (container, resize_mode) GtkContainer *container GtkResizeMode resize_mode GtkResizeMode gtk_container_get_resize_mode (container) GtkContainer *container void gtk_container_check_resize (container) GtkContainer *container =for apidoc forall =for arg callback (subroutine) Code to invoke on each child widget Invoke I<$callback> on each child of I<$container>, including "internal" children. Most applications should not use this function. Compare with I. =cut =for apidoc =for arg callback (subroutine) Code to invoke on each child widget Invoke I<$callback> on each child of I<$container>, ignoring "internal" children. =cut void gtk_container_foreach (container, callback, callback_data=NULL) GtkContainer *container SV * callback SV * callback_data ALIAS: forall = 1 PREINIT: GPerlCallback * real_callback; GType param_types [1]; CODE: param_types[0] = GTK_TYPE_WIDGET; real_callback = gperl_callback_new (callback, callback_data, 1, param_types, G_TYPE_NONE); if (ix == 1) gtk_container_forall (container, (GtkCallback)gtk2perl_foreach_callback, real_callback); else gtk_container_foreach (container, (GtkCallback)gtk2perl_foreach_callback, real_callback); gperl_callback_destroy (real_callback); ## deprecated ## gtk_container_foreach_full ## GList* gtk_container_get_children (GtkContainer *container) =for apidoc Returns a list of Gtk2::Widget's, the children of the container. =cut void gtk_container_get_children (container) GtkContainer *container PREINIT: GList * children, * i; PPCODE: children = gtk_container_get_children (container); for (i = children ; i != NULL ; i = i->next) XPUSHs (sv_2mortal (newSVGtkWidget (GTK_WIDGET (i->data)))); g_list_free (children); ## void gtk_container_propagate_expose (GtkContainer *container, GtkWidget *child, GdkEventExpose *event) void gtk_container_propagate_expose (container, child, event) GtkContainer *container GtkWidget *child GdkEvent *event C_ARGS: container, child, (GdkEventExpose *) event ## void gtk_container_set_focus_chain (GtkContainer *container, GList *focusable_widgets) =for apidoc =for arg ... of Gtk2::Widget's, the focus chain Sets a focus chain, overriding the one computed automatically by GTK+. In principle each widget in the chain should be a descendant of the container, but this is not enforced by this method, since it's allowed to set the focus chain before you pack the widgets, or have a widget in the chain that isn't always packed. The necessary checks are done when the focus chain is actually traversed. =cut void gtk_container_set_focus_chain (container, ...) GtkContainer *container PREINIT: GList *focusable_widgets = NULL; int i; CODE: for (i = items - 1 ; i > 0 ; i--) focusable_widgets = g_list_prepend (focusable_widgets, SvGtkWidget (ST (i))); gtk_container_set_focus_chain (container, focusable_widgets); g_list_free (focusable_widgets); ## gboolean gtk_container_get_focus_chain (GtkContainer *container, GList **focusable_widgets) =for apidoc Returns a list of Gtk2::Widgets, the focus chain. =cut void gtk_container_get_focus_chain (container) GtkContainer *container PREINIT: GList * i, * focusable_widgets = NULL; PPCODE: if (!gtk_container_get_focus_chain (container, &focusable_widgets)) XSRETURN_EMPTY; for (i = focusable_widgets; i != NULL ; i = i->next) XPUSHs (sv_2mortal (newSVGtkWidget (i->data))); g_list_free (focusable_widgets); void gtk_container_unset_focus_chain (container) GtkContainer *container void gtk_container_set_focus_child (container, child) GtkContainer *container GtkWidget_ornull *child #if GTK_CHECK_VERSION (2, 14, 0) GtkWidget_ornull * gtk_container_get_focus_child (GtkContainer *container); #endif /* 2.14 */ GtkAdjustment_ornull * gtk_container_get_focus_hadjustment (container) GtkContainer * container GtkAdjustment_ornull * gtk_container_get_focus_vadjustment (container) GtkContainer * container void gtk_container_set_focus_vadjustment (container, adjustment) GtkContainer *container GtkAdjustment_ornull *adjustment void gtk_container_set_focus_hadjustment (container, adjustment) GtkContainer *container GtkAdjustment_ornull *adjustment void gtk_container_resize_children (container) GtkContainer *container ## GtkType gtk_container_child_type (GtkContainer *container) const char * gtk_container_child_type (container) GtkContainer *container PREINIT: GType gtype; CODE: gtype = gtk_container_child_type (container); if (!gtype) /* this means that the container is full. */ XSRETURN_UNDEF; /* GtkWidgets are GObjects, so we should only be getting object * types back from this function. however, we might get a GType * that isn't registered with the bindings, so we have to look * for one that we know about. since Glib::Object is always * registered, this loop cannot be infinite. */ RETVAL = NULL; while (gtype && (NULL == (RETVAL = gperl_object_package_from_type (gtype)))) gtype = g_type_parent (gtype); OUTPUT: RETVAL ## void gtk_container_class_install_child_property (GtkContainerClass *cclass, guint property_id, GParamSpec *pspec) ## GParamSpec* gtk_container_class_find_child_property (GObjectClass *cclass, const gchar *property_name) ## GParamSpec** gtk_container_class_list_child_properties (GObjectClass *cclass, guint *n_properties) =for apidoc =for arg ... list of property name/value pairs =cut ## void gtk_container_add_with_properties (GtkContainer *container, GtkWidget *widget, const gchar *first_prop_name, ...) void gtk_container_add_with_properties (container, widget, ...) GtkContainer *container GtkWidget *widget PREINIT: GValue value = {0,}; int i; CODE: g_object_ref (container); g_object_ref (widget); gtk_widget_freeze_child_notify (widget); gtk_container_add (container, widget); if (widget->parent) { if (0 != ((items - 2) % 2)) croak ("add_with_properties expects name => value pairs " "(odd number of arguments detected)"); for (i = 2; i < items; i += 2) { char *name = SvPV_nolen (ST (i)); SV *newval = ST (i + 1); init_child_property_value (G_OBJECT (container), name, &value); gperl_value_from_sv (&value, newval); gtk_container_child_set_property (container, widget, name, &value); g_value_unset (&value); } } gtk_widget_thaw_child_notify (widget); g_object_unref (widget); g_object_unref (container); ## void gtk_container_child_get_valist (GtkContainer *container, GtkWidget *child, const gchar *first_property_name, va_list var_args) ## void gtk_container_child_get_property (GtkContainer *container, GtkWidget *child, const gchar *property_name, GValue *value) ## void gtk_container_child_get (GtkContainer *container, GtkWidget *child, const gchar *first_prop_name, ...) =for apidoc Gtk2::Container::child_get_property Alias for child_get =cut =for apidoc =for arg ... list of property names Returns a list of properties of the child. =cut void gtk_container_child_get (container, child, ...) GtkContainer *container GtkWidget *child ALIAS: Gtk2::Container::child_get_property = 1 PREINIT: GValue value = {0,}; int i; PPCODE: PERL_UNUSED_VAR (ix); EXTEND (SP, items-1); for (i = 2; i < items; i++) { char *name = SvPV_nolen (ST (i)); init_child_property_value (G_OBJECT (container), name, &value); gtk_container_child_get_property (container, child, name, &value); PUSHs (sv_2mortal (gperl_sv_from_value (&value))); g_value_unset (&value); } ## void gtk_container_child_set_valist (GtkContainer *container, GtkWidget *child, const gchar *first_property_name, va_list var_args); ## void gtk_container_child_set_property (GtkContainer *container, GtkWidget *child, const gchar *property_name, const GValue *value) ## void gtk_container_child_set (GtkContainer *container, GtkWidget *child, const gchar *first_prop_name, ...) =for apidoc Gtk2::Container::child_set_property Alias for child_set =cut =for apidoc =for arg ... list of property name/value pairs Sets a list of properties on the child. =cut void gtk_container_child_set (container, child, ...) GtkContainer *container GtkWidget *child ALIAS: Gtk2::Container::child_set_property = 1 PREINIT: GValue value = {0,}; int i; CODE: PERL_UNUSED_VAR (ix); if (0 != ((items - 2) % 2)) croak ("set method expects name => value pairs " "(odd number of arguments detected)"); for (i = 2; i < items; i += 2) { char *name = SvPV_nolen (ST (i)); SV *newval = ST (i + 1); init_child_property_value (G_OBJECT (container), name, &value); gperl_value_from_sv (&value, newval); gtk_container_child_set_property (container, child, name, &value); g_value_unset (&value); } ##GtkType gtk_container_get_type (void) G_GNUC_CONST ##void gtk_container_set_reallocate_redraws (GtkContainer *container, gboolean needs_redraws) void gtk_container_set_reallocate_redraws (container, needs_redraws) GtkContainer * container gboolean needs_redraws # __PRIVATE__ ##void _gtk_container_queue_resize (GtkContainer *container)