X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktoolbar.c;h=f66f18163155502e536bb3d5409eb0e05815198d;hb=10ba4fd066042b4335ae45e7560565872f71ba9b;hp=ad19b4b2093775edd3b5c52bb278e4c315a16d3c;hpb=c9e78a10947a24226f12e74e0985e485f51a664c;p=~andy%2Fgtk diff --git a/gtk/gtktoolbar.c b/gtk/gtktoolbar.c index ad19b4b20..f66f18163 100644 --- a/gtk/gtktoolbar.c +++ b/gtk/gtktoolbar.c @@ -18,16 +18,37 @@ * Boston, MA 02111-1307, USA. */ +/* + * 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 "gtkbutton.h" #include "gtktogglebutton.h" #include "gtkradiobutton.h" #include "gtklabel.h" #include "gtkvbox.h" +#include "gtkhbox.h" #include "gtktoolbar.h" -#define DEFAULT_SPACE_SIZE 5 +#define DEFAULT_SPACE_SIZE 5 +#define DEFAULT_SPACE_STYLE GTK_TOOLBAR_SPACE_EMPTY +#define SPACE_LINE_DIVISION 10 +#define SPACE_LINE_START 3 +#define SPACE_LINE_END 7 + +enum { + ARG_0, + ARG_ORIENTATION, + ARG_TOOLBAR_STYLE, + ARG_SPACE_SIZE, + ARG_SPACE_STYLE, + ARG_RELIEF +}; enum { ORIENTATION_CHANGED, @@ -35,18 +56,22 @@ enum { LAST_SIGNAL }; -typedef void (*GtkToolbarSignal1) (GtkObject *object, - gint arg1, - gpointer data); - -static void gtk_toolbar_marshal_signal_1 (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); +typedef struct _GtkToolbarChildSpace GtkToolbarChildSpace; +struct _GtkToolbarChildSpace +{ + GtkToolbarChild child; + gint alloc_x, alloc_y; +}; static void gtk_toolbar_class_init (GtkToolbarClass *class); static void gtk_toolbar_init (GtkToolbar *toolbar); +static void gtk_toolbar_set_arg (GtkObject *object, + GtkArg *arg, + guint arg_id); +static void gtk_toolbar_get_arg (GtkObject *object, + GtkArg *arg, + guint arg_id); static void gtk_toolbar_destroy (GtkObject *object); static void gtk_toolbar_map (GtkWidget *widget); static void gtk_toolbar_unmap (GtkWidget *widget); @@ -62,7 +87,8 @@ static void gtk_toolbar_add (GtkContainer *container, GtkWidget *widget); static void gtk_toolbar_remove (GtkContainer *container, GtkWidget *widget); -static void gtk_toolbar_foreach (GtkContainer *container, +static void gtk_toolbar_forall (GtkContainer *container, + gboolean include_internals, GtkCallback callback, gpointer callback_data); static void gtk_real_toolbar_orientation_changed (GtkToolbar *toolbar, @@ -76,22 +102,23 @@ static GtkContainerClass *parent_class; static guint toolbar_signals[LAST_SIGNAL] = { 0 }; -guint +GtkType gtk_toolbar_get_type (void) { - static guint toolbar_type = 0; + static GtkType toolbar_type = 0; if (!toolbar_type) { - GtkTypeInfo toolbar_info = + static const GtkTypeInfo toolbar_info = { "GtkToolbar", sizeof (GtkToolbar), sizeof (GtkToolbarClass), (GtkClassInitFunc) gtk_toolbar_class_init, (GtkObjectInitFunc) gtk_toolbar_init, - (GtkArgSetFunc) NULL, - (GtkArgGetFunc) NULL, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, }; toolbar_type = gtk_type_unique (gtk_container_get_type (), &toolbar_info); @@ -112,13 +139,13 @@ gtk_toolbar_class_init (GtkToolbarClass *class) container_class = (GtkContainerClass *) class; parent_class = gtk_type_class (gtk_container_get_type ()); - + toolbar_signals[ORIENTATION_CHANGED] = gtk_signal_new ("orientation_changed", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (GtkToolbarClass, orientation_changed), - gtk_toolbar_marshal_signal_1, + gtk_marshal_NONE__INT, GTK_TYPE_NONE, 1, GTK_TYPE_INT); toolbar_signals[STYLE_CHANGED] = @@ -126,13 +153,15 @@ gtk_toolbar_class_init (GtkToolbarClass *class) GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (GtkToolbarClass, style_changed), - gtk_toolbar_marshal_signal_1, + gtk_marshal_NONE__INT, GTK_TYPE_NONE, 1, GTK_TYPE_INT); gtk_object_class_add_signals (object_class, toolbar_signals, LAST_SIGNAL); object_class->destroy = gtk_toolbar_destroy; + object_class->set_arg = gtk_toolbar_set_arg; + object_class->get_arg = gtk_toolbar_get_arg; widget_class->map = gtk_toolbar_map; widget_class->unmap = gtk_toolbar_unmap; @@ -143,11 +172,22 @@ gtk_toolbar_class_init (GtkToolbarClass *class) container_class->add = gtk_toolbar_add; container_class->remove = gtk_toolbar_remove; - container_class->foreach = gtk_toolbar_foreach; + container_class->forall = gtk_toolbar_forall; container_class->focus = NULL; - + class->orientation_changed = gtk_real_toolbar_orientation_changed; class->style_changed = gtk_real_toolbar_style_changed; + + gtk_object_add_arg_type ("GtkToolbar::orientation", GTK_TYPE_ORIENTATION, + GTK_ARG_READWRITE, ARG_ORIENTATION); + gtk_object_add_arg_type ("GtkToolbar::toolbar_style", GTK_TYPE_TOOLBAR_STYLE, + GTK_ARG_READWRITE, ARG_TOOLBAR_STYLE); + gtk_object_add_arg_type ("GtkToolbar::space_size", GTK_TYPE_UINT, + GTK_ARG_READWRITE, ARG_SPACE_SIZE); + gtk_object_add_arg_type ("GtkToolbar::space_style", GTK_TYPE_TOOLBAR_SPACE_STYLE, + GTK_ARG_READWRITE, ARG_SPACE_STYLE); + gtk_object_add_arg_type ("GtkToolbar::relief", GTK_TYPE_RELIEF_STYLE, + GTK_ARG_READWRITE, ARG_RELIEF); } static void @@ -162,12 +202,70 @@ gtk_toolbar_init (GtkToolbar *toolbar) toolbar->style = GTK_TOOLBAR_ICONS; toolbar->relief = GTK_RELIEF_NORMAL; toolbar->space_size = DEFAULT_SPACE_SIZE; + toolbar->space_style = DEFAULT_SPACE_STYLE; toolbar->tooltips = gtk_tooltips_new (); toolbar->button_maxw = 0; toolbar->button_maxh = 0; } -GtkWidget * +static void +gtk_toolbar_set_arg (GtkObject *object, + GtkArg *arg, + guint arg_id) +{ + GtkToolbar *toolbar = GTK_TOOLBAR (object); + + switch (arg_id) + { + case ARG_ORIENTATION: + gtk_toolbar_set_orientation (toolbar, GTK_VALUE_ENUM (*arg)); + break; + case ARG_TOOLBAR_STYLE: + gtk_toolbar_set_style (toolbar, GTK_VALUE_ENUM (*arg)); + break; + case ARG_SPACE_SIZE: + gtk_toolbar_set_space_size (toolbar, GTK_VALUE_UINT (*arg)); + break; + case ARG_SPACE_STYLE: + gtk_toolbar_set_space_style (toolbar, GTK_VALUE_ENUM (*arg)); + break; + case ARG_RELIEF: + gtk_toolbar_set_button_relief (toolbar, GTK_VALUE_ENUM (*arg)); + break; + } +} + +static void +gtk_toolbar_get_arg (GtkObject *object, + GtkArg *arg, + guint arg_id) +{ + GtkToolbar *toolbar = GTK_TOOLBAR (object); + + switch (arg_id) + { + case ARG_ORIENTATION: + GTK_VALUE_ENUM (*arg) = toolbar->orientation; + break; + case ARG_TOOLBAR_STYLE: + GTK_VALUE_ENUM (*arg) = toolbar->style; + break; + case ARG_SPACE_SIZE: + GTK_VALUE_UINT (*arg) = toolbar->space_size; + break; + case ARG_SPACE_STYLE: + GTK_VALUE_ENUM (*arg) = toolbar->space_style; + break; + case ARG_RELIEF: + GTK_VALUE_ENUM (*arg) = toolbar->relief; + break; + default: + arg->type = GTK_TYPE_INVALID; + break; + } +} + +GtkWidget* gtk_toolbar_new (GtkOrientation orientation, GtkToolbarStyle style) { @@ -265,6 +363,47 @@ gtk_toolbar_unmap (GtkWidget *widget) } } +static void +gtk_toolbar_paint_space_line (GtkWidget *widget, + GdkRectangle *area, + GtkToolbarChild *child) +{ + GtkToolbar *toolbar; + GtkToolbarChildSpace *child_space; + + 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); + + toolbar = GTK_TOOLBAR (widget); + + child_space = (GtkToolbarChildSpace *) child; + + if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) + gtk_paint_vline (widget->style, widget->window, + GTK_WIDGET_STATE (widget), area, widget, + "toolbar", + child_space->alloc_y + toolbar->button_maxh * + SPACE_LINE_START / SPACE_LINE_DIVISION, + child_space->alloc_y + toolbar->button_maxh * + SPACE_LINE_END / SPACE_LINE_DIVISION, + child_space->alloc_x + + (toolbar->space_size - + widget->style->klass->xthickness) / 2); + else + gtk_paint_hline (widget->style, widget->window, + GTK_WIDGET_STATE (widget), area, widget, + "toolbar", + child_space->alloc_x + toolbar->button_maxw * + SPACE_LINE_START / SPACE_LINE_DIVISION, + child_space->alloc_x + toolbar->button_maxw * + SPACE_LINE_END / SPACE_LINE_DIVISION, + child_space->alloc_y + + (toolbar->space_size - + widget->style->klass->ythickness) / 2); +} + static void gtk_toolbar_draw (GtkWidget *widget, GdkRectangle *area) @@ -285,8 +424,12 @@ gtk_toolbar_draw (GtkWidget *widget, { child = children->data; - if ((child->type != GTK_TOOLBAR_CHILD_SPACE) - && gtk_widget_intersect (child->widget, area, &child_area)) + if (child->type == GTK_TOOLBAR_CHILD_SPACE) + { + if (toolbar->space_style == GTK_TOOLBAR_SPACE_LINE) + gtk_toolbar_paint_space_line (widget, area, child); + } + else if (gtk_widget_intersect (child->widget, area, &child_area)) gtk_widget_draw (child->widget, &child_area); } } @@ -315,9 +458,13 @@ gtk_toolbar_expose (GtkWidget *widget, { child = children->data; - if ((child->type != GTK_TOOLBAR_CHILD_SPACE) - && GTK_WIDGET_NO_WINDOW (child->widget) - && gtk_widget_intersect (child->widget, &event->area, &child_event.area)) + if (child->type == GTK_TOOLBAR_CHILD_SPACE) + { + if (toolbar->space_style == GTK_TOOLBAR_SPACE_LINE) + gtk_toolbar_paint_space_line (widget, &event->area, child); + } + else if (GTK_WIDGET_NO_WINDOW (child->widget) + && gtk_widget_intersect (child->widget, &event->area, &child_event.area)) gtk_widget_event (child->widget, (GdkEvent *) &child_event); } } @@ -335,6 +482,7 @@ gtk_toolbar_size_request (GtkWidget *widget, gint nbuttons; gint button_maxw, button_maxh; gint widget_maxw, widget_maxh; + GtkRequisition child_requisition; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TOOLBAR (widget)); @@ -369,11 +517,11 @@ gtk_toolbar_size_request (GtkWidget *widget, case GTK_TOOLBAR_CHILD_TOGGLEBUTTON: if (GTK_WIDGET_VISIBLE (child->widget)) { - gtk_widget_size_request (child->widget, &child->widget->requisition); + gtk_widget_size_request (child->widget, &child_requisition); nbuttons++; - button_maxw = MAX (button_maxw, child->widget->requisition.width); - button_maxh = MAX (button_maxh, child->widget->requisition.height); + button_maxw = MAX (button_maxw, child_requisition.width); + button_maxh = MAX (button_maxh, child_requisition.height); } break; @@ -381,15 +529,15 @@ gtk_toolbar_size_request (GtkWidget *widget, case GTK_TOOLBAR_CHILD_WIDGET: if (GTK_WIDGET_VISIBLE (child->widget)) { - gtk_widget_size_request (child->widget, &child->widget->requisition); + gtk_widget_size_request (child->widget, &child_requisition); - widget_maxw = MAX (widget_maxw, child->widget->requisition.width); - widget_maxh = MAX (widget_maxh, child->widget->requisition.height); + widget_maxw = MAX (widget_maxw, child_requisition.width); + widget_maxh = MAX (widget_maxh, child_requisition.height); if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) - requisition->width += child->widget->requisition.width; + requisition->width += child_requisition.width; else - requisition->height += child->widget->requisition.height; + requisition->height += child_requisition.height; } break; @@ -421,7 +569,9 @@ gtk_toolbar_size_allocate (GtkWidget *widget, GtkToolbar *toolbar; GList *children; GtkToolbarChild *child; + GtkToolbarChildSpace *child_space; GtkAllocation alloc; + GtkRequisition child_requisition; gint border_width; g_return_if_fail (widget != NULL); @@ -445,10 +595,21 @@ gtk_toolbar_size_allocate (GtkWidget *widget, switch (child->type) { case GTK_TOOLBAR_CHILD_SPACE: + + child_space = (GtkToolbarChildSpace *) child; + if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) - alloc.x += toolbar->space_size; + { + child_space->alloc_x = alloc.x; + child_space->alloc_y = allocation->y + (allocation->height - toolbar->button_maxh) / 2; + alloc.x += toolbar->space_size; + } else - alloc.y += toolbar->space_size; + { + child_space->alloc_x = allocation->x + (allocation->width - toolbar->button_maxw) / 2; + child_space->alloc_y = alloc.y; + alloc.y += toolbar->space_size; + } break; @@ -479,20 +640,22 @@ gtk_toolbar_size_allocate (GtkWidget *widget, if (!GTK_WIDGET_VISIBLE (child->widget)) break; - alloc.width = child->widget->requisition.width; - alloc.height = child->widget->requisition.height; + gtk_widget_get_child_requisition (child->widget, &child_requisition); + + alloc.width = child_requisition.width; + alloc.height = child_requisition.height; if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) - alloc.y = allocation->y + (allocation->height - child->widget->requisition.height) / 2; + alloc.y = allocation->y + (allocation->height - child_requisition.height) / 2; else - alloc.x = allocation->x + (allocation->width - child->widget->requisition.width) / 2; + alloc.x = allocation->x + (allocation->width - child_requisition.width) / 2; gtk_widget_size_allocate (child->widget, &alloc); if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) - alloc.x += child->widget->requisition.width; + alloc.x += child_requisition.width; else - alloc.y += child->widget->requisition.height; + alloc.y += child_requisition.height; break; @@ -552,9 +715,10 @@ gtk_toolbar_remove (GtkContainer *container, } static void -gtk_toolbar_foreach (GtkContainer *container, - GtkCallback callback, - gpointer callback_data) +gtk_toolbar_forall (GtkContainer *container, + gboolean include_internals, + GtkCallback callback, + gpointer callback_data) { GtkToolbar *toolbar; GList *children; @@ -695,7 +859,7 @@ gtk_toolbar_insert_widget (GtkToolbar *toolbar, position); } -GtkWidget * +GtkWidget* gtk_toolbar_append_element (GtkToolbar *toolbar, GtkToolbarChildType type, GtkWidget *widget, @@ -741,13 +905,23 @@ gtk_toolbar_insert_element (GtkToolbar *toolbar, gint position) { GtkToolbarChild *child; - GtkWidget *vbox; + GtkWidget *box; g_return_val_if_fail (toolbar != NULL, NULL); g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL); - g_return_val_if_fail ((type != GTK_TOOLBAR_CHILD_WIDGET) || (widget != NULL), 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) + g_return_val_if_fail (widget == NULL, NULL); + + if (type == GTK_TOOLBAR_CHILD_SPACE) + child = (GtkToolbarChild *) g_new (GtkToolbarChildSpace, 1); + else + child = g_new (GtkToolbarChild, 1); - child = g_new (GtkToolbarChild, 1); child->type = type; child->icon = NULL; child->label = NULL; @@ -756,6 +930,8 @@ gtk_toolbar_insert_element (GtkToolbar *toolbar, { case GTK_TOOLBAR_CHILD_SPACE: child->widget = NULL; + ((GtkToolbarChildSpace *) child)->alloc_x = + ((GtkToolbarChildSpace *) child)->alloc_y = 0; break; case GTK_TOOLBAR_CHILD_WIDGET: @@ -773,6 +949,7 @@ gtk_toolbar_insert_element (GtkToolbar *toolbar, else if (type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON) { child->widget = gtk_toggle_button_new (); + gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget), FALSE); } @@ -781,21 +958,27 @@ gtk_toolbar_insert_element (GtkToolbar *toolbar, child->widget = gtk_radio_button_new (widget ? gtk_radio_button_group (GTK_RADIO_BUTTON (widget)) : NULL); + gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget), FALSE); } + GTK_WIDGET_UNSET_FLAGS (child->widget, GTK_CAN_FOCUS); + if (callback) gtk_signal_connect (GTK_OBJECT (child->widget), "clicked", callback, user_data); - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (child->widget), vbox); - gtk_widget_show (vbox); + if (toolbar->style == GTK_TOOLBAR_BOTH_HORIZ) + box = gtk_hbox_new (FALSE, 0); + else + box = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (child->widget), box); + gtk_widget_show (box); if (text) { child->label = gtk_label_new (text); - gtk_box_pack_end (GTK_BOX (vbox), child->label, FALSE, FALSE, 0); + gtk_box_pack_end (GTK_BOX (box), child->label, FALSE, FALSE, 0); if (toolbar->style != GTK_TOOLBAR_ICONS) gtk_widget_show (child->label); } @@ -803,7 +986,7 @@ gtk_toolbar_insert_element (GtkToolbar *toolbar, if (icon) { child->icon = GTK_WIDGET (icon); - gtk_box_pack_end (GTK_BOX (vbox), child->icon, FALSE, FALSE, 0); + gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0); if (toolbar->style != GTK_TOOLBAR_TEXT) gtk_widget_show (child->icon); } @@ -823,22 +1006,21 @@ gtk_toolbar_insert_element (GtkToolbar *toolbar, toolbar->num_children++; if (type != GTK_TOOLBAR_CHILD_SPACE) - gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar)); - - if ((type != GTK_TOOLBAR_CHILD_SPACE) && GTK_WIDGET_VISIBLE (toolbar)) { - if (GTK_WIDGET_REALIZED (toolbar) - && !GTK_WIDGET_REALIZED (child->widget)) + gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar)); + + if (GTK_WIDGET_REALIZED (child->widget->parent)) gtk_widget_realize (child->widget); - - if (GTK_WIDGET_MAPPED (toolbar) - && !GTK_WIDGET_MAPPED (child->widget)) - gtk_widget_map (child->widget); - } - if (GTK_WIDGET_VISIBLE (toolbar) && - ((type == GTK_TOOLBAR_CHILD_SPACE) || - GTK_WIDGET_VISIBLE (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); + } + } + else gtk_widget_queue_resize (GTK_WIDGET (toolbar)); return child->widget; @@ -848,6 +1030,9 @@ void gtk_toolbar_set_orientation (GtkToolbar *toolbar, GtkOrientation orientation) { + g_return_if_fail (toolbar != NULL); + g_return_if_fail (GTK_IS_TOOLBAR (toolbar)); + gtk_signal_emit (GTK_OBJECT (toolbar), toolbar_signals[ORIENTATION_CHANGED], orientation); } @@ -855,6 +1040,9 @@ void gtk_toolbar_set_style (GtkToolbar *toolbar, GtkToolbarStyle style) { + g_return_if_fail (toolbar != NULL); + g_return_if_fail (GTK_IS_TOOLBAR (toolbar)); + gtk_signal_emit (GTK_OBJECT (toolbar), toolbar_signals[STYLE_CHANGED], style); } @@ -872,6 +1060,20 @@ gtk_toolbar_set_space_size (GtkToolbar *toolbar, } } +void +gtk_toolbar_set_space_style (GtkToolbar *toolbar, + GtkToolbarSpaceStyle space_style) +{ + g_return_if_fail (toolbar != NULL); + g_return_if_fail (GTK_IS_TOOLBAR (toolbar)); + + if (toolbar->space_style != space_style) + { + toolbar->space_style = space_style; + gtk_widget_queue_resize (GTK_WIDGET (toolbar)); + } +} + void gtk_toolbar_set_tooltips (GtkToolbar *toolbar, gint enable) @@ -902,7 +1104,9 @@ gtk_toolbar_set_button_relief (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_RADIOBUTTON || + child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON) gtk_button_set_relief (GTK_BUTTON (child->widget), relief); } @@ -911,7 +1115,7 @@ gtk_toolbar_set_button_relief (GtkToolbar *toolbar, } GtkReliefStyle -gtk_toolbar_get_button_relief (GtkToolbar *toolbar) +gtk_toolbar_get_button_relief (GtkToolbar *toolbar) { g_return_val_if_fail (toolbar != NULL, GTK_RELIEF_NORMAL); g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), GTK_RELIEF_NORMAL); @@ -919,19 +1123,6 @@ gtk_toolbar_get_button_relief (GtkToolbar *toolbar) return toolbar->relief; } -static void -gtk_toolbar_marshal_signal_1 (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args) -{ - GtkToolbarSignal1 rfunc; - - rfunc = (GtkToolbarSignal1) func; - - (*rfunc) (object, GTK_VALUE_ENUM (args[0]), func_data); -} - static void gtk_real_toolbar_orientation_changed (GtkToolbar *toolbar, GtkOrientation orientation) @@ -952,6 +1143,7 @@ gtk_real_toolbar_style_changed (GtkToolbar *toolbar, { GList *children; GtkToolbarChild *child; + GtkWidget* box = NULL; g_return_if_fail (toolbar != NULL); g_return_if_fail (GTK_IS_TOOLBAR (toolbar)); @@ -981,7 +1173,7 @@ gtk_real_toolbar_style_changed (GtkToolbar *toolbar, case GTK_TOOLBAR_TEXT: if (child->icon && GTK_WIDGET_VISIBLE (child->icon)) gtk_widget_hide (child->icon); - + if (child->label && !GTK_WIDGET_VISIBLE (child->label)) gtk_widget_show (child->label); @@ -994,6 +1186,86 @@ 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; + + if (GTK_IS_HBOX (box)) + { + if (child->icon) + { + gtk_object_ref (GTK_OBJECT (child->icon)); + gtk_container_remove (GTK_CONTAINER (box), + child->icon); + } + if (child->label) + { + gtk_object_ref (GTK_OBJECT (child->label)); + gtk_container_remove (GTK_CONTAINER (box), + child->label); + } + gtk_container_remove (GTK_CONTAINER (child->widget), + box); + + box = gtk_vbox_new (FALSE, 0); + gtk_widget_show (box); + + if (child->label) + { + gtk_box_pack_end (GTK_BOX (box), child->label, FALSE, FALSE, 0); + gtk_object_unref (GTK_OBJECT (child->label)); + } + if (child->icon) + { + gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0); + gtk_object_unref (GTK_OBJECT (child->icon)); + } + gtk_container_add (GTK_CONTAINER (child->widget), + box); + } + + break; + + case GTK_TOOLBAR_BOTH_HORIZ: + if (child->icon && !GTK_WIDGET_VISIBLE (child->icon)) + gtk_widget_show (child->icon); + if (child->label && !GTK_WIDGET_VISIBLE (child->label)) + gtk_widget_show (child->label); + + box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data; + + if (GTK_IS_VBOX (box)) + { + if (child->icon) + { + gtk_object_ref (GTK_OBJECT (child->icon)); + gtk_container_remove (GTK_CONTAINER (box), + child->icon); + } + if (child->label) + { + gtk_object_ref (GTK_OBJECT (child->label)); + gtk_container_remove (GTK_CONTAINER (box), + child->label); + } + gtk_container_remove (GTK_CONTAINER (child->widget), + box); + + box = gtk_hbox_new (FALSE, 0); + gtk_widget_show (box); + + if (child->label) + { + gtk_box_pack_end (GTK_BOX (box), child->label, TRUE, TRUE, 0); + gtk_object_unref (GTK_OBJECT (child->label)); + } + if (child->icon) + { + gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0); + gtk_object_unref (GTK_OBJECT (child->icon)); + } + gtk_container_add (GTK_CONTAINER (child->widget), box); + + } + break; default: