]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkpacker.c
Adapt cast macros to standard.
[~andy/gtk] / gtk / gtkpacker.c
index 1a3e7b5c982dc1e6e4d3de478b4726a5fd7f8dfc..095855b4fff24dde66cc0de72d1af2b129b5a373 100644 (file)
@@ -85,10 +85,44 @@ terms specified in this license.
  *
  */
 
+/*
+ * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
+
 
 #include "gtkpacker.h"
 
 
+enum {
+  ARG_0,
+  ARG_SPACING,
+  ARG_D_BORDER_WIDTH,
+  ARG_D_PAD_X,
+  ARG_D_PAD_Y,
+  ARG_D_IPAD_X,
+  ARG_D_IPAD_Y
+};
+
+enum {
+  CHILD_ARG_0,
+  CHILD_ARG_SIDE,
+  CHILD_ARG_ANCHOR,
+  CHILD_ARG_EXPAND,
+  CHILD_ARG_FILL_X,
+  CHILD_ARG_FILL_Y,
+  CHILD_ARG_USE_DEFAULT,
+  CHILD_ARG_BORDER_WIDTH,
+  CHILD_ARG_PAD_X,
+  CHILD_ARG_PAD_Y,
+  CHILD_ARG_I_PAD_X,
+  CHILD_ARG_I_PAD_Y,
+  CHILD_ARG_POSITION
+};
+
 static void gtk_packer_class_init    (GtkPackerClass   *klass);
 static void gtk_packer_init          (GtkPacker        *packer);
 static void gtk_packer_map           (GtkWidget        *widget);
@@ -105,11 +139,26 @@ static void gtk_packer_container_add (GtkContainer   *container,
                                       GtkWidget      *child);
 static void gtk_packer_remove        (GtkContainer   *container,
                                       GtkWidget      *widget);
-static void gtk_packer_foreach       (GtkContainer   *container,
+static void gtk_packer_forall        (GtkContainer   *container,
+                                     gboolean        include_internals,
                                       GtkCallback     callback,
                                       gpointer        callback_data);
+static void gtk_packer_set_arg      (GtkObject      *object,
+                                     GtkArg         *arg,
+                                     guint           arg_id);
+static void gtk_packer_get_arg      (GtkObject      *object,
+                                     GtkArg         *arg,
+                                     guint           arg_id);
+static void gtk_packer_get_child_arg (GtkContainer   *container,
+                                     GtkWidget      *child,
+                                     GtkArg         *arg,
+                                     guint           arg_id);
+static void gtk_packer_set_child_arg (GtkContainer   *container,
+                                     GtkWidget      *child,
+                                     GtkArg         *arg,
+                                     guint           arg_id);
 static GtkType gtk_packer_child_type (GtkContainer   *container);
-
+     
 
 static GtkPackerClass *parent_class;
 
@@ -120,18 +169,19 @@ gtk_packer_get_type (void)
 
   if (!packer_type)
     {
-      GtkTypeInfo packer_info =
+      static const GtkTypeInfo packer_info =
       {
         "GtkPacker",
         sizeof (GtkPacker),
         sizeof (GtkPackerClass),
         (GtkClassInitFunc) gtk_packer_class_init,
         (GtkObjectInitFunc) gtk_packer_init,
-        (GtkArgSetFunc) NULL,
-        (GtkArgGetFunc) NULL
+        /* reserved_1 */ NULL,
+       /* reserved_2 */ NULL,
+       (GtkClassInitFunc) NULL,
       };
 
-      packer_type = gtk_type_unique (gtk_container_get_type (), &packer_info);
+      packer_type = gtk_type_unique (GTK_TYPE_CONTAINER, &packer_info);
     }
   
   return packer_type;
@@ -140,13 +190,38 @@ gtk_packer_get_type (void)
 static void
 gtk_packer_class_init (GtkPackerClass *klass)
 {
+  GtkObjectClass *object_class;
   GtkWidgetClass *widget_class;
   GtkContainerClass *container_class;
   
+  object_class = (GtkObjectClass*) klass;
   widget_class = (GtkWidgetClass*) klass;
   container_class = (GtkContainerClass*) klass;
-  parent_class = gtk_type_class (gtk_container_get_type ());
+  parent_class = gtk_type_class (GTK_TYPE_CONTAINER);
   
+  gtk_object_add_arg_type ("GtkPacker::spacing", GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_SPACING);
+  gtk_object_add_arg_type ("GtkPacker::default_border_width", GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_D_BORDER_WIDTH);
+  gtk_object_add_arg_type ("GtkPacker::default_pad_x", GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_D_PAD_X);
+  gtk_object_add_arg_type ("GtkPacker::default_pad_y", GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_D_PAD_Y);
+  gtk_object_add_arg_type ("GtkPacker::default_ipad_x", GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_D_IPAD_X);
+  gtk_object_add_arg_type ("GtkPacker::default_ipad_y", GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_D_IPAD_Y);
+
+  gtk_container_add_child_arg_type ("GtkPacker::side", GTK_TYPE_SIDE_TYPE, GTK_ARG_READWRITE, CHILD_ARG_SIDE);
+  gtk_container_add_child_arg_type ("GtkPacker::anchor", GTK_TYPE_ANCHOR_TYPE, GTK_ARG_READWRITE, CHILD_ARG_ANCHOR);
+  gtk_container_add_child_arg_type ("GtkPacker::expand", GTK_TYPE_BOOL, GTK_ARG_READWRITE, CHILD_ARG_EXPAND);
+  gtk_container_add_child_arg_type ("GtkPacker::fill_x", GTK_TYPE_BOOL, GTK_ARG_READWRITE, CHILD_ARG_FILL_X);
+  gtk_container_add_child_arg_type ("GtkPacker::fill_y", GTK_TYPE_BOOL, GTK_ARG_READWRITE, CHILD_ARG_FILL_Y);
+  gtk_container_add_child_arg_type ("GtkPacker::use_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, CHILD_ARG_USE_DEFAULT);
+  gtk_container_add_child_arg_type ("GtkPacker::border_width", GTK_TYPE_UINT, GTK_ARG_READWRITE, CHILD_ARG_BORDER_WIDTH);
+  gtk_container_add_child_arg_type ("GtkPacker::pad_x", GTK_TYPE_UINT, GTK_ARG_READWRITE, CHILD_ARG_PAD_X);
+  gtk_container_add_child_arg_type ("GtkPacker::pad_y", GTK_TYPE_UINT, GTK_ARG_READWRITE, CHILD_ARG_PAD_Y);
+  gtk_container_add_child_arg_type ("GtkPacker::ipad_x", GTK_TYPE_UINT, GTK_ARG_READWRITE, CHILD_ARG_I_PAD_X);
+  gtk_container_add_child_arg_type ("GtkPacker::ipad_y", GTK_TYPE_UINT, GTK_ARG_READWRITE, CHILD_ARG_I_PAD_Y);
+  gtk_container_add_child_arg_type ("GtkPacker::position", GTK_TYPE_LONG, GTK_ARG_READWRITE, CHILD_ARG_POSITION);
+
+  object_class->set_arg = gtk_packer_set_arg;
+  object_class->get_arg = gtk_packer_get_arg;
+
   widget_class->map = gtk_packer_map;
   widget_class->unmap = gtk_packer_unmap;
   widget_class->draw = gtk_packer_draw;
@@ -157,8 +232,87 @@ gtk_packer_class_init (GtkPackerClass *klass)
   
   container_class->add = gtk_packer_container_add;
   container_class->remove = gtk_packer_remove;
-  container_class->foreach = gtk_packer_foreach;
+  container_class->forall = gtk_packer_forall;
   container_class->child_type = gtk_packer_child_type;
+  container_class->get_child_arg = gtk_packer_get_child_arg;
+  container_class->set_child_arg = gtk_packer_set_child_arg;
+}
+
+static void
+gtk_packer_set_arg (GtkObject   *object,
+                   GtkArg       *arg,
+                   guint         arg_id)
+{
+  GtkPacker *packer;
+
+  packer = GTK_PACKER (object);
+
+  switch (arg_id)
+    {
+    case ARG_SPACING:
+      gtk_packer_set_spacing (packer, GTK_VALUE_UINT (*arg));
+      break;
+    case ARG_D_BORDER_WIDTH:
+      gtk_packer_set_default_border_width (packer, GTK_VALUE_UINT (*arg));
+      break;
+    case ARG_D_PAD_X:
+      gtk_packer_set_default_pad (packer,
+                                 GTK_VALUE_UINT (*arg),
+                                 packer->default_pad_y);
+      break;
+    case ARG_D_PAD_Y:
+      gtk_packer_set_default_pad (packer,
+                                 packer->default_pad_x,
+                                 GTK_VALUE_UINT (*arg));
+      break;
+    case ARG_D_IPAD_X:
+      gtk_packer_set_default_ipad (packer,
+                                  GTK_VALUE_UINT (*arg),
+                                  packer->default_i_pad_y);
+      break;
+    case ARG_D_IPAD_Y:
+      gtk_packer_set_default_ipad (packer,
+                                  packer->default_i_pad_x,
+                                  GTK_VALUE_UINT (*arg));
+      break;
+    default:
+      break;
+    }
+}
+
+static void
+gtk_packer_get_arg (GtkObject   *object,
+                   GtkArg       *arg,
+                   guint         arg_id)
+{
+  GtkPacker *packer;
+
+  packer = GTK_PACKER (object);
+
+  switch (arg_id)
+    {
+    case ARG_SPACING:
+      GTK_VALUE_UINT (*arg) = packer->spacing;
+      break;
+    case ARG_D_BORDER_WIDTH:
+      GTK_VALUE_UINT (*arg) = packer->default_border_width;
+      break;
+    case ARG_D_PAD_X:
+      GTK_VALUE_UINT (*arg) = packer->default_pad_x;
+      break;
+    case ARG_D_PAD_Y:
+      GTK_VALUE_UINT (*arg) = packer->default_pad_y;
+      break;
+    case ARG_D_IPAD_X:
+      GTK_VALUE_UINT (*arg) = packer->default_i_pad_x;
+      break;
+    case ARG_D_IPAD_Y:
+      GTK_VALUE_UINT (*arg) = packer->default_i_pad_y;
+      break;
+    default:
+      arg->type = GTK_TYPE_INVALID;
+      break;
+    }
 }
 
 static GtkType
@@ -167,10 +321,185 @@ gtk_packer_child_type (GtkContainer   *container)
   return GTK_TYPE_WIDGET;
 }
 
+static void
+gtk_packer_set_child_arg (GtkContainer   *container,
+                         GtkWidget      *child,
+                         GtkArg         *arg,
+                         guint           arg_id)
+{
+  GtkPacker *packer;
+  GtkPackerChild *child_info = NULL;
+  
+  packer = GTK_PACKER (container);
+
+  if (arg_id != CHILD_ARG_POSITION)
+    {
+      GList *list;
+      
+      list = packer->children;
+      while (list)
+       {
+         child_info = list->data;
+         if (child_info->widget == child)
+           break;
+         
+         list = list->next;
+       }
+      if (!list)
+       return;
+    }
+
+  switch (arg_id)
+    {
+    case CHILD_ARG_SIDE:
+      child_info->side = GTK_VALUE_ENUM (*arg);
+      break;
+    case CHILD_ARG_ANCHOR:
+      child_info->anchor = GTK_VALUE_ENUM (*arg);
+      break;
+    case CHILD_ARG_EXPAND:
+      if (GTK_VALUE_BOOL (*arg))
+       child_info->options |= GTK_PACK_EXPAND;
+      else
+       child_info->options &= ~GTK_PACK_EXPAND;
+      break;
+    case CHILD_ARG_FILL_X:
+      if (GTK_VALUE_BOOL (*arg))
+       child_info->options |= GTK_FILL_X;
+      else
+       child_info->options &= ~GTK_FILL_X;
+      break;
+    case CHILD_ARG_FILL_Y:
+      if (GTK_VALUE_BOOL (*arg))
+       child_info->options |= GTK_FILL_Y;
+      else
+       child_info->options &= ~GTK_FILL_Y;
+      break;
+    case CHILD_ARG_USE_DEFAULT:
+      child_info->use_default = (GTK_VALUE_BOOL (*arg) != 0);
+      break;
+    case CHILD_ARG_BORDER_WIDTH:
+      if (!child_info->use_default)
+       child_info->border_width = GTK_VALUE_UINT (*arg);
+      break;
+    case CHILD_ARG_PAD_X:
+      if (!child_info->use_default)
+       child_info->pad_x = GTK_VALUE_UINT (*arg);
+      break;
+    case CHILD_ARG_PAD_Y:
+      if (!child_info->use_default)
+       child_info->pad_y = GTK_VALUE_UINT (*arg);
+      break;
+    case CHILD_ARG_I_PAD_X:
+      if (!child_info->use_default)
+       child_info->i_pad_x = GTK_VALUE_UINT (*arg);
+      break;
+    case CHILD_ARG_I_PAD_Y:
+      if (!child_info->use_default)
+       child_info->i_pad_y = GTK_VALUE_UINT (*arg);
+      break;
+    case CHILD_ARG_POSITION:
+      gtk_packer_reorder_child (packer,
+                               child,
+                               GTK_VALUE_LONG (*arg));
+      break;
+    default:
+      break;
+    }
+
+  if (arg_id != CHILD_ARG_POSITION &&
+      GTK_WIDGET_VISIBLE (packer) &&
+      GTK_WIDGET_VISIBLE (child))
+    gtk_widget_queue_resize (child);
+}
+
+static void
+gtk_packer_get_child_arg (GtkContainer   *container,
+                         GtkWidget      *child,
+                         GtkArg         *arg,
+                         guint           arg_id)
+{
+  GtkPacker *packer;
+  GtkPackerChild *child_info = NULL;
+  GList * list;
+  
+  packer = GTK_PACKER (container);
+
+  if (arg_id != CHILD_ARG_POSITION)
+    {
+      list = packer->children;
+      while (list)
+       {
+         child_info = list->data;
+         if (child_info->widget == child)
+           break;
+         
+         list = list->next;
+       }
+      if (!list)
+       {
+         arg->type = GTK_TYPE_INVALID;
+         return;
+       }
+    }
+
+  switch (arg_id)
+    {
+    case CHILD_ARG_SIDE:
+      GTK_VALUE_ENUM (*arg) = child_info->side;
+      break;
+    case CHILD_ARG_ANCHOR:
+      GTK_VALUE_ENUM (*arg) = child_info->anchor;
+      break;
+    case CHILD_ARG_EXPAND:
+      GTK_VALUE_BOOL (*arg) = (child_info->options & GTK_PACK_EXPAND) != 0;
+      break;
+    case CHILD_ARG_FILL_X:
+      GTK_VALUE_BOOL (*arg) = (child_info->options & GTK_FILL_X) != 0;
+      break;
+    case CHILD_ARG_FILL_Y:
+      GTK_VALUE_BOOL (*arg) = (child_info->options & GTK_FILL_Y) != 0;
+      break;
+    case CHILD_ARG_USE_DEFAULT:
+      GTK_VALUE_BOOL (*arg) = child_info->use_default;
+      break;
+    case CHILD_ARG_BORDER_WIDTH:
+      GTK_VALUE_UINT (*arg) = child_info->border_width;
+      break;
+    case CHILD_ARG_PAD_X:
+      GTK_VALUE_UINT (*arg) = child_info->pad_x;
+      break;
+    case CHILD_ARG_PAD_Y:
+      GTK_VALUE_UINT (*arg) = child_info->pad_y;
+      break;
+    case CHILD_ARG_I_PAD_X:
+      GTK_VALUE_UINT (*arg) = child_info->i_pad_x;
+      break;
+    case CHILD_ARG_I_PAD_Y:
+      GTK_VALUE_UINT (*arg) = child_info->i_pad_y;
+      break;
+    case CHILD_ARG_POSITION:
+      GTK_VALUE_LONG (*arg) = 0;
+      for (list = packer->children; list; list = list->next)
+       {
+         child_info = list->data;
+         if (child_info->widget == child)
+           break;
+         GTK_VALUE_LONG (*arg)++;
+       }
+      if (!list)
+       GTK_VALUE_LONG (*arg) = -1;
+      break;
+    default:
+      arg->type = GTK_TYPE_INVALID;
+      break;
+    }
+}
+
 static void
 gtk_packer_init (GtkPacker *packer)
 {
-  GTK_WIDGET_SET_FLAGS (packer, GTK_NO_WINDOW | GTK_BASIC);
+  GTK_WIDGET_SET_FLAGS (packer, GTK_NO_WINDOW);
   
   packer->children = NULL;
   packer->spacing = 0;
@@ -186,14 +515,14 @@ gtk_packer_set_spacing (GtkPacker *packer,
   if (spacing != packer->spacing) 
     {
       packer->spacing = spacing;
-      gtk_widget_queue_resize(GTK_WIDGET(packer));
+      gtk_widget_queue_resize (GTK_WIDGET (packer));
     }
-};
+}
 
 GtkWidget*
 gtk_packer_new (void)
 {
-  return GTK_WIDGET (gtk_type_new (gtk_packer_get_type ()));
+  return GTK_WIDGET (gtk_type_new (GTK_TYPE_PACKER));
 }
 
 static void
@@ -214,7 +543,7 @@ redo_defaults_children (GtkPacker *packer)
          child->pad_y = packer->default_pad_y;
          child->i_pad_x = packer->default_i_pad_x;
          child->i_pad_y = packer->default_i_pad_y;
-         gtk_widget_queue_resize(GTK_WIDGET(packer));
+         gtk_widget_queue_resize (GTK_WIDGET (child->widget));
        }
       list = g_list_next(list);
     }
@@ -234,9 +563,9 @@ gtk_packer_set_default_border_width (GtkPacker *packer,
     }
 }
 void
-gtk_packer_set_default_pad(GtkPacker *packer,
-                          guint      pad_x,
-                          guint      pad_y)
+gtk_packer_set_default_pad (GtkPacker *packer,
+                           guint      pad_x,
+                           guint      pad_y)
 {
   g_return_if_fail (packer != NULL);
   g_return_if_fail (GTK_IS_PACKER (packer));
@@ -251,9 +580,9 @@ gtk_packer_set_default_pad(GtkPacker *packer,
 }
 
 void
-gtk_packer_set_default_ipad(GtkPacker *packer,
-                           guint      i_pad_x,
-                           guint      i_pad_y)
+gtk_packer_set_default_ipad (GtkPacker *packer,
+                            guint      i_pad_x,
+                            guint      i_pad_y)
 {
   g_return_if_fail (packer != NULL);
   g_return_if_fail (GTK_IS_PACKER (packer));
@@ -307,20 +636,16 @@ gtk_packer_add_defaults (GtkPacker       *packer,
   
   gtk_widget_set_parent (child, GTK_WIDGET (packer));
   
-  if (GTK_WIDGET_VISIBLE (GTK_WIDGET (packer))) 
+  if (GTK_WIDGET_REALIZED (child->parent))
+    gtk_widget_realize (child);
+
+  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
     {
-      if (GTK_WIDGET_REALIZED (GTK_WIDGET (packer)) &&
-          !GTK_WIDGET_REALIZED (child)) 
-        gtk_widget_realize (child);
-      
-      if (GTK_WIDGET_MAPPED (GTK_WIDGET (packer)) &&
-          !GTK_WIDGET_MAPPED (child)) 
-        gtk_widget_map (child);
-    }
+      if (GTK_WIDGET_MAPPED (child->parent))
+       gtk_widget_map (child);
 
-  if (GTK_WIDGET_VISIBLE (child) && GTK_WIDGET_VISIBLE (packer))
-    gtk_widget_queue_resize (child);
-  
+      gtk_widget_queue_resize (child);
+    }
 }
 
 void 
@@ -361,33 +686,29 @@ gtk_packer_add (GtkPacker       *packer,
   
   gtk_widget_set_parent (child, GTK_WIDGET (packer));
   
-  if (GTK_WIDGET_VISIBLE (GTK_WIDGET (packer))) 
+  if (GTK_WIDGET_REALIZED (child->parent))
+    gtk_widget_realize (child);
+
+  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
     {
-      if (GTK_WIDGET_REALIZED (GTK_WIDGET (packer)) &&
-          !GTK_WIDGET_REALIZED (child)) 
-        gtk_widget_realize (child);
-      
-      if (GTK_WIDGET_MAPPED (GTK_WIDGET (packer)) &&
-          !GTK_WIDGET_MAPPED (child)) 
-        gtk_widget_map (child);
+      if (GTK_WIDGET_MAPPED (child->parent))
+       gtk_widget_map (child);
+
+      gtk_widget_queue_resize (child);
     }
-  
-  if (GTK_WIDGET_VISIBLE (child) && GTK_WIDGET_VISIBLE (packer))
-    gtk_widget_queue_resize (child);
-  
 }
 
 void
-gtk_packer_configure (GtkPacker       *packer,
-                      GtkWidget       *child,
-                      GtkSideType      side,
-                      GtkAnchorType    anchor,
-                      GtkPackerOptions options,
-                      guint            border_width,
-                      guint            pad_x,
-                      guint            pad_y,
-                      guint            i_pad_x,
-                      guint            i_pad_y)
+gtk_packer_set_child_packing (GtkPacker       *packer,
+                             GtkWidget       *child,
+                             GtkSideType      side,
+                             GtkAnchorType    anchor,
+                             GtkPackerOptions options,
+                             guint            border_width,
+                             guint            pad_x,
+                             guint            pad_y,
+                             guint            i_pad_x,
+                             guint            i_pad_y)
 {
   GList *list;
   GtkPackerChild *pchild;
@@ -421,12 +742,75 @@ gtk_packer_configure (GtkPacker       *packer,
       list = g_list_next(list);
     }
 
-  g_warning ("gtk_packer_configure(): couldn't find child `%s' amongst the packer's children", gtk_type_name (GTK_OBJECT_TYPE (child)));
+  g_warning ("couldn't find child `%s' amongst the packer's children", gtk_type_name (GTK_OBJECT_TYPE (child)));
+}
+
+void
+gtk_packer_reorder_child (GtkPacker *packer,
+                         GtkWidget *child,
+                         gint       position)
+{
+  GList *list;
+
+  g_return_if_fail (packer != NULL);
+  g_return_if_fail (GTK_IS_PACKER (packer));
+  g_return_if_fail (child != NULL);
+
+  list = packer->children;
+  while (list)
+    {
+      GtkPackerChild *child_info;
+
+      child_info = list->data;
+      if (child_info->widget == child)
+       break;
+
+      list = list->next;
+    }
+
+  if (list && packer->children->next)
+    {
+      GList *tmp_list;
+
+      if (list->next)
+       list->next->prev = list->prev;
+      if (list->prev)
+       list->prev->next = list->next;
+      else
+       packer->children = list->next;
+
+      tmp_list = packer->children;
+      while (position && tmp_list->next)
+       {
+         position--;
+         tmp_list = tmp_list->next;
+       }
+
+      if (position)
+       {
+         tmp_list->next = list;
+         list->prev = tmp_list;
+         list->next = NULL;
+       }
+      else
+       {
+         if (tmp_list->prev)
+           tmp_list->prev->next = list;
+         else
+           packer->children = list;
+         list->prev = tmp_list->prev;
+         tmp_list->prev = list;
+         list->next = tmp_list;
+       }
 
+      if (GTK_WIDGET_VISIBLE (child) && GTK_WIDGET_VISIBLE (packer))
+       gtk_widget_queue_resize (child);
+    }
 }
 
 static void 
-gtk_packer_remove (GtkContainer *container, GtkWidget *widget) 
+gtk_packer_remove (GtkContainer *container,
+                  GtkWidget    *widget) 
 {
   GtkPacker *packer;
   GtkPackerChild *child;
@@ -513,7 +897,8 @@ gtk_packer_unmap (GtkWidget *widget)
 }
 
 static void 
-gtk_packer_draw (GtkWidget *widget, GdkRectangle     *area)
+gtk_packer_draw (GtkWidget    *widget,
+                GdkRectangle *area)
 {
   GtkPacker *packer;
   GtkPackerChild *child;
@@ -541,7 +926,8 @@ gtk_packer_draw (GtkWidget *widget, GdkRectangle     *area)
 }
 
 static gint 
-gtk_packer_expose (GtkWidget *widget, GdkEventExpose *event)
+gtk_packer_expose (GtkWidget      *widget,
+                  GdkEventExpose *event)
 {
   GtkPacker *packer;
   GtkPackerChild *child;
@@ -574,9 +960,11 @@ gtk_packer_expose (GtkWidget *widget, GdkEventExpose *event)
 }
 
 static void 
-gtk_packer_size_request (GtkWidget *widget, GtkRequisition *requisition)
+gtk_packer_size_request (GtkWidget      *widget,
+                        GtkRequisition *requisition)
 {
   GtkPacker *packer;
+  GtkContainer *container;
   GtkPackerChild *child;
   GList *children;
   gint nvis_vert_children;
@@ -589,6 +977,8 @@ gtk_packer_size_request (GtkWidget *widget, GtkRequisition *requisition)
   g_return_if_fail (requisition != NULL);
   
   packer = GTK_PACKER (widget);
+  container = GTK_CONTAINER (widget);
+
   requisition->width = 0;
   requisition->height = 0;
   nvis_vert_children = 0;
@@ -603,27 +993,29 @@ gtk_packer_size_request (GtkWidget *widget, GtkRequisition *requisition)
       
       if (GTK_WIDGET_VISIBLE (child->widget)) 
        {
-         gtk_widget_size_request (child->widget, &child->widget->requisition);
+         GtkRequisition child_requisition;
+
+         gtk_widget_size_request (child->widget, &child_requisition);
          
-         if((child->side == GTK_SIDE_TOP) || (child->side == GTK_SIDE_BOTTOM))
+         if ((child->side == GTK_SIDE_TOP) || (child->side == GTK_SIDE_BOTTOM))
            {
              maxWidth = MAX (maxWidth,
-                             (child->widget->requisition.width +
+                             (child_requisition.width +
                               2 * child->border_width +
                               child->pad_x + child->i_pad_x +
                               width));
-             height += (child->widget->requisition.height +
+             height += (child_requisition.height +
                         2 * child->border_width +
                         child->pad_y + child->i_pad_y);
             } 
          else 
            {
              maxHeight = MAX (maxHeight,
-                              (child->widget->requisition.height +
+                              (child_requisition.height +
                                2 * child->border_width +
                                child->pad_y + child->i_pad_y +
                                height));
-             width += (child->widget->requisition.width +
+             width += (child_requisition.width +
                        2 * child->border_width +
                        child->pad_x + child->i_pad_x);
             }
@@ -631,12 +1023,14 @@ gtk_packer_size_request (GtkWidget *widget, GtkRequisition *requisition)
 
       children = g_list_next(children);
     }
-  requisition->width = MAX (maxWidth, width);
-  requisition->height = MAX (maxHeight, height);
+
+  requisition->width = MAX (maxWidth, width) + 2 * container->border_width;
+  requisition->height = MAX (maxHeight, height) + 2 * container->border_width;
 }
 
 static gint
-YExpansion (GList *children, gint cavityHeight)
+YExpansion (GList *children,
+           gint   cavityHeight)
 {
   GList *list;
   GtkPackerChild *child;
@@ -650,9 +1044,13 @@ YExpansion (GList *children, gint cavityHeight)
   list = children;
   while (list != NULL) 
     {
+      GtkRequisition child_requisition;
+
       child = list->data;
       widget = child->widget;
-      childHeight = (widget->requisition.height +
+      gtk_widget_get_child_requisition (widget, &child_requisition);
+
+      childHeight = (child_requisition.height +
                     2 * child->border_width +
                     child->i_pad_y +
                     child->pad_y);
@@ -676,7 +1074,8 @@ YExpansion (GList *children, gint cavityHeight)
 }
 
 static gint
-XExpansion (GList *children, gint cavityWidth)
+XExpansion (GList *children,
+           gint   cavityWidth)
 {
   GList *list;
   GtkPackerChild *child;
@@ -690,9 +1089,13 @@ XExpansion (GList *children, gint cavityWidth)
   list = children;
   while (list != NULL) 
     {
+      GtkRequisition child_requisition;
+
       child = list->data;
       widget = child->widget;
-      childWidth = (widget->requisition.width +
+      gtk_widget_get_child_requisition (widget, &child_requisition);
+
+      childWidth = (child_requisition.width +
                    2 * child->border_width +
                    child->i_pad_x +
                    child->pad_x);
@@ -714,12 +1117,14 @@ XExpansion (GList *children, gint cavityWidth)
   if (curExpand < minExpand)
     minExpand = curExpand;
   return (minExpand < 0) ? 0 : minExpand; 
-};
+}
 
 static void 
-gtk_packer_size_allocate (GtkWidget *widget, GtkAllocation  *allocation)
+gtk_packer_size_allocate (GtkWidget      *widget,
+                         GtkAllocation  *allocation)
 {
   GtkPacker *packer;
+  GtkContainer *container;
   GtkAllocation child_allocation;
   GList *list;
   GtkPackerChild *child;
@@ -733,24 +1138,30 @@ gtk_packer_size_allocate (GtkWidget *widget, GtkAllocation  *allocation)
   g_return_if_fail (GTK_IS_PACKER (widget));
   g_return_if_fail (allocation != NULL);
 
+  packer = GTK_PACKER (widget);
+  container = GTK_CONTAINER (widget);
+
   x = y = 0;
 
   widget->allocation = *allocation;
-  packer = GTK_PACKER(widget);
   
-  cavityX = widget->allocation.x;
-  cavityY = widget->allocation.y;
-  cavityWidth = widget->allocation.width;
-  cavityHeight = widget->allocation.height;
-  list = g_list_first(packer->children);
+  cavityX = widget->allocation.x + container->border_width;
+  cavityY = widget->allocation.y + container->border_width;
+  cavityWidth = widget->allocation.width - 2 * container->border_width;
+  cavityHeight = widget->allocation.height - 2 * container->border_width;
+
+  list = g_list_first (packer->children);
   while (list != NULL)
     {
+      GtkRequisition child_requisition;
+
       child = list->data;
+      gtk_widget_get_child_requisition (child->widget, &child_requisition);
       
       if ((child->side == GTK_SIDE_TOP) || (child->side == GTK_SIDE_BOTTOM)) 
        {
          frameWidth = cavityWidth;
-         frameHeight = (child->widget->requisition.height +
+         frameHeight = (child_requisition.height +
                         2 * child->border_width +
                         child->pad_y +
                         child->i_pad_y);
@@ -776,7 +1187,7 @@ gtk_packer_size_allocate (GtkWidget *widget, GtkAllocation  *allocation)
       else 
        {
          frameHeight = cavityHeight;
-         frameWidth = (child->widget->requisition.width +
+         frameWidth = (child_requisition.width +
                        2 * child->border_width +
                        child->pad_x +
                        child->i_pad_x);
@@ -802,13 +1213,13 @@ gtk_packer_size_allocate (GtkWidget *widget, GtkAllocation  *allocation)
       borderX = child->pad_x + 2 * child->border_width;
       borderY = child->pad_y + 2 * child->border_width;
       
-      width = (child->widget->requisition.width +
+      width = (child_requisition.width +
               2 * child->border_width +
               child->i_pad_x);
       if ((child->options & GTK_FILL_X) || (width > (frameWidth - borderX)))
        width = frameWidth - borderX;
 
-      height = (child->widget->requisition.height +
+      height = (child_requisition.height +
                2 * child->border_width +
                child->i_pad_y);
       if ((child->options & GTK_FILL_Y) || (height > (frameHeight - borderY)))
@@ -880,9 +1291,10 @@ gtk_packer_size_allocate (GtkWidget *widget, GtkAllocation  *allocation)
 }
 
 static void
-gtk_packer_foreach (GtkContainer *container,
-                    GtkCallback   callback,
-                    gpointer      callback_data)
+gtk_packer_forall (GtkContainer *container,
+                  gboolean      include_internals,
+                  GtkCallback   callback,
+                  gpointer      callback_data)
 {
   GtkPacker *packer;
   GtkPackerChild *child;
@@ -894,7 +1306,7 @@ gtk_packer_foreach (GtkContainer *container,
   
   packer = GTK_PACKER (container);
   
-  children = g_list_first(packer->children);
+  children = g_list_first (packer->children);
   while (children != NULL) 
     {
       child = children->data;