]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktoolbar.c
gdk/gdk.c gdk/gdkinternals.h gdk/win32/gdkmain-win32.c pass argc and argv
[~andy/gtk] / gtk / gtktoolbar.c
index a04aee87dfdf58ee789117ccfb37e90c899a24db..3366841b5b78ab971b8ab2c0124f55052d5ea93a 100644 (file)
@@ -37,6 +37,7 @@
 #include "gtkimage.h"
 #include "gtksettings.h"
 #include "gtkintl.h"
+#include "gtkmarshalers.h"
 
 
 #define DEFAULT_IPADDING 0
@@ -52,7 +53,7 @@
 enum {
   PROP_0,
   PROP_ORIENTATION,
-  PROP_TOOLBAR_STYLE,
+  PROP_TOOLBAR_STYLE
 };
 
 enum {
@@ -71,7 +72,6 @@ struct _GtkToolbarChildSpace
 
 static void gtk_toolbar_class_init               (GtkToolbarClass *class);
 static void gtk_toolbar_init                     (GtkToolbar      *toolbar);
-static void gtk_toolbar_finalize                 (GObject         *object);
 static void gtk_toolbar_set_property             (GObject         *object,
                                                  guint            prop_id,
                                                  const GValue    *value,
@@ -81,8 +81,6 @@ static void gtk_toolbar_get_property             (GObject         *object,
                                                  GValue          *value,
                                                  GParamSpec      *pspec);
 static void gtk_toolbar_destroy                  (GtkObject       *object);
-static void gtk_toolbar_map                      (GtkWidget       *widget);
-static void gtk_toolbar_unmap                    (GtkWidget       *widget);
 static gint gtk_toolbar_expose                   (GtkWidget       *widget,
                                                  GdkEventExpose  *event);
 static void gtk_toolbar_size_request             (GtkWidget       *widget,
@@ -93,6 +91,8 @@ static void gtk_toolbar_style_set                (GtkWidget       *widget,
                                                   GtkStyle        *prev_style);
 static gboolean gtk_toolbar_focus                (GtkWidget       *widget,
                                                   GtkDirectionType dir);
+static void gtk_toolbar_hierarchy_changed        (GtkWidget       *widget,
+                                                 GtkWidget       *previous_toplevel);
 static void gtk_toolbar_show_all                 (GtkWidget       *widget);
 static void gtk_toolbar_add                      (GtkContainer    *container,
                                                  GtkWidget       *widget);
@@ -182,20 +182,17 @@ gtk_toolbar_class_init (GtkToolbarClass *class)
 
   parent_class = gtk_type_class (gtk_container_get_type ());
 
-  gobject_class->finalize = gtk_toolbar_finalize;
-  
   object_class->destroy = gtk_toolbar_destroy;
   gobject_class->set_property = gtk_toolbar_set_property;
   gobject_class->get_property = gtk_toolbar_get_property;
 
-  widget_class->map = gtk_toolbar_map;
-  widget_class->unmap = gtk_toolbar_unmap;
   widget_class->expose_event = gtk_toolbar_expose;
   widget_class->size_request = gtk_toolbar_size_request;
   widget_class->size_allocate = gtk_toolbar_size_allocate;
   widget_class->style_set = gtk_toolbar_style_set;
   widget_class->show_all = gtk_toolbar_show_all;
   widget_class->focus = gtk_toolbar_focus;
+  widget_class->hierarchy_changed = gtk_toolbar_hierarchy_changed;
   
   container_class->add = gtk_toolbar_add;
   container_class->remove = gtk_toolbar_remove;
@@ -209,17 +206,17 @@ gtk_toolbar_class_init (GtkToolbarClass *class)
                    GTK_RUN_FIRST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkToolbarClass, orientation_changed),
-                   gtk_marshal_VOID__INT,
+                   _gtk_marshal_VOID__ENUM,
                    GTK_TYPE_NONE, 1,
-                   GTK_TYPE_INT);
+                   GTK_TYPE_ORIENTATION);
   toolbar_signals[STYLE_CHANGED] =
     gtk_signal_new ("style_changed",
                    GTK_RUN_FIRST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkToolbarClass, style_changed),
-                   gtk_marshal_VOID__INT,
+                   _gtk_marshal_VOID__ENUM,
                    GTK_TYPE_NONE, 1,
-                   GTK_TYPE_INT);
+                   GTK_TYPE_TOOLBAR_STYLE);
   
   g_object_class_install_property (gobject_class,
                                   PROP_ORIENTATION,
@@ -283,16 +280,14 @@ gtk_toolbar_class_init (GtkToolbarClass *class)
                                                               GTK_SHADOW_OUT,
                                                               G_PARAM_READABLE));
 
-  gtk_settings_install_property (gtk_settings_get_global (),
-                                 g_param_spec_enum ("gtk-toolbar-style",
+  gtk_settings_install_property (g_param_spec_enum ("gtk-toolbar-style",
                                                     _("Toolbar style"),
                                                     _("Whether default toolbars have text only, text and icons, icons only, etc."),
                                                     GTK_TYPE_TOOLBAR_STYLE,
                                                     GTK_TOOLBAR_BOTH,
                                                     G_PARAM_READWRITE));
 
-  gtk_settings_install_property (gtk_settings_get_global (),
-                                 g_param_spec_enum ("gtk-toolbar-icon-size",
+  gtk_settings_install_property (g_param_spec_enum ("gtk-toolbar-icon-size",
                                                     _("Toolbar icon size"),
                                                     _("Size of icons in default toolbars"),
                                                     GTK_TYPE_ICON_SIZE,
@@ -301,14 +296,8 @@ gtk_toolbar_class_init (GtkToolbarClass *class)
 }
 
 static void
-style_change_notify (GObject    *object,
-                     GParamSpec *pspec,
-                     gpointer    data)
+style_change_notify (GtkToolbar *toolbar)
 {
-  GtkToolbar *toolbar;
-
-  toolbar = GTK_TOOLBAR (data);
-
   if (!toolbar->style_set)
     {
       /* pretend it was set, then unset, thus reverting to new default */
@@ -318,14 +307,8 @@ style_change_notify (GObject    *object,
 }
 
 static void
-icon_size_change_notify (GObject    *object,
-                         GParamSpec *pspec,
-                         gpointer    data)
+icon_size_change_notify (GtkToolbar *toolbar)
 {
-  GtkToolbar *toolbar;
-
-  toolbar = GTK_TOOLBAR (data);
-
   if (!toolbar->icon_size_set)
     {
       /* pretend it was set, then unset, thus reverting to new default */
@@ -334,6 +317,72 @@ icon_size_change_notify (GObject    *object,
     }
 }
 
+static void
+toolbar_screen_changed (GtkToolbar *toolbar)
+{
+  GtkSettings *old_settings = g_object_get_data (G_OBJECT (toolbar), "gtk-toolbar-settings");
+  GtkSettings *settings;
+
+  if (gtk_widget_has_screen (GTK_WIDGET (toolbar)))
+    settings = gtk_widget_get_settings (GTK_WIDGET (toolbar));
+  else
+    settings = NULL;
+
+  if (settings == old_settings)
+    return;
+
+  if (old_settings)
+    {
+      g_signal_handler_disconnect (old_settings, toolbar->style_set_connection);
+      g_signal_handler_disconnect (old_settings, toolbar->icon_size_connection);
+
+      g_object_unref (old_settings);
+    }
+  
+  if (settings)
+    {
+      toolbar->style_set_connection = g_signal_connect_swapped (settings,
+                                                               "notify::gtk-toolbar-style",
+                                                               G_CALLBACK (style_change_notify),
+                                                               toolbar);
+      
+      toolbar->icon_size_connection = g_signal_connect_swapped (settings,
+                                                               "notify::gtk-toolbar-icon-size",
+                                                               G_CALLBACK (icon_size_change_notify),
+                                                               toolbar);
+
+
+      g_object_ref (settings);
+      g_object_set_data (G_OBJECT (toolbar), "gtk-toolbar-settings", settings);
+
+      style_change_notify (toolbar);
+      icon_size_change_notify (toolbar);
+    }
+  else
+    g_object_set_data (G_OBJECT (toolbar), "gtk-toolbar-settings", NULL);
+}
+
+static void
+gtk_toolbar_hierarchy_changed (GtkWidget *widget,
+                              GtkWidget *previous_toplevel)
+{
+  GtkWidget *toplevel;
+  
+  if (previous_toplevel)
+    g_signal_handlers_disconnect_by_func (previous_toplevel,
+                                         (gpointer) toolbar_screen_changed,
+                                         widget);
+
+  toplevel = gtk_widget_get_toplevel (widget);
+  if (GTK_WIDGET_TOPLEVEL (toplevel))
+    g_signal_connect_swapped (toplevel,
+                             "notify::screen",
+                             G_CALLBACK (toolbar_screen_changed),
+                             widget);
+  
+  toolbar_screen_changed (GTK_TOOLBAR (widget));
+}
+
 static void
 gtk_toolbar_init (GtkToolbar *toolbar)
 {
@@ -345,44 +394,14 @@ gtk_toolbar_init (GtkToolbar *toolbar)
   toolbar->orientation  = GTK_ORIENTATION_HORIZONTAL;
   toolbar->icon_size    = DEFAULT_ICON_SIZE;
   toolbar->tooltips     = gtk_tooltips_new ();
+  g_object_ref (toolbar->tooltips);
+  gtk_object_sink (GTK_OBJECT (toolbar->tooltips));
+  
   toolbar->button_maxw  = 0;
   toolbar->button_maxh  = 0;
 
   toolbar->style_set = FALSE;
   toolbar->icon_size_set = FALSE;
-  g_object_get (gtk_settings_get_global (),
-                "gtk-toolbar-icon-size",
-                &toolbar->icon_size,
-                "gtk-toolbar-style",
-                &toolbar->style,
-                NULL);
-  
-  toolbar->style_set_connection =
-    g_signal_connect_data (G_OBJECT (gtk_settings_get_global ()),
-                           "notify::gtk-toolbar-style",
-                           G_CALLBACK (style_change_notify),
-                           toolbar, NULL, FALSE, FALSE);
-
-  toolbar->icon_size_connection =
-    g_signal_connect_data (G_OBJECT (gtk_settings_get_global ()),
-                           "notify::gtk-toolbar-icon-size",
-                           G_CALLBACK (icon_size_change_notify),
-                           toolbar, NULL, FALSE, FALSE);  
-}
-
-static void
-gtk_toolbar_finalize (GObject *object)
-{
-  GtkToolbar *toolbar;
-
-  toolbar = GTK_TOOLBAR (object);
-
-  g_signal_handler_disconnect (G_OBJECT (gtk_settings_get_global ()),
-                               toolbar->style_set_connection);
-  g_signal_handler_disconnect (G_OBJECT (gtk_settings_get_global ()),
-                               toolbar->icon_size_connection);
-  
-  G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
 static void
@@ -442,7 +461,6 @@ gtk_toolbar_destroy (GtkObject *object)
   GtkToolbar *toolbar;
   GList *children;
 
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (object));
 
   toolbar = GTK_TOOLBAR (object);
@@ -475,52 +493,6 @@ gtk_toolbar_destroy (GtkObject *object)
   GTK_OBJECT_CLASS (parent_class)->destroy (object);
 }
 
-static void
-gtk_toolbar_map (GtkWidget *widget)
-{
-  GtkToolbar *toolbar;
-  GList *children;
-  GtkToolbarChild *child;
-
-  g_return_if_fail (widget != NULL);
-  g_return_if_fail (GTK_IS_TOOLBAR (widget));
-
-  toolbar = GTK_TOOLBAR (widget);
-  GTK_WIDGET_SET_FLAGS (toolbar, GTK_MAPPED);
-
-  for (children = toolbar->children; children; children = children->next)
-    {
-      child = children->data;
-
-      if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
-         && GTK_WIDGET_VISIBLE (child->widget) && !GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_map (child->widget);
-    }
-}
-
-static void
-gtk_toolbar_unmap (GtkWidget *widget)
-{
-  GtkToolbar *toolbar;
-  GList *children;
-  GtkToolbarChild *child;
-
-  g_return_if_fail (widget != NULL);
-  g_return_if_fail (GTK_IS_TOOLBAR (widget));
-
-  toolbar = GTK_TOOLBAR (widget);
-  GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_MAPPED);
-
-  for (children = toolbar->children; children; children = children->next)
-    {
-      child = children->data;
-
-      if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
-         && GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_unmap (child->widget);
-    }
-}
-
 static void
 gtk_toolbar_paint_space_line (GtkWidget       *widget,
                              GdkRectangle    *area,
@@ -530,7 +502,6 @@ gtk_toolbar_paint_space_line (GtkWidget       *widget,
   GtkToolbarChildSpace *child_space;
   gint space_size;
   
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (widget));
   g_return_if_fail (child != NULL);
   g_return_if_fail (child->type == GTK_TOOLBAR_CHILD_SPACE);
@@ -573,7 +544,6 @@ gtk_toolbar_expose (GtkWidget      *widget,
   GtkToolbarChild *child;
   gint border_width;
   
-  g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_TOOLBAR (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
@@ -630,7 +600,6 @@ gtk_toolbar_size_request (GtkWidget      *widget,
   gint space_size;
   gint ipadding;
   
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (widget));
   g_return_if_fail (requisition != NULL);
 
@@ -709,8 +678,8 @@ gtk_toolbar_size_request (GtkWidget      *widget,
   /* Extra spacing */
   gtk_widget_style_get (widget, "internal_padding", &ipadding, NULL);
   
-  requisition->width += 2 * (widget->style->xthickness + ipadding);
-  requisition->height += 2 * (widget->style->ythickness + ipadding);
+  requisition->width += 2 * ipadding;
+  requisition->height += 2 * ipadding;
   
   toolbar->button_maxw = button_maxw;
   toolbar->button_maxh = button_maxh;
@@ -730,7 +699,6 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
   gint space_size;
   gint ipadding;
   
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (widget));
   g_return_if_fail (allocation != NULL);
 
@@ -742,8 +710,8 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
 
   gtk_widget_style_get (widget, "internal_padding", &ipadding, NULL);
   
-  x_border_width += 2 * (widget->style->xthickness + ipadding);
-  y_border_width += 2 * (widget->style->ythickness + ipadding);
+  x_border_width += ipadding;
+  y_border_width += ipadding;
   
   if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
     alloc.x = allocation->x + x_border_width;
@@ -870,7 +838,6 @@ static void
 gtk_toolbar_add (GtkContainer *container,
                 GtkWidget    *widget)
 {
-  g_return_if_fail (container != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (container));
   g_return_if_fail (widget != NULL);
 
@@ -885,7 +852,6 @@ gtk_toolbar_remove (GtkContainer *container,
   GList *children;
   GtkToolbarChild *child;
 
-  g_return_if_fail (container != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (container));
   g_return_if_fail (widget != NULL);
 
@@ -925,7 +891,6 @@ gtk_toolbar_forall (GtkContainer *container,
   GList *children;
   GtkToolbarChild *child;
 
-  g_return_if_fail (container != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (container));
   g_return_if_fail (callback != NULL);
 
@@ -1025,7 +990,6 @@ gtk_toolbar_set_icon_size (GtkToolbar  *toolbar,
   GtkImage *image;
   gchar *stock_id;
 
-  g_return_if_fail (toolbar != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
 
   toolbar->icon_size_set = TRUE;
@@ -1038,7 +1002,9 @@ gtk_toolbar_set_icon_size (GtkToolbar  *toolbar,
   for (children = toolbar->children; children; children = children->next)
     {
       child = children->data;
-      if (child->type == GTK_TOOLBAR_CHILD_BUTTON &&
+      if ((child->type == GTK_TOOLBAR_CHILD_BUTTON ||
+          child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON ||
+          child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON) &&
          GTK_IS_IMAGE (child->icon))
        {
          image = GTK_IMAGE (child->icon);
@@ -1087,9 +1053,9 @@ gtk_toolbar_unset_icon_size (GtkToolbar  *toolbar)
 
   if (toolbar->icon_size_set)
     {
-      g_object_get (gtk_settings_get_global (),
-                    "gtk-toolbar-icon-size",
-                    &size, NULL);
+      g_object_get (gtk_widget_get_settings (GTK_WIDGET (toolbar)),
+                    "gtk-toolbar-icon-size", &size,
+                   NULL);
 
       if (size != toolbar->icon_size)
         gtk_toolbar_set_icon_size (toolbar, size);
@@ -1187,6 +1153,13 @@ gtk_toolbar_insert_space (GtkToolbar *toolbar,
                              position);
 }
 
+/**
+ * gtk_toolbar_remove_space:
+ * @toolbar: a #GtkToolbar.
+ * @position: the index of the space to remove.
+ * 
+ * Removes a space from the specified position.
+ **/
 void
 gtk_toolbar_remove_space (GtkToolbar *toolbar,
                           gint        position)
@@ -1227,6 +1200,15 @@ gtk_toolbar_remove_space (GtkToolbar *toolbar,
   g_warning ("Toolbar position %d doesn't exist", position);
 }
 
+/**
+ * gtk_toolbar_append_widget:
+ * @toolbar: a #GtkToolbar.
+ * @widget: a #GtkWidget to add to the toolbar. 
+ * @tooltip_text: the element's tooltip.
+ * @tooltip_private_text: used for context-sensitive help about this toolbar element.
+ * 
+ * Adds a widget to the end of the given toolbar.
+ **/ 
 void
 gtk_toolbar_append_widget (GtkToolbar  *toolbar,
                           GtkWidget   *widget,
@@ -1240,6 +1222,15 @@ gtk_toolbar_append_widget (GtkToolbar  *toolbar,
                              toolbar->num_children);
 }
 
+/**
+ * gtk_toolbar_prepend_widget:
+ * @toolbar: a #GtkToolbar.
+ * @widget: a #GtkWidget to add to the toolbar. 
+ * @tooltip_text: the element's tooltip.
+ * @tooltip_private_text: used for context-sensitive help about this toolbar element.
+ * 
+ * Adds a widget to the beginning of the given toolbar.
+ **/ 
 void
 gtk_toolbar_prepend_widget (GtkToolbar  *toolbar,
                            GtkWidget   *widget,
@@ -1253,6 +1244,16 @@ gtk_toolbar_prepend_widget (GtkToolbar  *toolbar,
                              0);
 }
 
+/**
+ * gtk_toolbar_insert_widget:
+ * @toolbar: a #GtkToolbar.
+ * @widget: a #GtkWidget to add to the toolbar. 
+ * @tooltip_text: the element's tooltip.
+ * @tooltip_private_text: used for context-sensitive help about this toolbar element.
+ * @position: the number of widgets to insert this widget after.
+ * 
+ * Inserts a widget in the toolbar at the given position.
+ **/ 
 void
 gtk_toolbar_insert_widget (GtkToolbar *toolbar,
                           GtkWidget  *widget,
@@ -1300,6 +1301,29 @@ gtk_toolbar_prepend_element (GtkToolbar          *toolbar,
                                     icon, callback, user_data, 0);
 }
 
+/**
+ * gtk_toolbar_insert_element:
+ * @toolbar: a #GtkToolbar.
+ * @type: a value of type #GtkToolbarChildType that determines what @widget
+ *   will be.
+ * @widget: a #GtkWidget, or %NULL. 
+ * @text: the element's label.
+ * @tooltip_text: the element's tooltip.
+ * @tooltip_private_text: used for context-sensitive help about this toolbar element.
+ * @icon: a #GtkWidget that provides pictorial representation of the element's function.
+ * @callback: the function to be executed when the button is pressed.
+ * @user_data: any data you wish to pass to the callback.
+ * @position: the number of widgets to insert this element after.
+ *
+ * Inserts a new element in the toolbar at the given position. 
+ *
+ * If @type == %GTK_TOOLBAR_CHILD_WIDGET, @widget is used as the new element.
+ * If @type == %GTK_TOOLBAR_CHILD_RADIOBUTTON, @widget is used to determine
+ * the radio group for the new element. In all other cases, @widget must
+ * be %NULL.
+ *
+ * Return value: the new toolbar element as a #GtkWidget.
+ **/
 GtkWidget *
 gtk_toolbar_insert_element (GtkToolbar          *toolbar,
                            GtkToolbarChildType  type,
@@ -1312,11 +1336,9 @@ gtk_toolbar_insert_element (GtkToolbar          *toolbar,
                            gpointer             user_data,
                            gint                 position)
 {
-  g_return_val_if_fail (toolbar != NULL, NULL);
   g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
   if (type == GTK_TOOLBAR_CHILD_WIDGET)
     {
-      g_return_val_if_fail (widget != NULL, NULL);
       g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
     }
   else if (type != GTK_TOOLBAR_CHILD_RADIOBUTTON)
@@ -1344,11 +1366,9 @@ gtk_toolbar_internal_insert_element (GtkToolbar          *toolbar,
   GtkToolbarChild *child;
   GtkWidget *box;
 
-  g_return_val_if_fail (toolbar != NULL, NULL);
   g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
   if (type == GTK_TOOLBAR_CHILD_WIDGET)
     {
-      g_return_val_if_fail (widget != NULL, NULL);
       g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
     }
   else if (type != GTK_TOOLBAR_CHILD_RADIOBUTTON)
@@ -1453,20 +1473,7 @@ gtk_toolbar_internal_insert_element (GtkToolbar          *toolbar,
   toolbar->num_children++;
 
   if (type != GTK_TOOLBAR_CHILD_SPACE)
-    {
-      gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
-
-      if (GTK_WIDGET_REALIZED (child->widget->parent))
-       gtk_widget_realize (child->widget);
-
-      if (GTK_WIDGET_VISIBLE (child->widget->parent) && GTK_WIDGET_VISIBLE (child->widget))
-       {
-         if (GTK_WIDGET_MAPPED (child->widget->parent))
-           gtk_widget_map (child->widget);
-
-         gtk_widget_queue_resize (child->widget);
-       }
-    }
+    gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
   else
     gtk_widget_queue_resize (GTK_WIDGET (toolbar));
 
@@ -1542,9 +1549,8 @@ gtk_toolbar_unset_style (GtkToolbar *toolbar)
 
   if (toolbar->style_set)
     {
-      g_object_get (gtk_settings_get_global (),
-                    "gtk-toolbar-style",
-                    &style,
+      g_object_get (gtk_widget_get_settings (GTK_WIDGET (toolbar)),
+                    "gtk-toolbar-style", &style,
                     NULL);
 
       if (style != toolbar->style)
@@ -1558,7 +1564,6 @@ void
 gtk_toolbar_set_tooltips (GtkToolbar *toolbar,
                          gboolean    enable)
 {
-  g_return_if_fail (toolbar != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
 
   if (enable)
@@ -1591,7 +1596,6 @@ gtk_toolbar_update_button_relief (GtkToolbar *toolbar)
   GtkToolbarChild *child;
   GtkReliefStyle relief;
   
-  g_return_if_fail (toolbar != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
 
   relief = get_button_relief (toolbar);
@@ -1610,7 +1614,6 @@ static void
 gtk_real_toolbar_orientation_changed (GtkToolbar     *toolbar,
                                      GtkOrientation  orientation)
 {
-  g_return_if_fail (toolbar != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
 
   if (toolbar->orientation != orientation)
@@ -1621,6 +1624,16 @@ gtk_real_toolbar_orientation_changed (GtkToolbar     *toolbar,
     }
 }
 
+static GtkWidget *
+get_first_child (GtkContainer *container)
+{
+  GList *children = gtk_container_get_children (container);
+  GtkWidget *result = children ? children->data : NULL;
+  g_list_free (children);
+  
+  return result;
+}
+
 static void
 gtk_real_toolbar_style_changed (GtkToolbar      *toolbar,
                                GtkToolbarStyle  style)
@@ -1629,7 +1642,6 @@ gtk_real_toolbar_style_changed (GtkToolbar      *toolbar,
   GtkToolbarChild *child;
   GtkWidget* box = NULL;
   
-  g_return_if_fail (toolbar != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
 
   if (toolbar->style != style)
@@ -1670,7 +1682,7 @@ gtk_real_toolbar_style_changed (GtkToolbar      *toolbar,
                if (child->label && !GTK_WIDGET_VISIBLE (child->label))
                  gtk_widget_show (child->label);
 
-               box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
+               box = get_first_child (GTK_CONTAINER (child->widget));
 
                if (GTK_IS_HBOX (box))
                {
@@ -1714,7 +1726,7 @@ gtk_real_toolbar_style_changed (GtkToolbar      *toolbar,
                if (child->label && !GTK_WIDGET_VISIBLE (child->label))
                  gtk_widget_show (child->label);
 
-               box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
+               box = get_first_child (GTK_CONTAINER (child->widget));
                
                if (GTK_IS_VBOX (box))
                {