]> Pileus Git - ~andy/gtk/blob - gtk/gtktoolitem.c
docs: inline see_also to sections docs and add missing <variablelist>
[~andy/gtk] / gtk / gtktoolitem.c
1 /* gtktoolitem.c
2  *
3  * Copyright (C) 2002 Anders Carlsson <andersca@gnome.org>
4  * Copyright (C) 2002 James Henstridge <james@daa.com.au>
5  * Copyright (C) 2003 Soeren Sandmann <sandmann@daimi.au.dk>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 #include "config.h"
24
25 #include <string.h>
26
27 #undef GTK_DISABLE_DEPRECATED /* GtkTooltips */
28
29 #include "gtktoolitem.h"
30 #include "gtkmarshalers.h"
31 #include "gtktoolshell.h"
32 #include "gtkseparatormenuitem.h"
33 #include "gtkactivatable.h"
34 #include "gtkintl.h"
35 #include "gtkmain.h"
36 #include "gtkprivate.h"
37 #include "gtkalias.h"
38
39 /**
40  * SECTION:gtktoolitem
41  * @short_description: The base class of widgets that can be added to GtkToolShell
42  * @see_also: <variablelist>
43  *   <varlistentry>
44  *     <term>#GtkToolbar</term>
45  *     <listitem><para>The toolbar widget</para></listitem>
46  *   </varlistentry>
47  *   <varlistentry>
48  *     <term>#GtkToolButton</term>
49  *     <listitem><para>A subclass of #GtkToolItem that displays buttons on
50  *         the toolbar</para></listitem>
51  *   </varlistentry>
52  *   <varlistentry>
53  *     <term>#GtkSeparatorToolItem</term>
54  *     <listitem><para>A subclass of #GtkToolItem that separates groups of
55  *         items on a toolbar</para></listitem>
56  *   </varlistentry>
57  * </variablelist>
58  *
59  * #GtkToolItem<!-- -->s are widgets that can appear on a toolbar. To
60  * create a toolbar item that contain something else than a button, use
61  * gtk_tool_item_new(). Use gtk_container_add() to add a child
62  * widget to the tool item.
63  *
64  * For toolbar items that contain buttons, see the #GtkToolButton,
65  * #GtkToggleToolButton and #GtkRadioToolButton classes.
66  *
67  * See the #GtkToolbar class for a description of the toolbar widget, and
68  * #GtkToolShell for a description of the tool shell interface.
69  */
70
71 /**
72  * GtkToolItem:
73  *
74  * The GtkToolItem struct contains only private data.
75  * It should only be accessed through the functions described below.
76  */
77
78 enum {
79   CREATE_MENU_PROXY,
80   TOOLBAR_RECONFIGURED,
81   SET_TOOLTIP,
82   LAST_SIGNAL
83 };
84
85 enum {
86   PROP_0,
87   PROP_VISIBLE_HORIZONTAL,
88   PROP_VISIBLE_VERTICAL,
89   PROP_IS_IMPORTANT,
90
91   /* activatable properties */
92   PROP_ACTIVATABLE_RELATED_ACTION,
93   PROP_ACTIVATABLE_USE_ACTION_APPEARANCE
94 };
95
96 #define GTK_TOOL_ITEM_GET_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_TOOL_ITEM, GtkToolItemPrivate))
97
98 struct _GtkToolItemPrivate
99 {
100   gchar *tip_text;
101   gchar *tip_private;
102
103   guint visible_horizontal : 1;
104   guint visible_vertical : 1;
105   guint homogeneous : 1;
106   guint expand : 1;
107   guint use_drag_window : 1;
108   guint is_important : 1;
109
110   GdkWindow *drag_window;
111   
112   gchar *menu_item_id;
113   GtkWidget *menu_item;
114
115   GtkAction *action;
116   gboolean   use_action_appearance;
117 };
118   
119 static void gtk_tool_item_finalize     (GObject         *object);
120 static void gtk_tool_item_dispose      (GObject         *object);
121 static void gtk_tool_item_parent_set   (GtkWidget       *toolitem,
122                                         GtkWidget       *parent);
123 static void gtk_tool_item_set_property (GObject         *object,
124                                         guint            prop_id,
125                                         const GValue    *value,
126                                         GParamSpec      *pspec);
127 static void gtk_tool_item_get_property (GObject         *object,
128                                         guint            prop_id,
129                                         GValue          *value,
130                                         GParamSpec      *pspec);
131 static void gtk_tool_item_property_notify (GObject      *object,
132                                            GParamSpec   *pspec);
133 static void gtk_tool_item_realize       (GtkWidget      *widget);
134 static void gtk_tool_item_unrealize     (GtkWidget      *widget);
135 static void gtk_tool_item_map           (GtkWidget      *widget);
136 static void gtk_tool_item_unmap         (GtkWidget      *widget);
137 static void gtk_tool_item_size_request  (GtkWidget      *widget,
138                                          GtkRequisition *requisition);
139 static void gtk_tool_item_size_allocate (GtkWidget      *widget,
140                                          GtkAllocation  *allocation);
141 static gboolean gtk_tool_item_real_set_tooltip (GtkToolItem *tool_item,
142                                                 GtkTooltips *tooltips,
143                                                 const gchar *tip_text,
144                                                 const gchar *tip_private);
145
146 static void gtk_tool_item_activatable_interface_init (GtkActivatableIface  *iface);
147 static void gtk_tool_item_update                     (GtkActivatable       *activatable,
148                                                       GtkAction            *action,
149                                                       const gchar          *property_name);
150 static void gtk_tool_item_sync_action_properties     (GtkActivatable       *activatable,
151                                                       GtkAction            *action);
152 static void gtk_tool_item_set_related_action         (GtkToolItem          *item, 
153                                                       GtkAction            *action);
154 static void gtk_tool_item_set_use_action_appearance  (GtkToolItem          *item, 
155                                                       gboolean              use_appearance);
156
157 static guint toolitem_signals[LAST_SIGNAL] = { 0 };
158
159 G_DEFINE_TYPE_WITH_CODE (GtkToolItem, gtk_tool_item, GTK_TYPE_BIN,
160                          G_IMPLEMENT_INTERFACE (GTK_TYPE_ACTIVATABLE,
161                                                 gtk_tool_item_activatable_interface_init))
162
163 static void
164 gtk_tool_item_class_init (GtkToolItemClass *klass)
165 {
166   GObjectClass *object_class;
167   GtkWidgetClass *widget_class;
168   
169   object_class = (GObjectClass *)klass;
170   widget_class = (GtkWidgetClass *)klass;
171   
172   object_class->set_property = gtk_tool_item_set_property;
173   object_class->get_property = gtk_tool_item_get_property;
174   object_class->finalize     = gtk_tool_item_finalize;
175   object_class->dispose      = gtk_tool_item_dispose;
176   object_class->notify       = gtk_tool_item_property_notify;
177
178   widget_class->realize       = gtk_tool_item_realize;
179   widget_class->unrealize     = gtk_tool_item_unrealize;
180   widget_class->map           = gtk_tool_item_map;
181   widget_class->unmap         = gtk_tool_item_unmap;
182   widget_class->size_request  = gtk_tool_item_size_request;
183   widget_class->size_allocate = gtk_tool_item_size_allocate;
184   widget_class->parent_set    = gtk_tool_item_parent_set;
185
186   klass->create_menu_proxy = _gtk_tool_item_create_menu_proxy;
187   klass->set_tooltip       = gtk_tool_item_real_set_tooltip;
188   
189   g_object_class_install_property (object_class,
190                                    PROP_VISIBLE_HORIZONTAL,
191                                    g_param_spec_boolean ("visible-horizontal",
192                                                          P_("Visible when horizontal"),
193                                                          P_("Whether the toolbar item is visible when the toolbar is in a horizontal orientation."),
194                                                          TRUE,
195                                                          GTK_PARAM_READWRITE));
196   g_object_class_install_property (object_class,
197                                    PROP_VISIBLE_VERTICAL,
198                                    g_param_spec_boolean ("visible-vertical",
199                                                          P_("Visible when vertical"),
200                                                          P_("Whether the toolbar item is visible when the toolbar is in a vertical orientation."),
201                                                          TRUE,
202                                                          GTK_PARAM_READWRITE));
203   g_object_class_install_property (object_class,
204                                    PROP_IS_IMPORTANT,
205                                    g_param_spec_boolean ("is-important",
206                                                          P_("Is important"),
207                                                          P_("Whether the toolbar item is considered important. When TRUE, toolbar buttons show text in GTK_TOOLBAR_BOTH_HORIZ mode"),
208                                                          FALSE,
209                                                          GTK_PARAM_READWRITE));
210
211   g_object_class_override_property (object_class, PROP_ACTIVATABLE_RELATED_ACTION, "related-action");
212   g_object_class_override_property (object_class, PROP_ACTIVATABLE_USE_ACTION_APPEARANCE, "use-action-appearance");
213
214
215 /**
216  * GtkToolItem::create-menu-proxy:
217  * @tool_item: the object the signal was emitted on
218  *
219  * This signal is emitted when the toolbar needs information from @tool_item
220  * about whether the item should appear in the toolbar overflow menu. In
221  * response the tool item should either
222  * <itemizedlist>
223  * <listitem>call gtk_tool_item_set_proxy_menu_item() with a %NULL
224  * pointer and return %TRUE to indicate that the item should not appear
225  * in the overflow menu
226  * </listitem>
227  * <listitem> call gtk_tool_item_set_proxy_menu_item() with a new menu
228  * item and return %TRUE, or 
229  * </listitem>
230  * <listitem> return %FALSE to indicate that the signal was not
231  * handled by the item. This means that
232  * the item will not appear in the overflow menu unless a later handler
233  * installs a menu item.
234  * </listitem>
235  * </itemizedlist>
236  *
237  * The toolbar may cache the result of this signal. When the tool item changes
238  * how it will respond to this signal it must call gtk_tool_item_rebuild_menu()
239  * to invalidate the cache and ensure that the toolbar rebuilds its overflow
240  * menu.
241  *
242  * Return value: %TRUE if the signal was handled, %FALSE if not
243  **/
244   toolitem_signals[CREATE_MENU_PROXY] =
245     g_signal_new (I_("create-menu-proxy"),
246                   G_OBJECT_CLASS_TYPE (klass),
247                   G_SIGNAL_RUN_LAST,
248                   G_STRUCT_OFFSET (GtkToolItemClass, create_menu_proxy),
249                   _gtk_boolean_handled_accumulator, NULL,
250                   _gtk_marshal_BOOLEAN__VOID,
251                   G_TYPE_BOOLEAN, 0);
252
253 /**
254  * GtkToolItem::toolbar-reconfigured:
255  * @tool_item: the object the signal was emitted on
256  *
257  * This signal is emitted when some property of the toolbar that the
258  * item is a child of changes. For custom subclasses of #GtkToolItem,
259  * the default handler of this signal use the functions
260  * <itemizedlist>
261  * <listitem>gtk_tool_shell_get_orientation()</listitem>
262  * <listitem>gtk_tool_shell_get_style()</listitem>
263  * <listitem>gtk_tool_shell_get_icon_size()</listitem>
264  * <listitem>gtk_tool_shell_get_relief_style()</listitem>
265  * </itemizedlist>
266  * to find out what the toolbar should look like and change
267  * themselves accordingly.
268  **/
269   toolitem_signals[TOOLBAR_RECONFIGURED] =
270     g_signal_new (I_("toolbar-reconfigured"),
271                   G_OBJECT_CLASS_TYPE (klass),
272                   G_SIGNAL_RUN_LAST,
273                   G_STRUCT_OFFSET (GtkToolItemClass, toolbar_reconfigured),
274                   NULL, NULL,
275                   _gtk_marshal_VOID__VOID,
276                   G_TYPE_NONE, 0);
277 /**
278  * GtkToolItem::set-tooltip:
279  * @tool_item: the object the signal was emitted on
280  * @tooltips: the #GtkTooltips
281  * @tip_text: the tooltip text
282  * @tip_private: the tooltip private text
283  *
284  * This signal is emitted when the toolitem's tooltip changes.
285  * Application developers can use gtk_tool_item_set_tooltip() to
286  * set the item's tooltip.
287  *
288  * Return value: %TRUE if the signal was handled, %FALSE if not
289  *
290  * Deprecated: 2.12: With the new tooltip API, there is no
291  *   need to use this signal anymore.
292  **/
293   toolitem_signals[SET_TOOLTIP] =
294     g_signal_new (I_("set-tooltip"),
295                   G_OBJECT_CLASS_TYPE (klass),
296                   G_SIGNAL_RUN_LAST,
297                   G_STRUCT_OFFSET (GtkToolItemClass, set_tooltip),
298                   _gtk_boolean_handled_accumulator, NULL,
299                   _gtk_marshal_BOOLEAN__OBJECT_STRING_STRING,
300                   G_TYPE_BOOLEAN, 3,
301                   GTK_TYPE_TOOLTIPS,
302                   G_TYPE_STRING,
303                   G_TYPE_STRING);                 
304
305   g_type_class_add_private (object_class, sizeof (GtkToolItemPrivate));
306 }
307
308 static void
309 gtk_tool_item_init (GtkToolItem *toolitem)
310 {
311   GTK_WIDGET_UNSET_FLAGS (toolitem, GTK_CAN_FOCUS);  
312
313   toolitem->priv = GTK_TOOL_ITEM_GET_PRIVATE (toolitem);
314
315   toolitem->priv->visible_horizontal = TRUE;
316   toolitem->priv->visible_vertical = TRUE;
317   toolitem->priv->homogeneous = FALSE;
318   toolitem->priv->expand = FALSE;
319
320   toolitem->priv->use_action_appearance = TRUE;
321 }
322
323 static void
324 gtk_tool_item_finalize (GObject *object)
325 {
326   GtkToolItem *item = GTK_TOOL_ITEM (object);
327
328   g_free (item->priv->menu_item_id);
329
330   if (item->priv->menu_item)
331     g_object_unref (item->priv->menu_item);
332
333   G_OBJECT_CLASS (gtk_tool_item_parent_class)->finalize (object);
334 }
335
336 static void
337 gtk_tool_item_dispose (GObject *object)
338 {
339   GtkToolItem *item = GTK_TOOL_ITEM (object);
340
341   if (item->priv->action)
342     {
343       gtk_activatable_do_set_related_action (GTK_ACTIVATABLE (item), NULL);      
344       item->priv->action = NULL;
345     }
346   G_OBJECT_CLASS (gtk_tool_item_parent_class)->dispose (object);
347 }
348
349
350 static void
351 gtk_tool_item_parent_set (GtkWidget   *toolitem,
352                           GtkWidget   *prev_parent)
353 {
354   if (GTK_WIDGET (toolitem)->parent != NULL)
355     gtk_tool_item_toolbar_reconfigured (GTK_TOOL_ITEM (toolitem));
356 }
357
358 static void
359 gtk_tool_item_set_property (GObject      *object,
360                             guint         prop_id,
361                             const GValue *value,
362                             GParamSpec   *pspec)
363 {
364   GtkToolItem *toolitem = GTK_TOOL_ITEM (object);
365
366   switch (prop_id)
367     {
368     case PROP_VISIBLE_HORIZONTAL:
369       gtk_tool_item_set_visible_horizontal (toolitem, g_value_get_boolean (value));
370       break;
371     case PROP_VISIBLE_VERTICAL:
372       gtk_tool_item_set_visible_vertical (toolitem, g_value_get_boolean (value));
373       break;
374     case PROP_IS_IMPORTANT:
375       gtk_tool_item_set_is_important (toolitem, g_value_get_boolean (value));
376       break;
377     case PROP_ACTIVATABLE_RELATED_ACTION:
378       gtk_tool_item_set_related_action (toolitem, g_value_get_object (value));
379       break;
380     case PROP_ACTIVATABLE_USE_ACTION_APPEARANCE:
381       gtk_tool_item_set_use_action_appearance (toolitem, g_value_get_boolean (value));
382       break;
383     default:
384       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
385       break;
386     }
387 }
388
389 static void
390 gtk_tool_item_get_property (GObject    *object,
391                             guint       prop_id,
392                             GValue     *value,
393                             GParamSpec *pspec)
394 {
395   GtkToolItem *toolitem = GTK_TOOL_ITEM (object);
396
397   switch (prop_id)
398     {
399     case PROP_VISIBLE_HORIZONTAL:
400       g_value_set_boolean (value, toolitem->priv->visible_horizontal);
401       break;
402     case PROP_VISIBLE_VERTICAL:
403       g_value_set_boolean (value, toolitem->priv->visible_vertical);
404       break;
405     case PROP_IS_IMPORTANT:
406       g_value_set_boolean (value, toolitem->priv->is_important);
407       break;
408     case PROP_ACTIVATABLE_RELATED_ACTION:
409       g_value_set_object (value, toolitem->priv->action);
410       break;
411     case PROP_ACTIVATABLE_USE_ACTION_APPEARANCE:
412       g_value_set_boolean (value, toolitem->priv->use_action_appearance);
413       break;
414     default:
415       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
416       break;
417     }
418 }
419
420 static void
421 gtk_tool_item_property_notify (GObject    *object,
422                                GParamSpec *pspec)
423 {
424   GtkToolItem *tool_item = GTK_TOOL_ITEM (object);
425
426   if (tool_item->priv->menu_item && strcmp (pspec->name, "sensitive") == 0)
427     gtk_widget_set_sensitive (tool_item->priv->menu_item,
428                               GTK_WIDGET_SENSITIVE (tool_item));
429 }
430
431 static void
432 create_drag_window (GtkToolItem *toolitem)
433 {
434   GtkWidget *widget;
435   GdkWindowAttr attributes;
436   gint attributes_mask, border_width;
437
438   g_return_if_fail (toolitem->priv->use_drag_window == TRUE);
439
440   widget = GTK_WIDGET (toolitem);
441   border_width = GTK_CONTAINER (toolitem)->border_width;
442
443   attributes.window_type = GDK_WINDOW_CHILD;
444   attributes.x = widget->allocation.x + border_width;
445   attributes.y = widget->allocation.y + border_width;
446   attributes.width = widget->allocation.width - border_width * 2;
447   attributes.height = widget->allocation.height - border_width * 2;
448   attributes.wclass = GDK_INPUT_ONLY;
449   attributes.event_mask = gtk_widget_get_events (widget);
450   attributes.event_mask |= (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
451
452   attributes_mask = GDK_WA_X | GDK_WA_Y;
453
454   toolitem->priv->drag_window = gdk_window_new (gtk_widget_get_parent_window (widget),
455                                           &attributes, attributes_mask);
456   gdk_window_set_user_data (toolitem->priv->drag_window, toolitem);
457 }
458
459 static void
460 gtk_tool_item_realize (GtkWidget *widget)
461 {
462   GtkToolItem *toolitem;
463
464   toolitem = GTK_TOOL_ITEM (widget);
465   GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
466
467   widget->window = gtk_widget_get_parent_window (widget);
468   g_object_ref (widget->window);
469
470   if (toolitem->priv->use_drag_window)
471     create_drag_window(toolitem);
472
473   widget->style = gtk_style_attach (widget->style, widget->window);
474 }
475
476 static void
477 destroy_drag_window (GtkToolItem *toolitem)
478 {
479   if (toolitem->priv->drag_window)
480     {
481       gdk_window_set_user_data (toolitem->priv->drag_window, NULL);
482       gdk_window_destroy (toolitem->priv->drag_window);
483       toolitem->priv->drag_window = NULL;
484     }
485 }
486
487 static void
488 gtk_tool_item_unrealize (GtkWidget *widget)
489 {
490   GtkToolItem *toolitem;
491
492   toolitem = GTK_TOOL_ITEM (widget);
493
494   destroy_drag_window (toolitem);
495   
496   GTK_WIDGET_CLASS (gtk_tool_item_parent_class)->unrealize (widget);
497 }
498
499 static void
500 gtk_tool_item_map (GtkWidget *widget)
501 {
502   GtkToolItem *toolitem;
503
504   toolitem = GTK_TOOL_ITEM (widget);
505   GTK_WIDGET_CLASS (gtk_tool_item_parent_class)->map (widget);
506   if (toolitem->priv->drag_window)
507     gdk_window_show (toolitem->priv->drag_window);
508 }
509
510 static void
511 gtk_tool_item_unmap (GtkWidget *widget)
512 {
513   GtkToolItem *toolitem;
514
515   toolitem = GTK_TOOL_ITEM (widget);
516   if (toolitem->priv->drag_window)
517     gdk_window_hide (toolitem->priv->drag_window);
518   GTK_WIDGET_CLASS (gtk_tool_item_parent_class)->unmap (widget);
519 }
520
521 static void
522 gtk_tool_item_size_request (GtkWidget      *widget,
523                             GtkRequisition *requisition)
524 {
525   GtkWidget *child = GTK_BIN (widget)->child;
526
527   if (child && GTK_WIDGET_VISIBLE (child))
528     {
529       gtk_widget_size_request (child, requisition);
530     }
531   else
532     {
533       requisition->height = 0;
534       requisition->width = 0;
535     }
536   
537   requisition->width += (GTK_CONTAINER (widget)->border_width) * 2;
538   requisition->height += (GTK_CONTAINER (widget)->border_width) * 2;
539 }
540
541 static void
542 gtk_tool_item_size_allocate (GtkWidget     *widget,
543                              GtkAllocation *allocation)
544 {
545   GtkToolItem *toolitem = GTK_TOOL_ITEM (widget);
546   GtkAllocation child_allocation;
547   gint border_width;
548   GtkWidget *child = GTK_BIN (widget)->child;
549
550   widget->allocation = *allocation;
551   border_width = GTK_CONTAINER (widget)->border_width;
552
553   if (toolitem->priv->drag_window)
554     gdk_window_move_resize (toolitem->priv->drag_window,
555                             widget->allocation.x + border_width,
556                             widget->allocation.y + border_width,
557                             widget->allocation.width - border_width * 2,
558                             widget->allocation.height - border_width * 2);
559   
560   if (child && GTK_WIDGET_VISIBLE (child))
561     {
562       child_allocation.x = allocation->x + border_width;
563       child_allocation.y = allocation->y + border_width;
564       child_allocation.width = allocation->width - 2 * border_width;
565       child_allocation.height = allocation->height - 2 * border_width;
566       
567       gtk_widget_size_allocate (child, &child_allocation);
568     }
569 }
570
571 gboolean
572 _gtk_tool_item_create_menu_proxy (GtkToolItem *item)
573 {
574   GtkWidget *menu_item;
575   gboolean visible_overflown;
576
577   if (item->priv->action)
578     {
579       g_object_get (item->priv->action, "visible-overflown", &visible_overflown, NULL);
580     
581       if (visible_overflown)
582         {
583           menu_item = gtk_action_create_menu_item (item->priv->action);
584
585           g_object_ref_sink (menu_item);
586           gtk_tool_item_set_proxy_menu_item (item, "gtk-action-menu-item", menu_item);
587           g_object_unref (menu_item);
588         }
589       else
590         gtk_tool_item_set_proxy_menu_item (item, "gtk-action-menu-item", NULL);
591
592       return TRUE;
593     }
594
595   return FALSE;
596 }
597
598 static void
599 gtk_tool_item_activatable_interface_init (GtkActivatableIface *iface)
600 {
601   iface->update = gtk_tool_item_update;
602   iface->sync_action_properties = gtk_tool_item_sync_action_properties;
603 }
604
605 static void
606 gtk_tool_item_update (GtkActivatable *activatable,
607                       GtkAction      *action,
608                       const gchar    *property_name)
609 {
610   if (strcmp (property_name, "visible") == 0)
611     {
612       if (gtk_action_is_visible (action))
613         gtk_widget_show (GTK_WIDGET (activatable));
614       else
615         gtk_widget_hide (GTK_WIDGET (activatable));
616     }
617   else if (strcmp (property_name, "sensitive") == 0)
618     gtk_widget_set_sensitive (GTK_WIDGET (activatable), gtk_action_is_sensitive (action));
619   else if (strcmp (property_name, "tooltip") == 0)
620     gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (activatable),
621                                     gtk_action_get_tooltip (action));
622   else if (strcmp (property_name, "visible-horizontal") == 0)
623     gtk_tool_item_set_visible_horizontal (GTK_TOOL_ITEM (activatable),
624                                           gtk_action_get_visible_horizontal (action));
625   else if (strcmp (property_name, "visible-vertical") == 0)
626     gtk_tool_item_set_visible_vertical (GTK_TOOL_ITEM (activatable),
627                                         gtk_action_get_visible_vertical (action));
628   else if (strcmp (property_name, "is-important") == 0)
629     gtk_tool_item_set_is_important (GTK_TOOL_ITEM (activatable),
630                                     gtk_action_get_is_important (action));
631 }
632
633 static void
634 gtk_tool_item_sync_action_properties (GtkActivatable *activatable,
635                                       GtkAction      *action)
636 {
637   if (!action)
638     return;
639
640   if (gtk_action_is_visible (action))
641     gtk_widget_show (GTK_WIDGET (activatable));
642   else
643     gtk_widget_hide (GTK_WIDGET (activatable));
644   
645   gtk_widget_set_sensitive (GTK_WIDGET (activatable), gtk_action_is_sensitive (action));
646   
647   gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (activatable),
648                                   gtk_action_get_tooltip (action));
649   gtk_tool_item_set_visible_horizontal (GTK_TOOL_ITEM (activatable),
650                                         gtk_action_get_visible_horizontal (action));
651   gtk_tool_item_set_visible_vertical (GTK_TOOL_ITEM (activatable),
652                                       gtk_action_get_visible_vertical (action));
653   gtk_tool_item_set_is_important (GTK_TOOL_ITEM (activatable),
654                                   gtk_action_get_is_important (action));
655 }
656
657 static void
658 gtk_tool_item_set_related_action (GtkToolItem *item, 
659                                   GtkAction   *action)
660 {
661   if (item->priv->action == action)
662     return;
663
664   gtk_activatable_do_set_related_action (GTK_ACTIVATABLE (item), action);
665
666   item->priv->action = action;
667
668   if (action)
669     {
670       gtk_tool_item_rebuild_menu (item);
671     }
672 }
673
674 static void
675 gtk_tool_item_set_use_action_appearance (GtkToolItem *item,
676                                          gboolean     use_appearance)
677 {
678   if (item->priv->use_action_appearance != use_appearance)
679     {
680       item->priv->use_action_appearance = use_appearance;
681
682       gtk_activatable_sync_action_properties (GTK_ACTIVATABLE (item), item->priv->action);
683     }
684 }
685
686
687 /**
688  * gtk_tool_item_new:
689  * 
690  * Creates a new #GtkToolItem
691  * 
692  * Return value: the new #GtkToolItem
693  * 
694  * Since: 2.4
695  **/
696 GtkToolItem *
697 gtk_tool_item_new (void)
698 {
699   GtkToolItem *item;
700
701   item = g_object_new (GTK_TYPE_TOOL_ITEM, NULL);
702
703   return item;
704 }
705
706 /**
707  * gtk_tool_item_get_icon_size:
708  * @tool_item: a #GtkToolItem
709  * 
710  * Returns the icon size used for @tool_item. Custom subclasses of
711  * #GtkToolItem should call this function to find out what size icons
712  * they should use.
713  * 
714  * Return value: a #GtkIconSize indicating the icon size used for @tool_item
715  * 
716  * Since: 2.4
717  **/
718 GtkIconSize
719 gtk_tool_item_get_icon_size (GtkToolItem *tool_item)
720 {
721   GtkWidget *parent;
722
723   g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), GTK_ICON_SIZE_LARGE_TOOLBAR);
724
725   parent = GTK_WIDGET (tool_item)->parent;
726   if (!parent || !GTK_IS_TOOL_SHELL (parent))
727     return GTK_ICON_SIZE_LARGE_TOOLBAR;
728
729   return gtk_tool_shell_get_icon_size (GTK_TOOL_SHELL (parent));
730 }
731
732 /**
733  * gtk_tool_item_get_orientation:
734  * @tool_item: a #GtkToolItem 
735  * 
736  * Returns the orientation used for @tool_item. Custom subclasses of
737  * #GtkToolItem should call this function to find out what size icons
738  * they should use.
739  * 
740  * Return value: a #GtkOrientation indicating the orientation
741  * used for @tool_item
742  * 
743  * Since: 2.4
744  **/
745 GtkOrientation
746 gtk_tool_item_get_orientation (GtkToolItem *tool_item)
747 {
748   GtkWidget *parent;
749   
750   g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), GTK_ORIENTATION_HORIZONTAL);
751
752   parent = GTK_WIDGET (tool_item)->parent;
753   if (!parent || !GTK_IS_TOOL_SHELL (parent))
754     return GTK_ORIENTATION_HORIZONTAL;
755
756   return gtk_tool_shell_get_orientation (GTK_TOOL_SHELL (parent));
757 }
758
759 /**
760  * gtk_tool_item_get_toolbar_style:
761  * @tool_item: a #GtkToolItem 
762  * 
763  * Returns the toolbar style used for @tool_item. Custom subclasses of
764  * #GtkToolItem should call this function in the handler of the
765  * GtkToolItem::toolbar_reconfigured signal to find out in what style
766  * the toolbar is displayed and change themselves accordingly 
767  *
768  * Possibilities are:
769  * <itemizedlist>
770  * <listitem> GTK_TOOLBAR_BOTH, meaning the tool item should show
771  * both an icon and a label, stacked vertically </listitem>
772  * <listitem> GTK_TOOLBAR_ICONS, meaning the toolbar shows
773  * only icons </listitem>
774  * <listitem> GTK_TOOLBAR_TEXT, meaning the tool item should only
775  * show text</listitem>
776  * <listitem> GTK_TOOLBAR_BOTH_HORIZ, meaning the tool item should show
777  * both an icon and a label, arranged horizontally (however, note the 
778  * #GtkToolButton::has_text_horizontally that makes tool buttons not
779  * show labels when the toolbar style is GTK_TOOLBAR_BOTH_HORIZ.
780  * </listitem>
781  * </itemizedlist>
782  * 
783  * Return value: A #GtkToolbarStyle indicating the toolbar style used
784  * for @tool_item.
785  * 
786  * Since: 2.4
787  **/
788 GtkToolbarStyle
789 gtk_tool_item_get_toolbar_style (GtkToolItem *tool_item)
790 {
791   GtkWidget *parent;
792   
793   g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), GTK_TOOLBAR_ICONS);
794
795   parent = GTK_WIDGET (tool_item)->parent;
796   if (!parent || !GTK_IS_TOOL_SHELL (parent))
797     return GTK_TOOLBAR_ICONS;
798
799   return gtk_tool_shell_get_style (GTK_TOOL_SHELL (parent));
800 }
801
802 /**
803  * gtk_tool_item_get_relief_style:
804  * @tool_item: a #GtkToolItem 
805  * 
806  * Returns the relief style of @tool_item. See gtk_button_set_relief_style().
807  * Custom subclasses of #GtkToolItem should call this function in the handler
808  * of the #GtkToolItem::toolbar_reconfigured signal to find out the
809  * relief style of buttons.
810  * 
811  * Return value: a #GtkReliefStyle indicating the relief style used
812  * for @tool_item.
813  * 
814  * Since: 2.4
815  **/
816 GtkReliefStyle 
817 gtk_tool_item_get_relief_style (GtkToolItem *tool_item)
818 {
819   GtkWidget *parent;
820   
821   g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), GTK_RELIEF_NONE);
822
823   parent = GTK_WIDGET (tool_item)->parent;
824   if (!parent || !GTK_IS_TOOL_SHELL (parent))
825     return GTK_RELIEF_NONE;
826
827   return gtk_tool_shell_get_relief_style (GTK_TOOL_SHELL (parent));
828 }
829
830 /**
831  * gtk_tool_item_set_expand:
832  * @tool_item: a #GtkToolItem 
833  * @expand: Whether @tool_item is allocated extra space
834  * 
835  * Sets whether @tool_item is allocated extra space when there
836  * is more room on the toolbar then needed for the items. The
837  * effect is that the item gets bigger when the toolbar gets bigger
838  * and smaller when the toolbar gets smaller.
839  * 
840  * Since: 2.4
841  **/
842 void
843 gtk_tool_item_set_expand (GtkToolItem *tool_item,
844                           gboolean     expand)
845 {
846   g_return_if_fail (GTK_IS_TOOL_ITEM (tool_item));
847     
848   expand = expand != FALSE;
849
850   if (tool_item->priv->expand != expand)
851     {
852       tool_item->priv->expand = expand;
853       gtk_widget_child_notify (GTK_WIDGET (tool_item), "expand");
854       gtk_widget_queue_resize (GTK_WIDGET (tool_item));
855     }
856 }
857
858 /**
859  * gtk_tool_item_get_expand:
860  * @tool_item: a #GtkToolItem 
861  * 
862  * Returns whether @tool_item is allocated extra space.
863  * See gtk_tool_item_set_expand().
864  * 
865  * Return value: %TRUE if @tool_item is allocated extra space.
866  * 
867  * Since: 2.4
868  **/
869 gboolean
870 gtk_tool_item_get_expand (GtkToolItem *tool_item)
871 {
872   g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), FALSE);
873
874   return tool_item->priv->expand;
875 }
876
877 /**
878  * gtk_tool_item_set_homogeneous:
879  * @tool_item: a #GtkToolItem 
880  * @homogeneous: whether @tool_item is the same size as other homogeneous items
881  * 
882  * Sets whether @tool_item is to be allocated the same size as other
883  * homogeneous items. The effect is that all homogeneous items will have
884  * the same width as the widest of the items.
885  * 
886  * Since: 2.4
887  **/
888 void
889 gtk_tool_item_set_homogeneous (GtkToolItem *tool_item,
890                                gboolean     homogeneous)
891 {
892   g_return_if_fail (GTK_IS_TOOL_ITEM (tool_item));
893     
894   homogeneous = homogeneous != FALSE;
895
896   if (tool_item->priv->homogeneous != homogeneous)
897     {
898       tool_item->priv->homogeneous = homogeneous;
899       gtk_widget_child_notify (GTK_WIDGET (tool_item), "homogeneous");
900       gtk_widget_queue_resize (GTK_WIDGET (tool_item));
901     }
902 }
903
904 /**
905  * gtk_tool_item_get_homogeneous:
906  * @tool_item: a #GtkToolItem 
907  * 
908  * Returns whether @tool_item is the same size as other homogeneous
909  * items. See gtk_tool_item_set_homogeneous().
910  * 
911  * Return value: %TRUE if the item is the same size as other homogeneous
912  * items.
913  * 
914  * Since: 2.4
915  **/
916 gboolean
917 gtk_tool_item_get_homogeneous (GtkToolItem *tool_item)
918 {
919   g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), FALSE);
920
921   return tool_item->priv->homogeneous;
922 }
923
924 /**
925  * gtk_tool_item_get_is_important:
926  * @tool_item: a #GtkToolItem
927  * 
928  * Returns whether @tool_item is considered important. See
929  * gtk_tool_item_set_is_important()
930  * 
931  * Return value: %TRUE if @tool_item is considered important.
932  * 
933  * Since: 2.4
934  **/
935 gboolean
936 gtk_tool_item_get_is_important (GtkToolItem *tool_item)
937 {
938   g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), FALSE);
939
940   return tool_item->priv->is_important;
941 }
942
943 /**
944  * gtk_tool_item_set_is_important:
945  * @tool_item: a #GtkToolItem
946  * @is_important: whether the tool item should be considered important
947  * 
948  * Sets whether @tool_item should be considered important. The #GtkToolButton
949  * class uses this property to determine whether to show or hide its label
950  * when the toolbar style is %GTK_TOOLBAR_BOTH_HORIZ. The result is that
951  * only tool buttons with the "is_important" property set have labels, an
952  * effect known as "priority text"
953  * 
954  * Since: 2.4
955  **/
956 void
957 gtk_tool_item_set_is_important (GtkToolItem *tool_item, gboolean is_important)
958 {
959   g_return_if_fail (GTK_IS_TOOL_ITEM (tool_item));
960
961   is_important = is_important != FALSE;
962
963   if (is_important != tool_item->priv->is_important)
964     {
965       tool_item->priv->is_important = is_important;
966
967       gtk_widget_queue_resize (GTK_WIDGET (tool_item));
968
969       g_object_notify (G_OBJECT (tool_item), "is-important");
970     }
971 }
972
973 static gboolean
974 gtk_tool_item_real_set_tooltip (GtkToolItem *tool_item,
975                                 GtkTooltips *tooltips,
976                                 const gchar *tip_text,
977                                 const gchar *tip_private)
978 {
979   GtkWidget *child = GTK_BIN (tool_item)->child;
980
981   if (!child)
982     return FALSE;
983
984   gtk_widget_set_tooltip_text (child, tip_text);
985
986   return TRUE;
987 }
988
989 /**
990  * gtk_tool_item_set_tooltip:
991  * @tool_item: a #GtkToolItem 
992  * @tooltips: The #GtkTooltips object to be used
993  * @tip_text: text to be used as tooltip text for @tool_item
994  * @tip_private: text to be used as private tooltip text
995  *
996  * Sets the #GtkTooltips object to be used for @tool_item, the
997  * text to be displayed as tooltip on the item and the private text
998  * to be used. See gtk_tooltips_set_tip().
999  * 
1000  * Since: 2.4
1001  *
1002  * Deprecated: 2.12: Use gtk_tool_item_set_tooltip_text() instead.
1003  **/
1004 void
1005 gtk_tool_item_set_tooltip (GtkToolItem *tool_item,
1006                            GtkTooltips *tooltips,
1007                            const gchar *tip_text,
1008                            const gchar *tip_private)
1009 {
1010   gboolean retval;
1011   
1012   g_return_if_fail (GTK_IS_TOOL_ITEM (tool_item));
1013
1014   g_signal_emit (tool_item, toolitem_signals[SET_TOOLTIP], 0,
1015                  tooltips, tip_text, tip_private, &retval);
1016 }
1017
1018 /**
1019  * gtk_tool_item_set_tooltip_text:
1020  * @tool_item: a #GtkToolItem 
1021  * @text: text to be used as tooltip for @tool_item
1022  *
1023  * Sets the text to be displayed as tooltip on the item.
1024  * See gtk_widget_set_tooltip_text().
1025  *
1026  * Since: 2.12
1027  **/
1028 void
1029 gtk_tool_item_set_tooltip_text (GtkToolItem *tool_item,
1030                                 const gchar *text)
1031 {
1032   GtkWidget *child;
1033
1034   g_return_if_fail (GTK_IS_TOOL_ITEM (tool_item));
1035
1036   child = GTK_BIN (tool_item)->child;
1037
1038   if (child)
1039     gtk_widget_set_tooltip_text (child, text);
1040 }
1041
1042 /**
1043  * gtk_tool_item_set_tooltip_markup:
1044  * @tool_item: a #GtkToolItem 
1045  * @markup: markup text to be used as tooltip for @tool_item
1046  *
1047  * Sets the markup text to be displayed as tooltip on the item.
1048  * See gtk_widget_set_tooltip_markup().
1049  *
1050  * Since: 2.12
1051  **/
1052 void
1053 gtk_tool_item_set_tooltip_markup (GtkToolItem *tool_item,
1054                                   const gchar *markup)
1055 {
1056   GtkWidget *child;
1057
1058   g_return_if_fail (GTK_IS_TOOL_ITEM (tool_item));
1059
1060   child = GTK_BIN (tool_item)->child;
1061
1062   if (child)
1063     gtk_widget_set_tooltip_markup (child, markup);
1064 }
1065
1066 /**
1067  * gtk_tool_item_set_use_drag_window:
1068  * @tool_item: a #GtkToolItem 
1069  * @use_drag_window: Whether @tool_item has a drag window.
1070  * 
1071  * Sets whether @tool_item has a drag window. When %TRUE the
1072  * toolitem can be used as a drag source through gtk_drag_source_set().
1073  * When @tool_item has a drag window it will intercept all events,
1074  * even those that would otherwise be sent to a child of @tool_item.
1075  * 
1076  * Since: 2.4
1077  **/
1078 void
1079 gtk_tool_item_set_use_drag_window (GtkToolItem *toolitem,
1080                                    gboolean     use_drag_window)
1081 {
1082   g_return_if_fail (GTK_IS_TOOL_ITEM (toolitem));
1083
1084   use_drag_window = use_drag_window != FALSE;
1085
1086   if (toolitem->priv->use_drag_window != use_drag_window)
1087     {
1088       toolitem->priv->use_drag_window = use_drag_window;
1089       
1090       if (use_drag_window)
1091         {
1092           if (!toolitem->priv->drag_window && GTK_WIDGET_REALIZED (toolitem))
1093             {
1094               create_drag_window(toolitem);
1095               if (GTK_WIDGET_MAPPED (toolitem))
1096                 gdk_window_show (toolitem->priv->drag_window);
1097             }
1098         }
1099       else
1100         {
1101           destroy_drag_window (toolitem);
1102         }
1103     }
1104 }
1105
1106 /**
1107  * gtk_tool_item_get_use_drag_window:
1108  * @tool_item: a #GtkToolItem 
1109  * 
1110  * Returns whether @tool_item has a drag window. See
1111  * gtk_tool_item_set_use_drag_window().
1112  * 
1113  * Return value: %TRUE if @tool_item uses a drag window.
1114  * 
1115  * Since: 2.4
1116  **/
1117 gboolean
1118 gtk_tool_item_get_use_drag_window (GtkToolItem *toolitem)
1119 {
1120   g_return_val_if_fail (GTK_IS_TOOL_ITEM (toolitem), FALSE);
1121
1122   return toolitem->priv->use_drag_window;
1123 }
1124
1125 /**
1126  * gtk_tool_item_set_visible_horizontal:
1127  * @tool_item: a #GtkToolItem
1128  * @visible_horizontal: Whether @tool_item is visible when in horizontal mode
1129  * 
1130  * Sets whether @tool_item is visible when the toolbar is docked horizontally.
1131  * 
1132  * Since: 2.4
1133  **/
1134 void
1135 gtk_tool_item_set_visible_horizontal (GtkToolItem *toolitem,
1136                                       gboolean     visible_horizontal)
1137 {
1138   g_return_if_fail (GTK_IS_TOOL_ITEM (toolitem));
1139
1140   visible_horizontal = visible_horizontal != FALSE;
1141
1142   if (toolitem->priv->visible_horizontal != visible_horizontal)
1143     {
1144       toolitem->priv->visible_horizontal = visible_horizontal;
1145
1146       g_object_notify (G_OBJECT (toolitem), "visible-horizontal");
1147
1148       gtk_widget_queue_resize (GTK_WIDGET (toolitem));
1149     }
1150 }
1151
1152 /**
1153  * gtk_tool_item_get_visible_horizontal:
1154  * @tool_item: a #GtkToolItem 
1155  * 
1156  * Returns whether the @tool_item is visible on toolbars that are
1157  * docked horizontally.
1158  * 
1159  * Return value: %TRUE if @tool_item is visible on toolbars that are
1160  * docked horizontally.
1161  * 
1162  * Since: 2.4
1163  **/
1164 gboolean
1165 gtk_tool_item_get_visible_horizontal (GtkToolItem *toolitem)
1166 {
1167   g_return_val_if_fail (GTK_IS_TOOL_ITEM (toolitem), FALSE);
1168
1169   return toolitem->priv->visible_horizontal;
1170 }
1171
1172 /**
1173  * gtk_tool_item_set_visible_vertical:
1174  * @tool_item: a #GtkToolItem 
1175  * @visible_vertical: whether @tool_item is visible when the toolbar
1176  * is in vertical mode
1177  *
1178  * Sets whether @tool_item is visible when the toolbar is docked
1179  * vertically. Some tool items, such as text entries, are too wide to be
1180  * useful on a vertically docked toolbar. If @visible_vertical is %FALSE
1181  * @tool_item will not appear on toolbars that are docked vertically.
1182  * 
1183  * Since: 2.4
1184  **/
1185 void
1186 gtk_tool_item_set_visible_vertical (GtkToolItem *toolitem,
1187                                     gboolean     visible_vertical)
1188 {
1189   g_return_if_fail (GTK_IS_TOOL_ITEM (toolitem));
1190
1191   visible_vertical = visible_vertical != FALSE;
1192
1193   if (toolitem->priv->visible_vertical != visible_vertical)
1194     {
1195       toolitem->priv->visible_vertical = visible_vertical;
1196
1197       g_object_notify (G_OBJECT (toolitem), "visible-vertical");
1198
1199       gtk_widget_queue_resize (GTK_WIDGET (toolitem));
1200     }
1201 }
1202
1203 /**
1204  * gtk_tool_item_get_visible_vertical:
1205  * @tool_item: a #GtkToolItem 
1206  * 
1207  * Returns whether @tool_item is visible when the toolbar is docked vertically.
1208  * See gtk_tool_item_set_visible_vertical().
1209  * 
1210  * Return value: Whether @tool_item is visible when the toolbar is docked vertically
1211  * 
1212  * Since: 2.4
1213  **/
1214 gboolean
1215 gtk_tool_item_get_visible_vertical (GtkToolItem *toolitem)
1216 {
1217   g_return_val_if_fail (GTK_IS_TOOL_ITEM (toolitem), FALSE);
1218
1219   return toolitem->priv->visible_vertical;
1220 }
1221
1222 /**
1223  * gtk_tool_item_retrieve_proxy_menu_item:
1224  * @tool_item: a #GtkToolItem 
1225  * 
1226  * Returns the #GtkMenuItem that was last set by
1227  * gtk_tool_item_set_proxy_menu_item(), ie. the #GtkMenuItem
1228  * that is going to appear in the overflow menu.
1229  * 
1230  * Return value: The #GtkMenuItem that is going to appear in the
1231  * overflow menu for @tool_item.
1232  * 
1233  * Since: 2.4
1234  **/
1235 GtkWidget *
1236 gtk_tool_item_retrieve_proxy_menu_item (GtkToolItem *tool_item)
1237 {
1238   gboolean retval;
1239   
1240   g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), NULL);
1241
1242   g_signal_emit (tool_item, toolitem_signals[CREATE_MENU_PROXY], 0,
1243                  &retval);
1244   
1245   return tool_item->priv->menu_item;
1246 }
1247
1248 /**
1249  * gtk_tool_item_get_proxy_menu_item:
1250  * @tool_item: a #GtkToolItem 
1251  * @menu_item_id: a string used to identify the menu item
1252  * 
1253  * If @menu_item_id matches the string passed to
1254  * gtk_tool_item_set_proxy_menu_item() return the corresponding #GtkMenuItem.
1255  *
1256  * Custom subclasses of #GtkToolItem should use this function to update
1257  * their menu item when the #GtkToolItem changes. That the
1258  * @menu_item_id<!-- -->s must match ensures that a #GtkToolItem will not
1259  * inadvertently change a menu item that they did not create.
1260  * 
1261  * Return value: The #GtkMenuItem passed to
1262  * gtk_tool_item_set_proxy_menu_item(), if the @menu_item_id<!-- -->s match.
1263  * 
1264  * Since: 2.4
1265  **/
1266 GtkWidget *
1267 gtk_tool_item_get_proxy_menu_item (GtkToolItem *tool_item,
1268                                    const gchar *menu_item_id)
1269 {
1270   g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), NULL);
1271   g_return_val_if_fail (menu_item_id != NULL, NULL);
1272
1273   if (tool_item->priv->menu_item_id && strcmp (tool_item->priv->menu_item_id, menu_item_id) == 0)
1274     return tool_item->priv->menu_item;
1275
1276   return NULL;
1277 }
1278
1279 /**
1280  * gtk_tool_item_rebuild_menu()
1281  * @tool_item: a #GtkToolItem
1282  * 
1283  * Calling this function signals to the toolbar that the
1284  * overflow menu item for @tool_item has changed. If the
1285  * overflow menu is visible when this function it called,
1286  * the menu will be rebuilt.
1287  *
1288  * The function must be called when the tool item
1289  * changes what it will do in response to the "create_menu_proxy"
1290  * signal.
1291  * 
1292  * Since: 2.6
1293  **/
1294 void
1295 gtk_tool_item_rebuild_menu (GtkToolItem *tool_item)
1296 {
1297   GtkWidget *widget;
1298   
1299   g_return_if_fail (GTK_IS_TOOL_ITEM (tool_item));
1300
1301   widget = GTK_WIDGET (tool_item);
1302
1303   if (GTK_IS_TOOL_SHELL (widget->parent))
1304     gtk_tool_shell_rebuild_menu (GTK_TOOL_SHELL (widget->parent));
1305 }
1306
1307 /**
1308  * gtk_tool_item_set_proxy_menu_item:
1309  * @tool_item: a #GtkToolItem
1310  * @menu_item_id: a string used to identify @menu_item
1311  * @menu_item: a #GtkMenuItem to be used in the overflow menu
1312  * 
1313  * Sets the #GtkMenuItem used in the toolbar overflow menu. The
1314  * @menu_item_id is used to identify the caller of this function and
1315  * should also be used with gtk_tool_item_get_proxy_menu_item().
1316  * 
1317  * Since: 2.4
1318  **/
1319 void
1320 gtk_tool_item_set_proxy_menu_item (GtkToolItem *tool_item,
1321                                    const gchar *menu_item_id,
1322                                    GtkWidget   *menu_item)
1323 {
1324   g_return_if_fail (GTK_IS_TOOL_ITEM (tool_item));
1325   g_return_if_fail (menu_item == NULL || GTK_IS_MENU_ITEM (menu_item));
1326   g_return_if_fail (menu_item_id != NULL);
1327
1328   g_free (tool_item->priv->menu_item_id);
1329       
1330   tool_item->priv->menu_item_id = g_strdup (menu_item_id);
1331
1332   if (tool_item->priv->menu_item != menu_item)
1333     {
1334       if (tool_item->priv->menu_item)
1335         g_object_unref (tool_item->priv->menu_item);
1336       
1337       if (menu_item)
1338         {
1339           g_object_ref_sink (menu_item);
1340
1341           gtk_widget_set_sensitive (menu_item,
1342                                     GTK_WIDGET_SENSITIVE (tool_item));
1343         }
1344       
1345       tool_item->priv->menu_item = menu_item;
1346     }
1347 }
1348
1349 /**
1350  * gtk_tool_item_toolbar_reconfigured:
1351  * @tool_item: a #GtkToolItem
1352  *
1353  * Emits the signal #GtkToolItem::toolbar_reconfigured on @tool_item.
1354  * #GtkToolbar and other #GtkToolShell implementations use this function
1355  * to notify children, when some aspect of their configuration changes.
1356  *
1357  * Since: 2.14
1358  **/
1359 void
1360 gtk_tool_item_toolbar_reconfigured (GtkToolItem *tool_item)
1361 {
1362   /* The slightely inaccurate name "gtk_tool_item_toolbar_reconfigured" was
1363    * choosen over "gtk_tool_item_tool_shell_reconfigured", since the function
1364    * emits the "toolbar-reconfigured" signal, not "tool-shell-reconfigured".
1365    * Its not possible to rename the signal, and emitting another name than
1366    * indicated by the function name would be quite confusing. That's the
1367    * price of providing stable APIs.
1368    */
1369   g_return_if_fail (GTK_IS_TOOL_ITEM (tool_item));
1370
1371   g_signal_emit (tool_item, toolitem_signals[TOOLBAR_RECONFIGURED], 0);
1372   
1373   if (tool_item->priv->drag_window)
1374     gdk_window_raise (tool_item->priv->drag_window);
1375
1376   gtk_widget_queue_resize (GTK_WIDGET (tool_item));
1377 }
1378
1379 #define __GTK_TOOL_ITEM_C__
1380 #include "gtkaliasdef.c"