-gboolean _gtk_menu_is_empty (GtkWidget *menu);
-
-static gboolean
-gtk_action_create_menu_proxy (GtkToolItem *tool_item,
- GtkAction *action)
-{
- GtkWidget *menu_item;
-
- if (action->private_data->visible_overflown)
- {
- menu_item = gtk_action_create_menu_item (action);
-
- g_object_ref_sink (menu_item);
-
- gtk_tool_item_set_proxy_menu_item (tool_item,
- "gtk-action-menu-item", menu_item);
- g_object_unref (menu_item);
- }
- else
- gtk_tool_item_set_proxy_menu_item (tool_item,
- "gtk-action-menu-item", NULL);
-
- return TRUE;
-}
-
-static void
-connect_proxy (GtkAction *action,
- GtkWidget *proxy)
-{
- g_object_ref (action);
- g_object_set_qdata_full (G_OBJECT (proxy), quark_gtk_action_proxy, action,
- g_object_unref);
-
- /* add this widget to the list of proxies */
- action->private_data->proxies = g_slist_prepend (action->private_data->proxies, proxy);
- g_object_weak_ref (G_OBJECT (proxy), (GWeakNotify)remove_proxy, action);
-
- gtk_widget_set_sensitive (proxy, gtk_action_is_sensitive (action));
- if (gtk_action_is_visible (action))
- gtk_widget_show (proxy);
- else
- gtk_widget_hide (proxy);
- gtk_widget_set_no_show_all (proxy, TRUE);
-
- if (GTK_IS_MENU_ITEM (proxy))
- {
- GtkWidget *label;
- /* menu item specific synchronisers ... */
-
- if (action->private_data->accel_quark)
- {
- gtk_action_connect_accelerator (action);
- gtk_menu_item_set_accel_path (GTK_MENU_ITEM (proxy),
- g_quark_to_string (action->private_data->accel_quark));
- }
-
- label = GTK_BIN (proxy)->child;
-
- /* make sure label is a label */
- if (label && !GTK_IS_LABEL (label))
- {
- gtk_container_remove (GTK_CONTAINER (proxy), label);
- label = NULL;
- }
-
- if (!label)
- label = g_object_new (GTK_TYPE_ACCEL_LABEL,
- "use-underline", TRUE,
- "xalign", 0.0,
- "visible", TRUE,
- "parent", proxy,
- NULL);
-
- if (GTK_IS_ACCEL_LABEL (label) && action->private_data->accel_quark)
- g_object_set (label,
- "accel-closure", action->private_data->accel_closure,
- NULL);
-
- gtk_label_set_label (GTK_LABEL (label), action->private_data->label);
-
- if (GTK_IS_IMAGE_MENU_ITEM (proxy))
- {
- GtkWidget *image;
-
- image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (proxy));
- if (image && !GTK_IS_IMAGE (image))
- {
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (proxy), NULL);
- image = NULL;
- }
- if (!image)
- {
- image = gtk_image_new ();
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (proxy),
- image);
- gtk_widget_show (image);
- }
-
- if (action->private_data->stock_id &&
- gtk_icon_factory_lookup_default (action->private_data->stock_id))
- gtk_image_set_from_stock (GTK_IMAGE (image),
- action->private_data->stock_id, GTK_ICON_SIZE_MENU);
- else if (action->private_data->icon_name)
- gtk_image_set_from_icon_name (GTK_IMAGE (image),
- action->private_data->icon_name, GTK_ICON_SIZE_MENU);
- }
-
- if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy)) == NULL)
- g_signal_connect_object (proxy, "activate",
- G_CALLBACK (gtk_action_activate), action,
- G_CONNECT_SWAPPED);
-
- }
- else if (GTK_IS_TOOL_ITEM (proxy))
- {
- /* toolbar button specific synchronisers ... */
- if (GTK_IS_TOOL_BUTTON (proxy))
- {
- g_object_set (proxy,
- "visible-horizontal", action->private_data->visible_horizontal,
- "visible-vertical", action->private_data->visible_vertical,
- "is-important", action->private_data->is_important,
- "label", action->private_data->short_label,
- "use-underline", TRUE,
- "stock-id", action->private_data->stock_id,
- "icon-name", action->private_data->icon_name,
- NULL);
-
- g_signal_connect_object (proxy, "clicked",
- G_CALLBACK (gtk_action_activate), action,
- G_CONNECT_SWAPPED);
- }
- else
- {
- g_object_set (proxy,
- "visible-horizontal", action->private_data->visible_horizontal,
- "visible-vertical", action->private_data->visible_vertical,
- "is-important", action->private_data->is_important,
- NULL);
- }
-
- gtk_action_sync_tooltip (action, proxy);
-
- g_signal_connect_object (proxy, "create_menu_proxy",
- G_CALLBACK (gtk_action_create_menu_proxy),
- action, 0);
-
- gtk_tool_item_rebuild_menu (GTK_TOOL_ITEM (proxy));
- }
- else if (GTK_IS_BUTTON (proxy))
- {
- /* button specific synchronisers ... */
- if (gtk_button_get_use_stock (GTK_BUTTON (proxy)))
- {
- /* synchronise stock-id */
- g_object_set (proxy,
- "label", action->private_data->stock_id,
- NULL);
- }
- else
- {
- if (GTK_BIN (proxy)->child == NULL ||
- GTK_IS_LABEL (GTK_BIN (proxy)->child))
- {
- /* synchronise the label */
- g_object_set (proxy,
- "label", action->private_data->short_label,
- "use-underline", TRUE,
- NULL);
- }
- }
- /* we leave the button alone if there is a custom child */
- g_signal_connect_object (proxy, "clicked",
- G_CALLBACK (gtk_action_activate), action,
- G_CONNECT_SWAPPED);
- }
-
- if (action->private_data->action_group)
- _gtk_action_group_emit_connect_proxy (action->private_data->action_group, action, proxy);
-}
-
-static void
-disconnect_proxy (GtkAction *action,
- GtkWidget *proxy)
-{
- g_object_set_qdata (G_OBJECT (proxy), quark_gtk_action_proxy, NULL);
-
- g_object_weak_unref (G_OBJECT (proxy), (GWeakNotify)remove_proxy, action);
- remove_proxy (action, proxy);
-
- /* disconnect the activate handler */
- g_signal_handlers_disconnect_by_func (proxy,
- G_CALLBACK (gtk_action_activate),
- action);
-
- /* toolbar button specific synchronisers ... */
- g_signal_handlers_disconnect_by_func (proxy,
- G_CALLBACK (gtk_action_create_menu_proxy),
- action);
-
- if (action->private_data->action_group)
- _gtk_action_group_emit_disconnect_proxy (action->private_data->action_group, action, proxy);
-}
-