Blame gtk/gtkbbox.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Packit Service fb6fa5
 * file for a list of people on the GTK+ Team.  See the ChangeLog
Packit Service fb6fa5
 * files for a list of changes.  These files are distributed with
Packit Service fb6fa5
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include "gtkbbox.h"
Packit Service fb6fa5
#include "gtkhbbox.h"
Packit Service fb6fa5
#include "gtkvbbox.h"
Packit Service fb6fa5
#include "gtkorientable.h"
Packit Service fb6fa5
#include "gtkprivate.h"
Packit Service fb6fa5
#include "gtkintl.h"
Packit Service fb6fa5
#include "gtkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
enum {
Packit Service fb6fa5
  PROP_0,
Packit Service fb6fa5
  PROP_LAYOUT_STYLE
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
enum {
Packit Service fb6fa5
  CHILD_PROP_0,
Packit Service fb6fa5
  CHILD_PROP_SECONDARY
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static void gtk_button_box_set_property       (GObject           *object,
Packit Service fb6fa5
					       guint              prop_id,
Packit Service fb6fa5
					       const GValue      *value,
Packit Service fb6fa5
					       GParamSpec        *pspec);
Packit Service fb6fa5
static void gtk_button_box_get_property       (GObject           *object,
Packit Service fb6fa5
					       guint              prop_id,
Packit Service fb6fa5
					       GValue            *value,
Packit Service fb6fa5
					       GParamSpec        *pspec);
Packit Service fb6fa5
static void gtk_button_box_size_request       (GtkWidget         *widget,
Packit Service fb6fa5
                                               GtkRequisition    *requisition);
Packit Service fb6fa5
static void gtk_button_box_size_allocate      (GtkWidget         *widget,
Packit Service fb6fa5
                                               GtkAllocation     *allocation);
Packit Service fb6fa5
static void gtk_button_box_set_child_property (GtkContainer      *container,
Packit Service fb6fa5
					       GtkWidget         *child,
Packit Service fb6fa5
					       guint              property_id,
Packit Service fb6fa5
					       const GValue      *value,
Packit Service fb6fa5
					       GParamSpec        *pspec);
Packit Service fb6fa5
static void gtk_button_box_get_child_property (GtkContainer      *container,
Packit Service fb6fa5
					       GtkWidget         *child,
Packit Service fb6fa5
					       guint              property_id,
Packit Service fb6fa5
					       GValue            *value,
Packit Service fb6fa5
					       GParamSpec        *pspec);
Packit Service fb6fa5
Packit Service fb6fa5
#define DEFAULT_CHILD_MIN_WIDTH 85
Packit Service fb6fa5
#define DEFAULT_CHILD_MIN_HEIGHT 27
Packit Service fb6fa5
#define DEFAULT_CHILD_IPAD_X 4
Packit Service fb6fa5
#define DEFAULT_CHILD_IPAD_Y 0
Packit Service fb6fa5
Packit Service fb6fa5
G_DEFINE_ABSTRACT_TYPE (GtkButtonBox, gtk_button_box, GTK_TYPE_BOX)
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_box_class_init (GtkButtonBoxClass *class)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidgetClass *widget_class;
Packit Service fb6fa5
  GObjectClass *gobject_class;
Packit Service fb6fa5
  GtkContainerClass *container_class;
Packit Service fb6fa5
Packit Service fb6fa5
  gobject_class = G_OBJECT_CLASS (class);
Packit Service fb6fa5
  widget_class = (GtkWidgetClass*) class;
Packit Service fb6fa5
  container_class = (GtkContainerClass*) class;
Packit Service fb6fa5
Packit Service fb6fa5
  gobject_class->set_property = gtk_button_box_set_property;
Packit Service fb6fa5
  gobject_class->get_property = gtk_button_box_get_property;
Packit Service fb6fa5
Packit Service fb6fa5
  widget_class->size_request = gtk_button_box_size_request;
Packit Service fb6fa5
  widget_class->size_allocate = gtk_button_box_size_allocate;
Packit Service fb6fa5
Packit Service fb6fa5
  container_class->set_child_property = gtk_button_box_set_child_property;
Packit Service fb6fa5
  container_class->get_child_property = gtk_button_box_get_child_property;
Packit Service fb6fa5
Packit Service fb6fa5
  /* FIXME we need to override the "spacing" property on GtkBox once
Packit Service fb6fa5
   * libgobject allows that.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_int ("child-min-width",
Packit Service fb6fa5
							     P_("Minimum child width"),
Packit Service fb6fa5
							     P_("Minimum width of buttons inside the box"),
Packit Service fb6fa5
							     0,
Packit Service fb6fa5
							     G_MAXINT,
Packit Service fb6fa5
                                                             DEFAULT_CHILD_MIN_WIDTH,
Packit Service fb6fa5
							     GTK_PARAM_READABLE));
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_int ("child-min-height",
Packit Service fb6fa5
							     P_("Minimum child height"),
Packit Service fb6fa5
							     P_("Minimum height of buttons inside the box"),
Packit Service fb6fa5
							     0,
Packit Service fb6fa5
							     G_MAXINT,
Packit Service fb6fa5
                                                             DEFAULT_CHILD_MIN_HEIGHT,
Packit Service fb6fa5
							     GTK_PARAM_READABLE));
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_int ("child-internal-pad-x",
Packit Service fb6fa5
							     P_("Child internal width padding"),
Packit Service fb6fa5
							     P_("Amount to increase child's size on either side"),
Packit Service fb6fa5
							     0,
Packit Service fb6fa5
							     G_MAXINT,
Packit Service fb6fa5
                                                             DEFAULT_CHILD_IPAD_X,
Packit Service fb6fa5
							     GTK_PARAM_READABLE));
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_class_install_style_property (widget_class,
Packit Service fb6fa5
					   g_param_spec_int ("child-internal-pad-y",
Packit Service fb6fa5
							     P_("Child internal height padding"),
Packit Service fb6fa5
							     P_("Amount to increase child's size on the top and bottom"),
Packit Service fb6fa5
							     0,
Packit Service fb6fa5
							     G_MAXINT,
Packit Service fb6fa5
                                                             DEFAULT_CHILD_IPAD_Y,
Packit Service fb6fa5
							     GTK_PARAM_READABLE));
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_LAYOUT_STYLE,
Packit Service fb6fa5
                                   g_param_spec_enum ("layout-style",
Packit Service fb6fa5
                                                      P_("Layout style"),
Packit Service fb6fa5
                                                      P_("How to lay out the buttons in the box. Possible values are: default, spread, edge, start and end"),
Packit Service fb6fa5
						      GTK_TYPE_BUTTON_BOX_STYLE,
Packit Service fb6fa5
						      GTK_BUTTONBOX_DEFAULT_STYLE,
Packit Service fb6fa5
                                                      GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_container_class_install_child_property (container_class,
Packit Service fb6fa5
					      CHILD_PROP_SECONDARY,
Packit Service fb6fa5
					      g_param_spec_boolean ("secondary", 
Packit Service fb6fa5
								    P_("Secondary"),
Packit Service fb6fa5
								    P_("If TRUE, the child appears in a secondary group of children, suitable for, e.g., help buttons"),
Packit Service fb6fa5
								    FALSE,
Packit Service fb6fa5
								    GTK_PARAM_READWRITE));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_box_init (GtkButtonBox *button_box)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GTK_BOX (button_box)->spacing = 0;
Packit Service fb6fa5
  button_box->child_min_width = GTK_BUTTONBOX_DEFAULT;
Packit Service fb6fa5
  button_box->child_min_height = GTK_BUTTONBOX_DEFAULT;
Packit Service fb6fa5
  button_box->child_ipad_x = GTK_BUTTONBOX_DEFAULT;
Packit Service fb6fa5
  button_box->child_ipad_y = GTK_BUTTONBOX_DEFAULT;
Packit Service fb6fa5
  button_box->layout_style = GTK_BUTTONBOX_DEFAULT_STYLE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_box_set_property (GObject         *object,
Packit Service fb6fa5
			     guint            prop_id,
Packit Service fb6fa5
			     const GValue    *value,
Packit Service fb6fa5
			     GParamSpec      *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  switch (prop_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case PROP_LAYOUT_STYLE:
Packit Service fb6fa5
      gtk_button_box_set_layout (GTK_BUTTON_BOX (object),
Packit Service fb6fa5
				 g_value_get_enum (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_box_get_property (GObject         *object,
Packit Service fb6fa5
			     guint            prop_id,
Packit Service fb6fa5
			     GValue          *value,
Packit Service fb6fa5
			     GParamSpec      *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  switch (prop_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case PROP_LAYOUT_STYLE:
Packit Service fb6fa5
      g_value_set_enum (value, GTK_BUTTON_BOX (object)->layout_style);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_box_set_child_property (GtkContainer    *container,
Packit Service fb6fa5
				   GtkWidget       *child,
Packit Service fb6fa5
				   guint            property_id,
Packit Service fb6fa5
				   const GValue    *value,
Packit Service fb6fa5
				   GParamSpec      *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  switch (property_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case CHILD_PROP_SECONDARY:
Packit Service fb6fa5
      gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (container), child,
Packit Service fb6fa5
					  g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_box_get_child_property (GtkContainer *container,
Packit Service fb6fa5
				   GtkWidget    *child,
Packit Service fb6fa5
				   guint         property_id,
Packit Service fb6fa5
				   GValue       *value,
Packit Service fb6fa5
				   GParamSpec   *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  switch (property_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case CHILD_PROP_SECONDARY:
Packit Service fb6fa5
      g_value_set_boolean (value, 
Packit Service fb6fa5
			   gtk_button_box_get_child_secondary (GTK_BUTTON_BOX (container), 
Packit Service fb6fa5
							       child));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* set per widget values for spacing, child size and child internal padding */
Packit Service fb6fa5
Packit Service fb6fa5
void 
Packit Service fb6fa5
gtk_button_box_set_child_size (GtkButtonBox *widget, 
Packit Service fb6fa5
                               gint width, gint height)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON_BOX (widget));
Packit Service fb6fa5
Packit Service fb6fa5
  widget->child_min_width = width;
Packit Service fb6fa5
  widget->child_min_height = height;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void 
Packit Service fb6fa5
gtk_button_box_set_child_ipadding (GtkButtonBox *widget,
Packit Service fb6fa5
                                   gint ipad_x, gint ipad_y)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON_BOX (widget));
Packit Service fb6fa5
Packit Service fb6fa5
  widget->child_ipad_x = ipad_x;
Packit Service fb6fa5
  widget->child_ipad_y = ipad_y;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_box_set_layout (GtkButtonBox      *widget, 
Packit Service fb6fa5
                           GtkButtonBoxStyle  layout_style)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON_BOX (widget));
Packit Service fb6fa5
  g_return_if_fail (layout_style >= GTK_BUTTONBOX_DEFAULT_STYLE &&
Packit Service fb6fa5
		    layout_style <= GTK_BUTTONBOX_CENTER);
Packit Service fb6fa5
Packit Service fb6fa5
  if (widget->layout_style != layout_style)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      widget->layout_style = layout_style;
Packit Service fb6fa5
      g_object_notify (G_OBJECT (widget), "layout-style");
Packit Service fb6fa5
      gtk_widget_queue_resize (GTK_WIDGET (widget));
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/* get per widget values for spacing, child size and child internal padding */
Packit Service fb6fa5
Packit Service fb6fa5
void 
Packit Service fb6fa5
gtk_button_box_get_child_size (GtkButtonBox *widget,
Packit Service fb6fa5
                               gint *width, gint *height)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON_BOX (widget));
Packit Service fb6fa5
  g_return_if_fail (width != NULL);
Packit Service fb6fa5
  g_return_if_fail (height != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  *width  = widget->child_min_width;
Packit Service fb6fa5
  *height = widget->child_min_height;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_button_box_get_child_ipadding (GtkButtonBox *widget,
Packit Service fb6fa5
                                   gint* ipad_x, gint *ipad_y)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON_BOX (widget));
Packit Service fb6fa5
  g_return_if_fail (ipad_x != NULL);
Packit Service fb6fa5
  g_return_if_fail (ipad_y != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  *ipad_x = widget->child_ipad_x;
Packit Service fb6fa5
  *ipad_y = widget->child_ipad_y;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GtkButtonBoxStyle 
Packit Service fb6fa5
gtk_button_box_get_layout (GtkButtonBox *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_BUTTON_BOX (widget), GTK_BUTTONBOX_SPREAD);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return widget->layout_style;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_box_get_child_secondary:
Packit Service fb6fa5
 * @widget: a #GtkButtonBox
Packit Service fb6fa5
 * @child: a child of @widget 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns whether @child should appear in a secondary group of children.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: whether @child should appear in a secondary group of children.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.4
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean 
Packit Service fb6fa5
gtk_button_box_get_child_secondary (GtkButtonBox *widget,
Packit Service fb6fa5
				    GtkWidget    *child)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *list;
Packit Service fb6fa5
  GtkBoxChild *child_info;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_BUTTON_BOX (widget), FALSE);
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_WIDGET (child), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  child_info = NULL;
Packit Service fb6fa5
  list = GTK_BOX (widget)->children;
Packit Service fb6fa5
  while (list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      child_info = list->data;
Packit Service fb6fa5
      if (child_info->widget == child)
Packit Service fb6fa5
	break;
Packit Service fb6fa5
Packit Service fb6fa5
      list = list->next;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (list != NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  return child_info->is_secondary;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_button_box_set_child_secondary
Packit Service fb6fa5
 * @widget: a #GtkButtonBox
Packit Service fb6fa5
 * @child: a child of @widget
Packit Service fb6fa5
 * @is_secondary: if %TRUE, the @child appears in a secondary group of the
Packit Service fb6fa5
 *                button box.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets whether @child should appear in a secondary group of children.
Packit Service fb6fa5
 * A typical use of a secondary child is the help button in a dialog.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This group appears after the other children if the style
Packit Service fb6fa5
 * is %GTK_BUTTONBOX_START, %GTK_BUTTONBOX_SPREAD or
Packit Service fb6fa5
 * %GTK_BUTTONBOX_EDGE, and before the other children if the style
Packit Service fb6fa5
 * is %GTK_BUTTONBOX_END. For horizontal button boxes, the definition
Packit Service fb6fa5
 * of before/after depends on direction of the widget (see
Packit Service fb6fa5
 * gtk_widget_set_direction()). If the style is %GTK_BUTTONBOX_START
Packit Service fb6fa5
 * or %GTK_BUTTONBOX_END, then the secondary children are aligned at
Packit Service fb6fa5
 * the other end of the button box from the main children. For the
Packit Service fb6fa5
 * other styles, they appear immediately next to the main children.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void 
Packit Service fb6fa5
gtk_button_box_set_child_secondary (GtkButtonBox *widget, 
Packit Service fb6fa5
				    GtkWidget    *child,
Packit Service fb6fa5
				    gboolean      is_secondary)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *list;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON_BOX (widget));
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_WIDGET (child));
Packit Service fb6fa5
  g_return_if_fail (child->parent == GTK_WIDGET (widget));
Packit Service fb6fa5
Packit Service fb6fa5
  list = GTK_BOX (widget)->children;
Packit Service fb6fa5
  while (list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkBoxChild *child_info = list->data;
Packit Service fb6fa5
      if (child_info->widget == child)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  child_info->is_secondary = is_secondary;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      list = list->next;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_child_notify (child, "secondary");
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_widget_get_visible (GTK_WIDGET (widget))
Packit Service fb6fa5
      && gtk_widget_get_visible (child))
Packit Service fb6fa5
    gtk_widget_queue_resize (child);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* Ask children how much space they require and round up 
Packit Service fb6fa5
   to match minimum size and internal padding.
Packit Service fb6fa5
   Returns the size each single child should have. */
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_button_box_child_requisition (GtkWidget *widget,
Packit Service fb6fa5
                                   int       *nvis_children,
Packit Service fb6fa5
				   int       *nvis_secondaries,
Packit Service fb6fa5
                                   int       *width,
Packit Service fb6fa5
                                   int       *height)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkButtonBox *bbox;
Packit Service fb6fa5
  GtkBoxChild *child;
Packit Service fb6fa5
  GList *children;
Packit Service fb6fa5
  gint nchildren;
Packit Service fb6fa5
  gint nsecondaries;
Packit Service fb6fa5
  gint needed_width;
Packit Service fb6fa5
  gint needed_height;
Packit Service fb6fa5
  GtkRequisition child_requisition;
Packit Service fb6fa5
  gint ipad_w;
Packit Service fb6fa5
  gint ipad_h;
Packit Service fb6fa5
  gint width_default;
Packit Service fb6fa5
  gint height_default;
Packit Service fb6fa5
  gint ipad_x_default;
Packit Service fb6fa5
  gint ipad_y_default;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gint child_min_width;
Packit Service fb6fa5
  gint child_min_height;
Packit Service fb6fa5
  gint ipad_x;
Packit Service fb6fa5
  gint ipad_y;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_BUTTON_BOX (widget));
Packit Service fb6fa5
Packit Service fb6fa5
  bbox = GTK_BUTTON_BOX (widget);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_style_get (widget,
Packit Service fb6fa5
                        "child-min-width", &width_default,
Packit Service fb6fa5
                        "child-min-height", &height_default,
Packit Service fb6fa5
                        "child-internal-pad-x", &ipad_x_default,
Packit Service fb6fa5
                        "child-internal-pad-y", &ipad_y_default, 
Packit Service fb6fa5
			NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  child_min_width = bbox->child_min_width   != GTK_BUTTONBOX_DEFAULT
Packit Service fb6fa5
	  ? bbox->child_min_width : width_default;
Packit Service fb6fa5
  child_min_height = bbox->child_min_height !=GTK_BUTTONBOX_DEFAULT
Packit Service fb6fa5
	  ? bbox->child_min_height : height_default;
Packit Service fb6fa5
  ipad_x = bbox->child_ipad_x != GTK_BUTTONBOX_DEFAULT
Packit Service fb6fa5
	  ? bbox->child_ipad_x : ipad_x_default;
Packit Service fb6fa5
  ipad_y = bbox->child_ipad_y != GTK_BUTTONBOX_DEFAULT
Packit Service fb6fa5
	  ? bbox->child_ipad_y : ipad_y_default;
Packit Service fb6fa5
Packit Service fb6fa5
  nchildren = 0;
Packit Service fb6fa5
  nsecondaries = 0;
Packit Service fb6fa5
  children = GTK_BOX(bbox)->children;
Packit Service fb6fa5
  needed_width = child_min_width;
Packit Service fb6fa5
  needed_height = child_min_height;  
Packit Service fb6fa5
  ipad_w = ipad_x * 2;
Packit Service fb6fa5
  ipad_h = ipad_y * 2;
Packit Service fb6fa5
  
Packit Service fb6fa5
  while (children)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      child = children->data;
Packit Service fb6fa5
      children = children->next;
Packit Service fb6fa5
Packit Service fb6fa5
      if (gtk_widget_get_visible (child->widget))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  nchildren += 1;
Packit Service fb6fa5
	  gtk_widget_size_request (child->widget, &child_requisition);
Packit Service fb6fa5
Packit Service fb6fa5
	  if (child_requisition.width + ipad_w > needed_width)
Packit Service fb6fa5
	    needed_width = child_requisition.width + ipad_w;
Packit Service fb6fa5
	  if (child_requisition.height + ipad_h > needed_height)
Packit Service fb6fa5
	    needed_height = child_requisition.height + ipad_h;
Packit Service fb6fa5
	  if (child->is_secondary)
Packit Service fb6fa5
	    nsecondaries++;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (nvis_children)
Packit Service fb6fa5
    *nvis_children = nchildren;
Packit Service fb6fa5
  if (nvis_secondaries)
Packit Service fb6fa5
    *nvis_secondaries = nsecondaries;
Packit Service fb6fa5
  if (width)
Packit Service fb6fa5
    *width = needed_width;
Packit Service fb6fa5
  if (height)
Packit Service fb6fa5
    *height = needed_height;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* this is a kludge function to support the deprecated
Packit Service fb6fa5
 * gtk_[vh]button_box_set_layout_default() just in case anyone is still
Packit Service fb6fa5
 * using it (why?)
Packit Service fb6fa5
 */
Packit Service fb6fa5
static GtkButtonBoxStyle
Packit Service fb6fa5
gtk_button_box_kludge_get_layout_default (GtkButtonBox *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkOrientation orientation;
Packit Service fb6fa5
Packit Service fb6fa5
  orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (widget));
Packit Service fb6fa5
Packit Service fb6fa5
  if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
    return _gtk_hbutton_box_get_layout_default ();
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return _gtk_vbutton_box_get_layout_default ();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_box_size_request (GtkWidget      *widget,
Packit Service fb6fa5
                             GtkRequisition *requisition)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkBox *box;
Packit Service fb6fa5
  GtkButtonBox *bbox;
Packit Service fb6fa5
  gint nvis_children;
Packit Service fb6fa5
  gint child_width;
Packit Service fb6fa5
  gint child_height;
Packit Service fb6fa5
  gint spacing;
Packit Service fb6fa5
  GtkButtonBoxStyle layout;
Packit Service fb6fa5
  GtkOrientation orientation;
Packit Service fb6fa5
Packit Service fb6fa5
  box = GTK_BOX (widget);
Packit Service fb6fa5
  bbox = GTK_BUTTON_BOX (widget);
Packit Service fb6fa5
Packit Service fb6fa5
  orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (widget));
Packit Service fb6fa5
  spacing = box->spacing;
Packit Service fb6fa5
  layout = bbox->layout_style != GTK_BUTTONBOX_DEFAULT_STYLE
Packit Service fb6fa5
	  ? bbox->layout_style : gtk_button_box_kludge_get_layout_default (GTK_BUTTON_BOX (widget));
Packit Service fb6fa5
Packit Service fb6fa5
  _gtk_button_box_child_requisition (widget,
Packit Service fb6fa5
                                     &nvis_children,
Packit Service fb6fa5
				     NULL,
Packit Service fb6fa5
                                     &child_width,
Packit Service fb6fa5
                                     &child_height);
Packit Service fb6fa5
Packit Service fb6fa5
  if (nvis_children == 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      requisition->width = 0;
Packit Service fb6fa5
      requisition->height = 0;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      switch (layout)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          case GTK_BUTTONBOX_SPREAD:
Packit Service fb6fa5
            if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
              requisition->width =
Packit Service fb6fa5
                      nvis_children*child_width + ((nvis_children+1)*spacing);
Packit Service fb6fa5
            else
Packit Service fb6fa5
              requisition->height =
Packit Service fb6fa5
                      nvis_children*child_height + ((nvis_children+1)*spacing);
Packit Service fb6fa5
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case GTK_BUTTONBOX_EDGE:
Packit Service fb6fa5
          case GTK_BUTTONBOX_START:
Packit Service fb6fa5
          case GTK_BUTTONBOX_END:
Packit Service fb6fa5
          case GTK_BUTTONBOX_CENTER:
Packit Service fb6fa5
            if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
              requisition->width =
Packit Service fb6fa5
                      nvis_children*child_width + ((nvis_children-1)*spacing);
Packit Service fb6fa5
            else
Packit Service fb6fa5
              requisition->height =
Packit Service fb6fa5
                      nvis_children*child_height + ((nvis_children-1)*spacing);
Packit Service fb6fa5
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          default:
Packit Service fb6fa5
            g_assert_not_reached ();
Packit Service fb6fa5
            break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
        requisition->height = child_height;
Packit Service fb6fa5
      else
Packit Service fb6fa5
        requisition->width = child_width;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  requisition->width += GTK_CONTAINER (box)->border_width * 2;
Packit Service fb6fa5
  requisition->height += GTK_CONTAINER (box)->border_width * 2;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_button_box_size_allocate (GtkWidget     *widget,
Packit Service fb6fa5
                              GtkAllocation *allocation)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkBox *base_box;
Packit Service fb6fa5
  GtkButtonBox *box;
Packit Service fb6fa5
  GtkBoxChild *child;
Packit Service fb6fa5
  GList *children;
Packit Service fb6fa5
  GtkAllocation child_allocation;
Packit Service fb6fa5
  gint nvis_children;
Packit Service fb6fa5
  gint n_secondaries;
Packit Service fb6fa5
  gint child_width;
Packit Service fb6fa5
  gint child_height;
Packit Service fb6fa5
  gint x = 0;
Packit Service fb6fa5
  gint y = 0;
Packit Service fb6fa5
  gint secondary_x = 0;
Packit Service fb6fa5
  gint secondary_y = 0;
Packit Service fb6fa5
  gint width = 0;
Packit Service fb6fa5
  gint height = 0;
Packit Service fb6fa5
  gint childspace;
Packit Service fb6fa5
  gint childspacing = 0;
Packit Service fb6fa5
  GtkButtonBoxStyle layout;
Packit Service fb6fa5
  gint spacing;
Packit Service fb6fa5
  GtkOrientation orientation;
Packit Service fb6fa5
Packit Service fb6fa5
  orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (widget));
Packit Service fb6fa5
  base_box = GTK_BOX (widget);
Packit Service fb6fa5
  box = GTK_BUTTON_BOX (widget);
Packit Service fb6fa5
  spacing = base_box->spacing;
Packit Service fb6fa5
  layout = box->layout_style != GTK_BUTTONBOX_DEFAULT_STYLE
Packit Service fb6fa5
	  ? box->layout_style : gtk_button_box_kludge_get_layout_default (GTK_BUTTON_BOX (widget));
Packit Service fb6fa5
  _gtk_button_box_child_requisition (widget,
Packit Service fb6fa5
                                     &nvis_children,
Packit Service fb6fa5
                                     &n_secondaries,
Packit Service fb6fa5
                                     &child_width,
Packit Service fb6fa5
                                     &child_height);
Packit Service fb6fa5
  widget->allocation = *allocation;
Packit Service fb6fa5
Packit Service fb6fa5
  if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
    width = allocation->width - GTK_CONTAINER (box)->border_width*2;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    height = allocation->height - GTK_CONTAINER (box)->border_width*2;
Packit Service fb6fa5
Packit Service fb6fa5
  switch (layout)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      case GTK_BUTTONBOX_SPREAD:
Packit Service fb6fa5
Packit Service fb6fa5
        if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
          {
Packit Service fb6fa5
            childspacing = (width - (nvis_children * child_width))
Packit Service fb6fa5
                    / (nvis_children + 1);
Packit Service fb6fa5
            x = allocation->x + GTK_CONTAINER (box)->border_width
Packit Service fb6fa5
                    + childspacing;
Packit Service fb6fa5
            secondary_x = x + ((nvis_children - n_secondaries)
Packit Service fb6fa5
                            * (child_width + childspacing));
Packit Service fb6fa5
          }
Packit Service fb6fa5
        else
Packit Service fb6fa5
          {
Packit Service fb6fa5
            childspacing = (height - (nvis_children * child_height))
Packit Service fb6fa5
                    / (nvis_children + 1);
Packit Service fb6fa5
            y = allocation->y + GTK_CONTAINER (box)->border_width
Packit Service fb6fa5
                    + childspacing;
Packit Service fb6fa5
            secondary_y = y + ((nvis_children - n_secondaries)
Packit Service fb6fa5
                            * (child_height + childspacing));
Packit Service fb6fa5
          }
Packit Service fb6fa5
Packit Service fb6fa5
        break;
Packit Service fb6fa5
Packit Service fb6fa5
      case GTK_BUTTONBOX_EDGE:
Packit Service fb6fa5
Packit Service fb6fa5
        if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
          {
Packit Service fb6fa5
            if (nvis_children >= 2)
Packit Service fb6fa5
              {
Packit Service fb6fa5
                childspacing = (width - (nvis_children * child_width))
Packit Service fb6fa5
                      / (nvis_children - 1);
Packit Service fb6fa5
                x = allocation->x + GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
                secondary_x = x + ((nvis_children - n_secondaries)
Packit Service fb6fa5
                                   * (child_width + childspacing));
Packit Service fb6fa5
              }
Packit Service fb6fa5
            else
Packit Service fb6fa5
              {
Packit Service fb6fa5
                /* one or zero children, just center */
Packit Service fb6fa5
                childspacing = width;
Packit Service fb6fa5
                x = secondary_x = allocation->x
Packit Service fb6fa5
                      + (allocation->width - child_width) / 2;
Packit Service fb6fa5
              }
Packit Service fb6fa5
          }
Packit Service fb6fa5
        else
Packit Service fb6fa5
          {
Packit Service fb6fa5
            if (nvis_children >= 2)
Packit Service fb6fa5
              {
Packit Service fb6fa5
                childspacing = (height - (nvis_children*child_height))
Packit Service fb6fa5
                        / (nvis_children-1);
Packit Service fb6fa5
                y = allocation->y + GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
                secondary_y = y + ((nvis_children - n_secondaries)
Packit Service fb6fa5
                                * (child_height + childspacing));
Packit Service fb6fa5
              }
Packit Service fb6fa5
            else
Packit Service fb6fa5
              {
Packit Service fb6fa5
                /* one or zero children, just center */
Packit Service fb6fa5
                childspacing = height;
Packit Service fb6fa5
                y = secondary_y = allocation->y
Packit Service fb6fa5
                        + (allocation->height - child_height) / 2;
Packit Service fb6fa5
              }
Packit Service fb6fa5
          }
Packit Service fb6fa5
Packit Service fb6fa5
        break;
Packit Service fb6fa5
Packit Service fb6fa5
      case GTK_BUTTONBOX_START:
Packit Service fb6fa5
Packit Service fb6fa5
        if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
          {
Packit Service fb6fa5
            childspacing = spacing;
Packit Service fb6fa5
            x = allocation->x + GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
            secondary_x = allocation->x + allocation->width
Packit Service fb6fa5
              - child_width * n_secondaries
Packit Service fb6fa5
              - spacing * (n_secondaries - 1)
Packit Service fb6fa5
              - GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
          }
Packit Service fb6fa5
        else
Packit Service fb6fa5
          {
Packit Service fb6fa5
            childspacing = spacing;
Packit Service fb6fa5
            y = allocation->y + GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
            secondary_y = allocation->y + allocation->height
Packit Service fb6fa5
              - child_height * n_secondaries
Packit Service fb6fa5
              - spacing * (n_secondaries - 1)
Packit Service fb6fa5
              - GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
          }
Packit Service fb6fa5
Packit Service fb6fa5
        break;
Packit Service fb6fa5
Packit Service fb6fa5
      case GTK_BUTTONBOX_END:
Packit Service fb6fa5
Packit Service fb6fa5
        if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
          {
Packit Service fb6fa5
            childspacing = spacing;
Packit Service fb6fa5
            x = allocation->x + allocation->width
Packit Service fb6fa5
              - child_width * (nvis_children - n_secondaries)
Packit Service fb6fa5
              - spacing * (nvis_children - n_secondaries - 1)
Packit Service fb6fa5
              - GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
            secondary_x = allocation->x + GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
          }
Packit Service fb6fa5
        else
Packit Service fb6fa5
          {
Packit Service fb6fa5
            childspacing = spacing;
Packit Service fb6fa5
            y = allocation->y + allocation->height
Packit Service fb6fa5
              - child_height * (nvis_children - n_secondaries)
Packit Service fb6fa5
              - spacing * (nvis_children - n_secondaries - 1)
Packit Service fb6fa5
              - GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
            secondary_y = allocation->y + GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
          }
Packit Service fb6fa5
Packit Service fb6fa5
        break;
Packit Service fb6fa5
Packit Service fb6fa5
      case GTK_BUTTONBOX_CENTER:
Packit Service fb6fa5
Packit Service fb6fa5
        if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
          {
Packit Service fb6fa5
            childspacing = spacing;
Packit Service fb6fa5
            x = allocation->x +
Packit Service fb6fa5
              (allocation->width
Packit Service fb6fa5
               - (child_width * (nvis_children - n_secondaries)
Packit Service fb6fa5
               + spacing * (nvis_children - n_secondaries - 1))) / 2
Packit Service fb6fa5
              + (n_secondaries * child_width + n_secondaries * spacing) / 2;
Packit Service fb6fa5
            secondary_x = allocation->x + GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
          }
Packit Service fb6fa5
        else
Packit Service fb6fa5
          {
Packit Service fb6fa5
            childspacing = spacing;
Packit Service fb6fa5
            y = allocation->y +
Packit Service fb6fa5
              (allocation->height
Packit Service fb6fa5
               - (child_height * (nvis_children - n_secondaries)
Packit Service fb6fa5
                  + spacing * (nvis_children - n_secondaries - 1))) / 2
Packit Service fb6fa5
              + (n_secondaries * child_height + n_secondaries * spacing) / 2;
Packit Service fb6fa5
            secondary_y = allocation->y + GTK_CONTAINER (box)->border_width;
Packit Service fb6fa5
          }
Packit Service fb6fa5
Packit Service fb6fa5
        break;
Packit Service fb6fa5
Packit Service fb6fa5
      default:
Packit Service fb6fa5
        g_assert_not_reached ();
Packit Service fb6fa5
        break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
    if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
      {
Packit Service fb6fa5
        y = allocation->y + (allocation->height - child_height) / 2;
Packit Service fb6fa5
        childspace = child_width + childspacing;
Packit Service fb6fa5
      }
Packit Service fb6fa5
    else
Packit Service fb6fa5
      {
Packit Service fb6fa5
        x = allocation->x + (allocation->width - child_width) / 2;
Packit Service fb6fa5
        childspace = child_height + childspacing;
Packit Service fb6fa5
      }
Packit Service fb6fa5
Packit Service fb6fa5
  children = GTK_BOX (box)->children;
Packit Service fb6fa5
Packit Service fb6fa5
  while (children)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      child = children->data;
Packit Service fb6fa5
      children = children->next;
Packit Service fb6fa5
Packit Service fb6fa5
      if (gtk_widget_get_visible (child->widget))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          child_allocation.width = child_width;
Packit Service fb6fa5
          child_allocation.height = child_height;
Packit Service fb6fa5
Packit Service fb6fa5
          if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              child_allocation.y = y;
Packit Service fb6fa5
Packit Service fb6fa5
              if (child->is_secondary)
Packit Service fb6fa5
                {
Packit Service fb6fa5
                  child_allocation.x = secondary_x;
Packit Service fb6fa5
                  secondary_x += childspace;
Packit Service fb6fa5
                }
Packit Service fb6fa5
              else
Packit Service fb6fa5
                {
Packit Service fb6fa5
                  child_allocation.x = x;
Packit Service fb6fa5
                  x += childspace;
Packit Service fb6fa5
                }
Packit Service fb6fa5
Packit Service fb6fa5
              if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
Packit Service fb6fa5
                  child_allocation.x = (allocation->x + allocation->width)
Packit Service fb6fa5
                          - (child_allocation.x + child_width - allocation->x);
Packit Service fb6fa5
            }
Packit Service fb6fa5
          else
Packit Service fb6fa5
            {
Packit Service fb6fa5
              child_allocation.x = x;
Packit Service fb6fa5
Packit Service fb6fa5
              if (child->is_secondary)
Packit Service fb6fa5
                {
Packit Service fb6fa5
                  child_allocation.y = secondary_y;
Packit Service fb6fa5
                  secondary_y += childspace;
Packit Service fb6fa5
                }
Packit Service fb6fa5
              else
Packit Service fb6fa5
                {
Packit Service fb6fa5
                  child_allocation.y = y;
Packit Service fb6fa5
                  y += childspace;
Packit Service fb6fa5
                }
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_widget_size_allocate (child->widget, &child_allocation);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GTK_BUTTON_BOX_C__
Packit Service fb6fa5
#include "gtkaliasdef.c"