1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * GtkToolbar copyright (C) Federico Mena
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
23 * file for a list of people on the GTK+ Team. See the ChangeLog
24 * files for a list of changes. These files are distributed with
25 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
28 #include "gtkbutton.h"
29 #include "gtktogglebutton.h"
30 #include "gtkradiobutton.h"
34 #include "gtktoolbar.h"
37 #define DEFAULT_SPACE_SIZE 5
38 #define DEFAULT_SPACE_STYLE GTK_TOOLBAR_SPACE_EMPTY
40 #define SPACE_LINE_DIVISION 10
41 #define SPACE_LINE_START 3
42 #define SPACE_LINE_END 7
50 typedef struct _GtkToolbarChildSpace GtkToolbarChildSpace;
51 struct _GtkToolbarChildSpace
53 GtkToolbarChild child;
55 gint alloc_x, alloc_y;
58 static void gtk_toolbar_class_init (GtkToolbarClass *class);
59 static void gtk_toolbar_init (GtkToolbar *toolbar);
60 static void gtk_toolbar_destroy (GtkObject *object);
61 static void gtk_toolbar_map (GtkWidget *widget);
62 static void gtk_toolbar_unmap (GtkWidget *widget);
63 static void gtk_toolbar_draw (GtkWidget *widget,
65 static gint gtk_toolbar_expose (GtkWidget *widget,
66 GdkEventExpose *event);
67 static void gtk_toolbar_size_request (GtkWidget *widget,
68 GtkRequisition *requisition);
69 static void gtk_toolbar_size_allocate (GtkWidget *widget,
70 GtkAllocation *allocation);
71 static void gtk_toolbar_add (GtkContainer *container,
73 static void gtk_toolbar_remove (GtkContainer *container,
75 static void gtk_toolbar_forall (GtkContainer *container,
76 gboolean include_internals,
78 gpointer callback_data);
79 static void gtk_real_toolbar_orientation_changed (GtkToolbar *toolbar,
80 GtkOrientation orientation);
81 static void gtk_real_toolbar_style_changed (GtkToolbar *toolbar,
82 GtkToolbarStyle style);
85 static GtkContainerClass *parent_class;
87 static guint toolbar_signals[LAST_SIGNAL] = { 0 };
91 gtk_toolbar_get_type (void)
93 static GtkType toolbar_type = 0;
97 static const GtkTypeInfo toolbar_info =
101 sizeof (GtkToolbarClass),
102 (GtkClassInitFunc) gtk_toolbar_class_init,
103 (GtkObjectInitFunc) gtk_toolbar_init,
104 /* reserved_1 */ NULL,
105 /* reserved_2 */ NULL,
106 (GtkClassInitFunc) NULL,
109 toolbar_type = gtk_type_unique (gtk_container_get_type (), &toolbar_info);
116 gtk_toolbar_class_init (GtkToolbarClass *class)
118 GtkObjectClass *object_class;
119 GtkWidgetClass *widget_class;
120 GtkContainerClass *container_class;
122 object_class = (GtkObjectClass *) class;
123 widget_class = (GtkWidgetClass *) class;
124 container_class = (GtkContainerClass *) class;
126 parent_class = gtk_type_class (gtk_container_get_type ());
128 toolbar_signals[ORIENTATION_CHANGED] =
129 gtk_signal_new ("orientation_changed",
132 GTK_SIGNAL_OFFSET (GtkToolbarClass, orientation_changed),
133 gtk_marshal_NONE__INT,
136 toolbar_signals[STYLE_CHANGED] =
137 gtk_signal_new ("style_changed",
140 GTK_SIGNAL_OFFSET (GtkToolbarClass, style_changed),
141 gtk_marshal_NONE__INT,
145 gtk_object_class_add_signals (object_class, toolbar_signals, LAST_SIGNAL);
147 object_class->destroy = gtk_toolbar_destroy;
149 widget_class->map = gtk_toolbar_map;
150 widget_class->unmap = gtk_toolbar_unmap;
151 widget_class->draw = gtk_toolbar_draw;
152 widget_class->expose_event = gtk_toolbar_expose;
153 widget_class->size_request = gtk_toolbar_size_request;
154 widget_class->size_allocate = gtk_toolbar_size_allocate;
156 container_class->add = gtk_toolbar_add;
157 container_class->remove = gtk_toolbar_remove;
158 container_class->forall = gtk_toolbar_forall;
159 container_class->focus = NULL;
161 class->orientation_changed = gtk_real_toolbar_orientation_changed;
162 class->style_changed = gtk_real_toolbar_style_changed;
166 gtk_toolbar_init (GtkToolbar *toolbar)
168 GTK_WIDGET_SET_FLAGS (toolbar, GTK_NO_WINDOW);
169 GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_CAN_FOCUS);
171 toolbar->num_children = 0;
172 toolbar->children = NULL;
173 toolbar->orientation = GTK_ORIENTATION_HORIZONTAL;
174 toolbar->style = GTK_TOOLBAR_ICONS;
175 toolbar->relief = GTK_RELIEF_NORMAL;
176 toolbar->space_size = DEFAULT_SPACE_SIZE;
177 toolbar->space_style = DEFAULT_SPACE_STYLE;
178 toolbar->tooltips = gtk_tooltips_new ();
179 toolbar->button_maxw = 0;
180 toolbar->button_maxh = 0;
184 gtk_toolbar_new (GtkOrientation orientation,
185 GtkToolbarStyle style)
189 toolbar = gtk_type_new (gtk_toolbar_get_type ());
191 toolbar->orientation = orientation;
192 toolbar->style = style;
194 return GTK_WIDGET (toolbar);
198 gtk_toolbar_destroy (GtkObject *object)
203 g_return_if_fail (object != NULL);
204 g_return_if_fail (GTK_IS_TOOLBAR (object));
206 toolbar = GTK_TOOLBAR (object);
208 gtk_object_unref (GTK_OBJECT (toolbar->tooltips));
209 toolbar->tooltips = NULL;
211 for (children = toolbar->children; children; children = children->next)
213 GtkToolbarChild *child;
215 child = children->data;
217 if (child->type != GTK_TOOLBAR_CHILD_SPACE)
219 gtk_widget_ref (child->widget);
220 gtk_widget_unparent (child->widget);
221 gtk_widget_destroy (child->widget);
222 gtk_widget_unref (child->widget);
228 g_list_free (toolbar->children);
229 toolbar->children = NULL;
231 if (GTK_OBJECT_CLASS (parent_class)->destroy)
232 (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
236 gtk_toolbar_map (GtkWidget *widget)
240 GtkToolbarChild *child;
242 g_return_if_fail (widget != NULL);
243 g_return_if_fail (GTK_IS_TOOLBAR (widget));
245 toolbar = GTK_TOOLBAR (widget);
246 GTK_WIDGET_SET_FLAGS (toolbar, GTK_MAPPED);
248 for (children = toolbar->children; children; children = children->next)
250 child = children->data;
252 if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
253 && GTK_WIDGET_VISIBLE (child->widget) && !GTK_WIDGET_MAPPED (child->widget))
254 gtk_widget_map (child->widget);
259 gtk_toolbar_unmap (GtkWidget *widget)
263 GtkToolbarChild *child;
265 g_return_if_fail (widget != NULL);
266 g_return_if_fail (GTK_IS_TOOLBAR (widget));
268 toolbar = GTK_TOOLBAR (widget);
269 GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_MAPPED);
271 for (children = toolbar->children; children; children = children->next)
273 child = children->data;
275 if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
276 && GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_MAPPED (child->widget))
277 gtk_widget_unmap (child->widget);
282 gtk_toolbar_paint_space_line (GtkWidget *widget,
284 GtkToolbarChild *child)
287 GtkToolbarChildSpace *child_space;
289 g_return_if_fail (widget != NULL);
290 g_return_if_fail (GTK_IS_TOOLBAR (widget));
291 g_return_if_fail (child != NULL);
292 g_return_if_fail (child->type == GTK_TOOLBAR_CHILD_SPACE);
294 toolbar = GTK_TOOLBAR (widget);
296 child_space = (GtkToolbarChildSpace *) child;
298 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
299 gtk_paint_vline (widget->style, widget->window,
300 GTK_WIDGET_STATE (widget), area, widget,
302 child_space->alloc_y + toolbar->button_maxh *
303 SPACE_LINE_START / SPACE_LINE_DIVISION,
304 child_space->alloc_y + toolbar->button_maxh *
305 SPACE_LINE_END / SPACE_LINE_DIVISION,
306 child_space->alloc_x +
307 (toolbar->space_size -
308 widget->style->klass->xthickness) / 2);
310 gtk_paint_hline (widget->style, widget->window,
311 GTK_WIDGET_STATE (widget), area, widget,
313 child_space->alloc_x + toolbar->button_maxw *
314 SPACE_LINE_START / SPACE_LINE_DIVISION,
315 child_space->alloc_x + toolbar->button_maxw *
316 SPACE_LINE_END / SPACE_LINE_DIVISION,
317 child_space->alloc_y +
318 (toolbar->space_size -
319 widget->style->klass->ythickness) / 2);
323 gtk_toolbar_draw (GtkWidget *widget,
328 GtkToolbarChild *child;
329 GdkRectangle child_area;
331 g_return_if_fail (widget != NULL);
332 g_return_if_fail (GTK_IS_TOOLBAR (widget));
334 if (GTK_WIDGET_DRAWABLE (widget))
336 toolbar = GTK_TOOLBAR (widget);
338 for (children = toolbar->children; children; children = children->next)
340 child = children->data;
342 if (child->type == GTK_TOOLBAR_CHILD_SPACE)
344 if (toolbar->space_style == GTK_TOOLBAR_SPACE_LINE)
345 gtk_toolbar_paint_space_line (widget, area, child);
347 else if (gtk_widget_intersect (child->widget, area, &child_area))
348 gtk_widget_draw (child->widget, &child_area);
354 gtk_toolbar_expose (GtkWidget *widget,
355 GdkEventExpose *event)
359 GtkToolbarChild *child;
360 GdkEventExpose child_event;
362 g_return_val_if_fail (widget != NULL, FALSE);
363 g_return_val_if_fail (GTK_IS_TOOLBAR (widget), FALSE);
364 g_return_val_if_fail (event != NULL, FALSE);
366 if (GTK_WIDGET_DRAWABLE (widget))
368 toolbar = GTK_TOOLBAR (widget);
370 child_event = *event;
372 for (children = toolbar->children; children; children = children->next)
374 child = children->data;
376 if (child->type == GTK_TOOLBAR_CHILD_SPACE)
378 if (toolbar->space_style == GTK_TOOLBAR_SPACE_LINE)
379 gtk_toolbar_paint_space_line (widget, &event->area, child);
381 else if (GTK_WIDGET_NO_WINDOW (child->widget)
382 && gtk_widget_intersect (child->widget, &event->area, &child_event.area))
383 gtk_widget_event (child->widget, (GdkEvent *) &child_event);
391 gtk_toolbar_size_request (GtkWidget *widget,
392 GtkRequisition *requisition)
396 GtkToolbarChild *child;
398 gint button_maxw, button_maxh;
399 gint widget_maxw, widget_maxh;
400 GtkRequisition child_requisition;
402 g_return_if_fail (widget != NULL);
403 g_return_if_fail (GTK_IS_TOOLBAR (widget));
404 g_return_if_fail (requisition != NULL);
406 toolbar = GTK_TOOLBAR (widget);
408 requisition->width = GTK_CONTAINER (toolbar)->border_width * 2;
409 requisition->height = GTK_CONTAINER (toolbar)->border_width * 2;
416 for (children = toolbar->children; children; children = children->next)
418 child = children->data;
422 case GTK_TOOLBAR_CHILD_SPACE:
423 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
424 requisition->width += toolbar->space_size;
426 requisition->height += toolbar->space_size;
430 case GTK_TOOLBAR_CHILD_BUTTON:
431 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
432 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
433 if (GTK_WIDGET_VISIBLE (child->widget))
435 gtk_widget_size_request (child->widget, &child_requisition);
438 button_maxw = MAX (button_maxw, child_requisition.width);
439 button_maxh = MAX (button_maxh, child_requisition.height);
444 case GTK_TOOLBAR_CHILD_WIDGET:
445 if (GTK_WIDGET_VISIBLE (child->widget))
447 gtk_widget_size_request (child->widget, &child_requisition);
449 widget_maxw = MAX (widget_maxw, child_requisition.width);
450 widget_maxh = MAX (widget_maxh, child_requisition.height);
452 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
453 requisition->width += child_requisition.width;
455 requisition->height += child_requisition.height;
461 g_assert_not_reached ();
465 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
467 requisition->width += nbuttons * button_maxw;
468 requisition->height += MAX (button_maxh, widget_maxh);
472 requisition->width += MAX (button_maxw, widget_maxw);
473 requisition->height += nbuttons * button_maxh;
476 toolbar->button_maxw = button_maxw;
477 toolbar->button_maxh = button_maxh;
481 gtk_toolbar_size_allocate (GtkWidget *widget,
482 GtkAllocation *allocation)
486 GtkToolbarChild *child;
487 GtkToolbarChildSpace *child_space;
489 GtkRequisition child_requisition;
492 g_return_if_fail (widget != NULL);
493 g_return_if_fail (GTK_IS_TOOLBAR (widget));
494 g_return_if_fail (allocation != NULL);
496 toolbar = GTK_TOOLBAR (widget);
497 widget->allocation = *allocation;
499 border_width = GTK_CONTAINER (toolbar)->border_width;
501 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
502 alloc.x = allocation->x + border_width;
504 alloc.y = allocation->y + border_width;
506 for (children = toolbar->children; children; children = children->next)
508 child = children->data;
512 case GTK_TOOLBAR_CHILD_SPACE:
514 child_space = (GtkToolbarChildSpace *) child;
516 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
518 child_space->alloc_x = alloc.x;
519 child_space->alloc_y = allocation->y + (allocation->height - toolbar->button_maxh) / 2;
520 alloc.x += toolbar->space_size;
524 child_space->alloc_x = allocation->x + (allocation->width - toolbar->button_maxw) / 2;
525 child_space->alloc_y = alloc.y;
526 alloc.y += toolbar->space_size;
531 case GTK_TOOLBAR_CHILD_BUTTON:
532 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
533 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
534 if (!GTK_WIDGET_VISIBLE (child->widget))
537 alloc.width = toolbar->button_maxw;
538 alloc.height = toolbar->button_maxh;
540 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
541 alloc.y = allocation->y + (allocation->height - toolbar->button_maxh) / 2;
543 alloc.x = allocation->x + (allocation->width - toolbar->button_maxw) / 2;
545 gtk_widget_size_allocate (child->widget, &alloc);
547 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
548 alloc.x += toolbar->button_maxw;
550 alloc.y += toolbar->button_maxh;
554 case GTK_TOOLBAR_CHILD_WIDGET:
555 if (!GTK_WIDGET_VISIBLE (child->widget))
558 gtk_widget_get_child_requisition (child->widget, &child_requisition);
560 alloc.width = child_requisition.width;
561 alloc.height = child_requisition.height;
563 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
564 alloc.y = allocation->y + (allocation->height - child_requisition.height) / 2;
566 alloc.x = allocation->x + (allocation->width - child_requisition.width) / 2;
568 gtk_widget_size_allocate (child->widget, &alloc);
570 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
571 alloc.x += child_requisition.width;
573 alloc.y += child_requisition.height;
578 g_assert_not_reached ();
584 gtk_toolbar_add (GtkContainer *container,
587 g_return_if_fail (container != NULL);
588 g_return_if_fail (GTK_IS_TOOLBAR (container));
589 g_return_if_fail (widget != NULL);
591 gtk_toolbar_append_widget (GTK_TOOLBAR (container), widget, NULL, NULL);
595 gtk_toolbar_remove (GtkContainer *container,
600 GtkToolbarChild *child;
602 g_return_if_fail (container != NULL);
603 g_return_if_fail (GTK_IS_TOOLBAR (container));
604 g_return_if_fail (widget != NULL);
606 toolbar = GTK_TOOLBAR (container);
608 for (children = toolbar->children; children; children = children->next)
610 child = children->data;
612 if ((child->type != GTK_TOOLBAR_CHILD_SPACE) && (child->widget == widget))
614 gboolean was_visible;
616 was_visible = GTK_WIDGET_VISIBLE (widget);
617 gtk_widget_unparent (widget);
619 toolbar->children = g_list_remove_link (toolbar->children, children);
621 g_list_free (children);
622 toolbar->num_children--;
624 if (was_visible && GTK_WIDGET_VISIBLE (container))
625 gtk_widget_queue_resize (GTK_WIDGET (container));
633 gtk_toolbar_forall (GtkContainer *container,
634 gboolean include_internals,
635 GtkCallback callback,
636 gpointer callback_data)
640 GtkToolbarChild *child;
642 g_return_if_fail (container != NULL);
643 g_return_if_fail (GTK_IS_TOOLBAR (container));
644 g_return_if_fail (callback != NULL);
646 toolbar = GTK_TOOLBAR (container);
648 for (children = toolbar->children; children; children = children->next)
650 child = children->data;
652 if (child->type != GTK_TOOLBAR_CHILD_SPACE)
653 (*callback) (child->widget, callback_data);
658 gtk_toolbar_append_item (GtkToolbar *toolbar,
660 const char *tooltip_text,
661 const char *tooltip_private_text,
663 GtkSignalFunc callback,
666 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
668 tooltip_text, tooltip_private_text,
669 icon, callback, user_data,
670 toolbar->num_children);
674 gtk_toolbar_prepend_item (GtkToolbar *toolbar,
676 const char *tooltip_text,
677 const char *tooltip_private_text,
679 GtkSignalFunc callback,
682 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
684 tooltip_text, tooltip_private_text,
685 icon, callback, user_data,
690 gtk_toolbar_insert_item (GtkToolbar *toolbar,
692 const char *tooltip_text,
693 const char *tooltip_private_text,
695 GtkSignalFunc callback,
699 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
701 tooltip_text, tooltip_private_text,
702 icon, callback, user_data,
707 gtk_toolbar_append_space (GtkToolbar *toolbar)
709 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
713 toolbar->num_children);
717 gtk_toolbar_prepend_space (GtkToolbar *toolbar)
719 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
727 gtk_toolbar_insert_space (GtkToolbar *toolbar,
730 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
738 gtk_toolbar_append_widget (GtkToolbar *toolbar,
740 const gchar *tooltip_text,
741 const gchar *tooltip_private_text)
743 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
745 tooltip_text, tooltip_private_text,
747 toolbar->num_children);
751 gtk_toolbar_prepend_widget (GtkToolbar *toolbar,
753 const gchar *tooltip_text,
754 const gchar *tooltip_private_text)
756 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
758 tooltip_text, tooltip_private_text,
760 toolbar->num_children);
764 gtk_toolbar_insert_widget (GtkToolbar *toolbar,
766 const char *tooltip_text,
767 const char *tooltip_private_text,
770 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
772 tooltip_text, tooltip_private_text,
778 gtk_toolbar_append_element (GtkToolbar *toolbar,
779 GtkToolbarChildType type,
782 const char *tooltip_text,
783 const char *tooltip_private_text,
785 GtkSignalFunc callback,
788 return gtk_toolbar_insert_element (toolbar, type, widget, text,
789 tooltip_text, tooltip_private_text,
790 icon, callback, user_data,
791 toolbar->num_children);
795 gtk_toolbar_prepend_element (GtkToolbar *toolbar,
796 GtkToolbarChildType type,
799 const char *tooltip_text,
800 const char *tooltip_private_text,
802 GtkSignalFunc callback,
805 return gtk_toolbar_insert_element (toolbar, type, widget, text,
806 tooltip_text, tooltip_private_text,
807 icon, callback, user_data, 0);
811 gtk_toolbar_insert_element (GtkToolbar *toolbar,
812 GtkToolbarChildType type,
815 const char *tooltip_text,
816 const char *tooltip_private_text,
818 GtkSignalFunc callback,
822 GtkToolbarChild *child;
825 g_return_val_if_fail (toolbar != NULL, NULL);
826 g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
827 if (type == GTK_TOOLBAR_CHILD_WIDGET)
829 g_return_val_if_fail (widget != NULL, NULL);
830 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
832 else if (type != GTK_TOOLBAR_CHILD_RADIOBUTTON)
833 g_return_val_if_fail (widget == NULL, NULL);
835 if (type == GTK_TOOLBAR_CHILD_SPACE)
836 child = (GtkToolbarChild *) g_new (GtkToolbarChildSpace, 1);
838 child = g_new (GtkToolbarChild, 1);
846 case GTK_TOOLBAR_CHILD_SPACE:
847 child->widget = NULL;
848 ((GtkToolbarChildSpace *) child)->alloc_x =
849 ((GtkToolbarChildSpace *) child)->alloc_y = 0;
852 case GTK_TOOLBAR_CHILD_WIDGET:
853 child->widget = widget;
856 case GTK_TOOLBAR_CHILD_BUTTON:
857 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
858 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
859 if (type == GTK_TOOLBAR_CHILD_BUTTON)
861 child->widget = gtk_button_new ();
862 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
864 else if (type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
866 child->widget = gtk_toggle_button_new ();
867 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
868 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget),
873 child->widget = gtk_radio_button_new (widget
874 ? gtk_radio_button_group (GTK_RADIO_BUTTON (widget))
876 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
877 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget), FALSE);
880 GTK_WIDGET_UNSET_FLAGS (child->widget, GTK_CAN_FOCUS);
883 gtk_signal_connect (GTK_OBJECT (child->widget), "clicked",
884 callback, user_data);
886 if (toolbar->style == GTK_TOOLBAR_BOTH_HORIZ)
887 box = gtk_hbox_new (FALSE, 0);
889 box = gtk_vbox_new (FALSE, 0);
890 gtk_container_add (GTK_CONTAINER (child->widget), box);
891 gtk_widget_show (box);
895 child->label = gtk_label_new (text);
896 gtk_box_pack_end (GTK_BOX (box), child->label, FALSE, FALSE, 0);
897 if (toolbar->style != GTK_TOOLBAR_ICONS)
898 gtk_widget_show (child->label);
903 child->icon = GTK_WIDGET (icon);
904 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
905 if (toolbar->style != GTK_TOOLBAR_TEXT)
906 gtk_widget_show (child->icon);
909 gtk_widget_show (child->widget);
913 g_assert_not_reached ();
916 if ((type != GTK_TOOLBAR_CHILD_SPACE) && tooltip_text)
917 gtk_tooltips_set_tip (toolbar->tooltips, child->widget,
918 tooltip_text, tooltip_private_text);
920 toolbar->children = g_list_insert (toolbar->children, child, position);
921 toolbar->num_children++;
923 if (type != GTK_TOOLBAR_CHILD_SPACE)
924 gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
926 if ((type != GTK_TOOLBAR_CHILD_SPACE) && GTK_WIDGET_VISIBLE (toolbar))
928 if (GTK_WIDGET_REALIZED (toolbar)
929 && !GTK_WIDGET_REALIZED (child->widget))
930 gtk_widget_realize (child->widget);
932 if (GTK_WIDGET_MAPPED (toolbar)
933 && !GTK_WIDGET_MAPPED (child->widget))
934 gtk_widget_map (child->widget);
937 if (GTK_WIDGET_VISIBLE (toolbar) &&
938 ((type == GTK_TOOLBAR_CHILD_SPACE) ||
939 GTK_WIDGET_VISIBLE (child->widget)))
940 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
942 return child->widget;
946 gtk_toolbar_set_orientation (GtkToolbar *toolbar,
947 GtkOrientation orientation)
949 g_return_if_fail (toolbar != NULL);
950 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
952 gtk_signal_emit (GTK_OBJECT (toolbar), toolbar_signals[ORIENTATION_CHANGED], orientation);
956 gtk_toolbar_set_style (GtkToolbar *toolbar,
957 GtkToolbarStyle style)
959 g_return_if_fail (toolbar != NULL);
960 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
962 gtk_signal_emit (GTK_OBJECT (toolbar), toolbar_signals[STYLE_CHANGED], style);
966 gtk_toolbar_set_space_size (GtkToolbar *toolbar,
969 g_return_if_fail (toolbar != NULL);
970 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
972 if (toolbar->space_size != space_size)
974 toolbar->space_size = space_size;
975 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
980 gtk_toolbar_set_space_style (GtkToolbar *toolbar,
981 GtkToolbarSpaceStyle space_style)
983 g_return_if_fail (toolbar != NULL);
984 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
986 if (toolbar->space_style != space_style)
988 toolbar->space_style = space_style;
989 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
994 gtk_toolbar_set_tooltips (GtkToolbar *toolbar,
997 g_return_if_fail (toolbar != NULL);
998 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1001 gtk_tooltips_enable (toolbar->tooltips);
1003 gtk_tooltips_disable (toolbar->tooltips);
1007 gtk_toolbar_set_button_relief (GtkToolbar *toolbar,
1008 GtkReliefStyle relief)
1011 GtkToolbarChild *child;
1013 g_return_if_fail (toolbar != NULL);
1014 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1016 if (toolbar->relief != relief)
1018 toolbar->relief = relief;
1020 for (children = toolbar->children; children; children = children->next)
1022 child = children->data;
1023 if (child->type == GTK_TOOLBAR_CHILD_BUTTON ||
1024 child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON ||
1025 child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
1026 gtk_button_set_relief (GTK_BUTTON (child->widget), relief);
1029 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1034 gtk_toolbar_get_button_relief (GtkToolbar *toolbar)
1036 g_return_val_if_fail (toolbar != NULL, GTK_RELIEF_NORMAL);
1037 g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
1039 return toolbar->relief;
1043 gtk_real_toolbar_orientation_changed (GtkToolbar *toolbar,
1044 GtkOrientation orientation)
1046 g_return_if_fail (toolbar != NULL);
1047 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1049 if (toolbar->orientation != orientation)
1051 toolbar->orientation = orientation;
1052 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1057 gtk_real_toolbar_style_changed (GtkToolbar *toolbar,
1058 GtkToolbarStyle style)
1061 GtkToolbarChild *child;
1062 GtkWidget* box = NULL;
1064 g_return_if_fail (toolbar != NULL);
1065 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1067 if (toolbar->style != style)
1069 toolbar->style = style;
1071 for (children = toolbar->children; children; children = children->next)
1073 child = children->data;
1075 if (child->type == GTK_TOOLBAR_CHILD_BUTTON ||
1076 child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON ||
1077 child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
1080 case GTK_TOOLBAR_ICONS:
1081 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1082 gtk_widget_show (child->icon);
1084 if (child->label && GTK_WIDGET_VISIBLE (child->label))
1085 gtk_widget_hide (child->label);
1089 case GTK_TOOLBAR_TEXT:
1090 if (child->icon && GTK_WIDGET_VISIBLE (child->icon))
1091 gtk_widget_hide (child->icon);
1093 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1094 gtk_widget_show (child->label);
1098 case GTK_TOOLBAR_BOTH:
1099 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1100 gtk_widget_show (child->icon);
1102 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1103 gtk_widget_show (child->label);
1105 box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
1107 if (GTK_IS_HBOX (box))
1111 gtk_object_ref (GTK_OBJECT (child->icon));
1112 gtk_container_remove (GTK_CONTAINER (box),
1117 gtk_object_ref (GTK_OBJECT (child->label));
1118 gtk_container_remove (GTK_CONTAINER (box),
1121 gtk_container_remove (GTK_CONTAINER (child->widget),
1124 box = gtk_vbox_new (FALSE, 0);
1125 gtk_widget_show (box);
1129 gtk_box_pack_end (GTK_BOX (box), child->label, FALSE, FALSE, 0);
1130 gtk_object_unref (GTK_OBJECT (child->label));
1134 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
1135 gtk_object_unref (GTK_OBJECT (child->icon));
1137 gtk_container_add (GTK_CONTAINER (child->widget),
1143 case GTK_TOOLBAR_BOTH_HORIZ:
1144 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1145 gtk_widget_show (child->icon);
1146 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1147 gtk_widget_show (child->label);
1149 box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
1151 if (GTK_IS_VBOX (box))
1155 gtk_object_ref (GTK_OBJECT (child->icon));
1156 gtk_container_remove (GTK_CONTAINER (box),
1161 gtk_object_ref (GTK_OBJECT (child->label));
1162 gtk_container_remove (GTK_CONTAINER (box),
1165 gtk_container_remove (GTK_CONTAINER (child->widget),
1168 box = gtk_hbox_new (FALSE, 0);
1169 gtk_widget_show (box);
1173 gtk_box_pack_end (GTK_BOX (box), child->label, TRUE, TRUE, 0);
1174 gtk_object_unref (GTK_OBJECT (child->label));
1178 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
1179 gtk_object_unref (GTK_OBJECT (child->icon));
1181 gtk_container_add (GTK_CONTAINER (child->widget), box);
1188 g_assert_not_reached ();
1192 gtk_widget_queue_resize (GTK_WIDGET (toolbar));