static GtkWidget *gnome_mdi_generic_child_set_label (GnomeMDIGenericChild *child, GtkWidget *old_label)
{
	if(!child->set_label && !child->set_label_cbm)
		return parent_class->set_label(GNOME_MDI_CHILD(child), old_label, NULL);

	if(child->set_label_cbm) {
		GtkArg args[3];
		GtkWidget *ret = NULL;

		args[0].name = NULL;
		args[0].type = GNOME_TYPE_MDI_CHILD;
		GTK_VALUE_OBJECT(args[0]) = GTK_OBJECT(child);
		args[1].name = NULL;
		args[1].type = GTK_TYPE_WIDGET;
		GTK_VALUE_OBJECT(args[0]) = GTK_OBJECT(old_label);
		args[2].name = NULL;
		args[2].type = GTK_TYPE_WIDGET;
		GTK_VALUE_POINTER(args[2]) = &ret;
		child->set_label_cbm(NULL, child->set_label_data, 2, args);
		return ret;
	}
	else
		return child->set_label(GNOME_MDI_CHILD(child), old_label,
					       child->set_label_data);
}
static void addChild(GtkObject *mdi,gchar *name)
{
    GnomeMDIGenericChild *child;

    child = gnome_mdi_generic_child_new(name);
    gnome_mdi_add_child(GNOME_MDI(mdi),
            GNOME_MDI_CHILD(child));

    gnome_mdi_generic_child_set_view_creator(child,
            createView,name);
    gnome_mdi_generic_child_set_label_func(child,setLabel,
            NULL);
    gnome_mdi_add_view(GNOME_MDI(mdi),
            GNOME_MDI_CHILD(child));
}
static GList *gnome_mdi_generic_child_create_menus(GnomeMDIGenericChild *child, GtkWidget *view)
{
	if(!child->create_menus && !child->create_menus_cbm)
		return NULL;

	if (child->create_menus_cbm) {
		GtkArg args[3];
		GList *ret = NULL;
		
		args[0].name = NULL;
		args[0].type = GNOME_TYPE_MDI_CHILD;
		GTK_VALUE_OBJECT(args[0]) = GTK_OBJECT(child);
		args[1].name = NULL;
		args[1].type = GTK_TYPE_WIDGET;
		GTK_VALUE_OBJECT(args[0]) = GTK_OBJECT(view);
		args[2].name = NULL;
		args[2].type = GTK_TYPE_POINTER; /* should we have a boxed type? */
		GTK_VALUE_POINTER(args[2]) = &ret;
		child->create_menus_cbm(NULL, child->create_menus_data, 2, args);
		return ret;
	}
	else
		return child->create_menus(GNOME_MDI_CHILD(child), view,
						  child->create_menus_data);
}
/**
 * gnome_mdi_generic_child_new:
 * @name: the name of this MDI child.
 * 
 * Creates a new mdi child, which has the ability to set view creators, etc
 * on an instance basis (rather than on a class basis like &GnomeMDIChild).
 *
 * After creation, you will need to set, at a minimum, the view creator
 * function.
 * 
 * Return value: A newly created &GnomeMDIGenericChild object.
 **/
GnomeMDIGenericChild *gnome_mdi_generic_child_new (const gchar *name)
{
	GnomeMDIGenericChild *child;

	child = g_object_new (GNOME_TYPE_MDI_GENERIC_CHILD, NULL);

	GNOME_MDI_CHILD(child)->name = g_strdup(name);

	return child;
}
static gchar *gnome_mdi_generic_child_get_config_string (GnomeMDIGenericChild *child)
{
	if(!child->get_config_string && !child->get_config_string_cbm)
		return NULL;

	if(child->get_config_string_cbm) {
		GtkArg args[2];
		gchar *ret = NULL;
		
		args[0].name = NULL;
		args[0].type = GNOME_TYPE_MDI_CHILD;
		GTK_VALUE_OBJECT(args[0]) = GTK_OBJECT(child);
		args[1].name = NULL;
		args[1].type = GTK_TYPE_STRING;
		GTK_VALUE_POINTER(args[1]) = &ret;
		child->get_config_string_cbm(NULL, child->get_config_string_data,
									 1, args);
		return ret;
	}
	else
		return child->get_config_string(GNOME_MDI_CHILD(child),
						       child->get_config_string_data);
}
static GtkWidget *gnome_mdi_generic_child_create_view (GnomeMDIGenericChild *child)
{
	if(!child->create_view && !child->create_view_cbm) {
		g_error("GnomeMDIGenericChild: No method for creating views was provided!");
		return NULL;
	}

	if(child->create_view_cbm) {
		GtkArg args[2];
		GtkWidget *ret = NULL;

		args[0].name = NULL;
		args[0].type = GNOME_TYPE_MDI_CHILD;
		GTK_VALUE_OBJECT(args[0]) = GTK_OBJECT(child);
		args[1].name = NULL;
		args[1].type = GTK_TYPE_WIDGET;
		GTK_VALUE_POINTER(args[1]) = &ret;
		child->create_view_cbm(NULL, child->create_view_data, 1, args);
		return ret;
	}
	else
		return child->create_view(GNOME_MDI_CHILD(child),
						 child->create_view_data);
}