X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktoolbutton.c;h=cf8a22dfa5e7be3776ea7b7cdf6bdbd0665e2eef;hb=HEAD;hp=a38da3ab3149dedf6e15f4b303f4d5a012461e57;hpb=e7355f82c2409f545210a8738bab262548f75e69;p=~andy%2Fgtk diff --git a/gtk/gtktoolbutton.c b/gtk/gtktoolbutton.c index a38da3ab3..cf8a22dfa 100644 --- a/gtk/gtktoolbutton.c +++ b/gtk/gtktoolbutton.c @@ -15,28 +15,57 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ -#include +#include "config.h" #include "gtktoolbutton.h" #include "gtkbutton.h" -#include "gtkhbox.h" #include "gtkiconfactory.h" #include "gtkimage.h" #include "gtkimagemenuitem.h" #include "gtklabel.h" #include "gtkstock.h" -#include "gtkvbox.h" +#include "gtkbox.h" #include "gtkintl.h" #include "gtktoolbar.h" +#include "gtkactivatable.h" +#include "gtkactionable.h" #include "gtkprivate.h" -#include "gtkalias.h" #include + +/** + * SECTION:gtktoolbutton + * @Short_description: A GtkToolItem subclass that displays buttons + * @Title: GtkToolButton + * @See_also: #GtkToolbar, #GtkMenuToolButton, #GtkToggleToolButton, + * #GtkRadioToolButton, #GtkSeparatorToolItem + * + * #GtkToolButtons are #GtkToolItems containing buttons. + * + * Use gtk_tool_button_new() to create a new #GtkToolButton. Use + * gtk_tool_button_new_from_stock() to create a #GtkToolButton + * containing a stock item. + * + * The label of a #GtkToolButton is determined by the properties + * #GtkToolButton:label-widget, #GtkToolButton:label, and + * #GtkToolButton:stock-id. If #GtkToolButton:label-widget is + * non-%NULL, then that widget is used as the label. Otherwise, if + * #GtkToolButton:label is non-%NULL, that string is used as the label. + * Otherwise, if #GtkToolButton:stock-id is non-%NULL, the label is + * determined by the stock item. Otherwise, the button does not have a label. + * + * The icon of a #GtkToolButton is determined by the properties + * #GtkToolButton:icon-widget and #GtkToolButton:stock-id. If + * #GtkToolButton:icon-widget is non-%NULL, then + * that widget is used as the icon. Otherwise, if #GtkToolButton:stock-id is + * non-%NULL, the icon is determined by the stock item. Otherwise, + * the button does not have a icon. + */ + + #define MENU_ID "gtk-tool-button-menu-id" enum { @@ -51,7 +80,9 @@ enum { PROP_LABEL_WIDGET, PROP_STOCK_ID, PROP_ICON_NAME, - PROP_ICON_WIDGET + PROP_ICON_WIDGET, + PROP_ACTION_NAME, + PROP_ACTION_TARGET }; static void gtk_tool_button_init (GtkToolButton *button, @@ -73,15 +104,18 @@ static void gtk_tool_button_toolbar_reconfigured (GtkToolItem *tool_item); static gboolean gtk_tool_button_create_menu_proxy (GtkToolItem *item); static void button_clicked (GtkWidget *widget, GtkToolButton *button); -static void gtk_tool_button_style_set (GtkWidget *widget, - GtkStyle *prev_style); +static void gtk_tool_button_style_updated (GtkWidget *widget); static void gtk_tool_button_construct_contents (GtkToolItem *tool_item); - -static GObjectClass *parent_class = NULL; -static guint toolbutton_signals[LAST_SIGNAL] = { 0 }; -#define GTK_TOOL_BUTTON_GET_PRIVATE(obj)(G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_TOOL_BUTTON, GtkToolButtonPrivate)) +static void gtk_tool_button_actionable_iface_init (GtkActionableInterface *iface); +static void gtk_tool_button_activatable_interface_init (GtkActivatableIface *iface); +static void gtk_tool_button_update (GtkActivatable *activatable, + GtkAction *action, + const gchar *property_name); +static void gtk_tool_button_sync_action_properties (GtkActivatable *activatable, + GtkAction *action); + struct _GtkToolButtonPrivate { @@ -92,24 +126,49 @@ struct _GtkToolButtonPrivate gchar *label_text; GtkWidget *label_widget; GtkWidget *icon_widget; - + + GtkSizeGroup *text_size_group; + guint use_underline : 1; guint contents_invalid : 1; }; +static GObjectClass *parent_class = NULL; +static GtkActivatableIface *parent_activatable_iface; +static guint toolbutton_signals[LAST_SIGNAL] = { 0 }; + GType gtk_tool_button_get_type (void) { - static GtkType type = 0; - + static GType type = 0; + if (!type) - type = g_type_register_static_simple (GTK_TYPE_TOOL_ITEM, - I_("GtkToolButton"), - sizeof (GtkToolButtonClass), - (GClassInitFunc) gtk_tool_button_class_init, - sizeof (GtkToolButton), - (GInstanceInitFunc) gtk_tool_button_init, - 0); + { + const GInterfaceInfo actionable_info = + { + (GInterfaceInitFunc) gtk_tool_button_actionable_iface_init, + (GInterfaceFinalizeFunc) NULL, + NULL + }; + const GInterfaceInfo activatable_info = + { + (GInterfaceInitFunc) gtk_tool_button_activatable_interface_init, + (GInterfaceFinalizeFunc) NULL, + NULL + }; + + type = g_type_register_static_simple (GTK_TYPE_TOOL_ITEM, + I_("GtkToolButton"), + sizeof (GtkToolButtonClass), + (GClassInitFunc) gtk_tool_button_class_init, + sizeof (GtkToolButton), + (GInstanceInitFunc) gtk_tool_button_init, + 0); + + g_type_add_interface_static (type, GTK_TYPE_ACTIONABLE, &actionable_info); + g_type_add_interface_static (type, GTK_TYPE_ACTIVATABLE, + &activatable_info); + } return type; } @@ -131,7 +190,7 @@ gtk_tool_button_class_init (GtkToolButtonClass *klass) object_class->notify = gtk_tool_button_property_notify; object_class->finalize = gtk_tool_button_finalize; - widget_class->style_set = gtk_tool_button_style_set; + widget_class->style_updated = gtk_tool_button_style_updated; tool_item_class->create_menu_proxy = gtk_tool_button_create_menu_proxy; tool_item_class->toolbar_reconfigured = gtk_tool_button_toolbar_reconfigured; @@ -227,6 +286,9 @@ gtk_tool_button_class_init (GtkToolButtonClass *klass) GTK_TYPE_WIDGET, GTK_PARAM_READWRITE)); + g_object_class_override_property (object_class, PROP_ACTION_NAME, "action-name"); + g_object_class_override_property (object_class, PROP_ACTION_TARGET, "action-target"); + /** * GtkButton:icon-spacing: * @@ -240,7 +302,7 @@ gtk_tool_button_class_init (GtkToolButtonClass *klass) P_("Spacing in pixels between the icon and label"), 0, G_MAXINT, - 0, + 3, GTK_PARAM_READWRITE)); /** @@ -267,8 +329,10 @@ gtk_tool_button_init (GtkToolButton *button, GtkToolButtonClass *klass) { GtkToolItem *toolitem = GTK_TOOL_ITEM (button); - - button->priv = GTK_TOOL_BUTTON_GET_PRIVATE (button); + + button->priv = G_TYPE_INSTANCE_GET_PRIVATE (button, + GTK_TYPE_TOOL_BUTTON, + GtkToolButtonPrivate); button->priv->contents_invalid = TRUE; @@ -288,6 +352,7 @@ static void gtk_tool_button_construct_contents (GtkToolItem *tool_item) { GtkToolButton *button = GTK_TOOL_BUTTON (tool_item); + GtkWidget *child; GtkWidget *label = NULL; GtkWidget *icon = NULL; GtkToolbarStyle style; @@ -296,6 +361,9 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item) GtkIconSize icon_size; GtkWidget *box = NULL; guint icon_spacing; + GtkOrientation text_orientation = GTK_ORIENTATION_HORIZONTAL; + GtkSizeGroup *size_group = NULL; + GtkWidget *parent; button->priv->contents_invalid = FALSE; @@ -303,24 +371,33 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item) "icon-spacing", &icon_spacing, NULL); - if (button->priv->icon_widget && button->priv->icon_widget->parent) + if (button->priv->icon_widget) { - gtk_container_remove (GTK_CONTAINER (button->priv->icon_widget->parent), - button->priv->icon_widget); + parent = gtk_widget_get_parent (button->priv->icon_widget); + if (parent) + { + gtk_container_remove (GTK_CONTAINER (parent), + button->priv->icon_widget); + } } - if (button->priv->label_widget && button->priv->label_widget->parent) + if (button->priv->label_widget) { - gtk_container_remove (GTK_CONTAINER (button->priv->label_widget->parent), - button->priv->label_widget); + parent = gtk_widget_get_parent (button->priv->label_widget); + if (parent) + { + gtk_container_remove (GTK_CONTAINER (parent), + button->priv->label_widget); + } } - if (GTK_BIN (button->priv->button)->child) + child = gtk_bin_get_child (GTK_BIN (button->priv->button)); + if (child) { /* Note: we are not destroying the label_widget or icon_widget * here because they were removed from their containers above */ - gtk_widget_destroy (GTK_BIN (button->priv->button)->child); + gtk_widget_destroy (child); } style = gtk_tool_item_get_toolbar_style (GTK_TOOL_ITEM (button)); @@ -333,7 +410,8 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item) if (style == GTK_TOOLBAR_BOTH_HORIZ && (gtk_tool_item_get_is_important (GTK_TOOL_ITEM (button)) || - gtk_tool_item_get_orientation (GTK_TOOL_ITEM (button)) == GTK_ORIENTATION_VERTICAL)) + gtk_tool_item_get_orientation (GTK_TOOL_ITEM (button)) == GTK_ORIENTATION_VERTICAL || + gtk_tool_item_get_text_orientation (GTK_TOOL_ITEM (button)) == GTK_ORIENTATION_VERTICAL)) { need_label = TRUE; } @@ -393,6 +471,31 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item) gtk_widget_show (label); } + + if (GTK_IS_LABEL (label)) + { + gtk_label_set_ellipsize (GTK_LABEL (label), + gtk_tool_item_get_ellipsize_mode (GTK_TOOL_ITEM (button))); + text_orientation = gtk_tool_item_get_text_orientation (GTK_TOOL_ITEM (button)); + if (text_orientation == GTK_ORIENTATION_HORIZONTAL) + { + gtk_label_set_angle (GTK_LABEL (label), 0); + gtk_misc_set_alignment (GTK_MISC (label), + gtk_tool_item_get_text_alignment (GTK_TOOL_ITEM (button)), + 0.5); + } + else + { + gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_NONE); + if (gtk_widget_get_direction (GTK_WIDGET (tool_item)) == GTK_TEXT_DIR_RTL) + gtk_label_set_angle (GTK_LABEL (label), -90); + else + gtk_label_set_angle (GTK_LABEL (label), 90); + gtk_misc_set_alignment (GTK_MISC (label), + 0.5, + 1 - gtk_tool_item_get_text_alignment (GTK_TOOL_ITEM (button))); + } + } } icon_size = gtk_tool_item_get_icon_size (GTK_TOOL_ITEM (button)); @@ -420,6 +523,22 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item) icon = gtk_image_new_from_icon_name (button->priv->icon_name, icon_size); gtk_widget_show (icon); } + + if (GTK_IS_MISC (icon) && text_orientation == GTK_ORIENTATION_HORIZONTAL) + gtk_misc_set_alignment (GTK_MISC (icon), + 1.0 - gtk_tool_item_get_text_alignment (GTK_TOOL_ITEM (button)), + 0.5); + else if (GTK_IS_MISC (icon)) + gtk_misc_set_alignment (GTK_MISC (icon), + 0.5, + gtk_tool_item_get_text_alignment (GTK_TOOL_ITEM (button))); + + if (icon) + { + size_group = gtk_tool_item_get_text_size_group (GTK_TOOL_ITEM (button)); + if (size_group != NULL) + gtk_size_group_add_widget (size_group, icon); + } } switch (style) @@ -430,19 +549,33 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item) break; case GTK_TOOLBAR_BOTH: - box = gtk_vbox_new (FALSE, icon_spacing); + if (text_orientation == GTK_ORIENTATION_HORIZONTAL) + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, icon_spacing); + else + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, icon_spacing); if (icon) gtk_box_pack_start (GTK_BOX (box), icon, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0); + gtk_box_pack_end (GTK_BOX (box), label, FALSE, TRUE, 0); gtk_container_add (GTK_CONTAINER (button->priv->button), box); break; case GTK_TOOLBAR_BOTH_HORIZ: - box = gtk_hbox_new (FALSE, icon_spacing); - if (icon) - gtk_box_pack_start (GTK_BOX (box), icon, label? FALSE : TRUE, TRUE, 0); - if (label) - gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0); + if (text_orientation == GTK_ORIENTATION_HORIZONTAL) + { + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, icon_spacing); + if (icon) + gtk_box_pack_start (GTK_BOX (box), icon, label? FALSE : TRUE, TRUE, 0); + if (label) + gtk_box_pack_end (GTK_BOX (box), label, TRUE, TRUE, 0); + } + else + { + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, icon_spacing); + if (icon) + gtk_box_pack_end (GTK_BOX (box), icon, label ? FALSE : TRUE, TRUE, 0); + if (label) + gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0); + } gtk_container_add (GTK_CONTAINER (button->priv->button), box); break; @@ -490,6 +623,12 @@ gtk_tool_button_set_property (GObject *object, case PROP_ICON_WIDGET: gtk_tool_button_set_icon_widget (button, g_value_get_object (value)); break; + case PROP_ACTION_NAME: + g_object_set_property (G_OBJECT (button->priv->button), "action-name", value); + break; + case PROP_ACTION_TARGET: + g_object_set_property (G_OBJECT (button->priv->button), "action-target", value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -538,12 +677,61 @@ gtk_tool_button_get_property (GObject *object, case PROP_ICON_WIDGET: g_value_set_object (value, button->priv->icon_widget); break; + case PROP_ACTION_NAME: + g_object_get_property (G_OBJECT (button->priv->button), "action-name", value); + break; + case PROP_ACTION_TARGET: + g_object_get_property (G_OBJECT (button->priv->button), "action-target", value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } +static const gchar * +gtk_tool_button_get_action_name (GtkActionable *actionable) +{ + GtkToolButton *button = GTK_TOOL_BUTTON (actionable); + + return gtk_actionable_get_action_name (GTK_ACTIONABLE (button->priv->button)); +} + +static void +gtk_tool_button_set_action_name (GtkActionable *actionable, + const gchar *action_name) +{ + GtkToolButton *button = GTK_TOOL_BUTTON (actionable); + + gtk_actionable_set_action_name (GTK_ACTIONABLE (button->priv->button), action_name); +} + +static GVariant * +gtk_tool_button_get_action_target_value (GtkActionable *actionable) +{ + GtkToolButton *button = GTK_TOOL_BUTTON (actionable); + + return gtk_actionable_get_action_target_value (GTK_ACTIONABLE (button->priv->button)); +} + +static void +gtk_tool_button_set_action_target_value (GtkActionable *actionable, + GVariant *action_target) +{ + GtkToolButton *button = GTK_TOOL_BUTTON (actionable); + + gtk_actionable_set_action_target_value (GTK_ACTIONABLE (button->priv->button), action_target); +} + +static void +gtk_tool_button_actionable_iface_init (GtkActionableInterface *iface) +{ + iface->get_action_name = gtk_tool_button_get_action_name; + iface->set_action_name = gtk_tool_button_set_action_name; + iface->get_action_target_value = gtk_tool_button_get_action_target_value; + iface->set_action_target_value = gtk_tool_button_set_action_target_value; +} + static void gtk_tool_button_finalize (GObject *object) { @@ -573,12 +761,24 @@ clone_image_menu_size (GtkImage *image, GtkSettings *settings) gtk_image_get_stock (image, &stock_id, NULL); return gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU); } + else if (storage_type == GTK_IMAGE_ICON_NAME) + { + const gchar *icon_name; + gtk_image_get_icon_name (image, &icon_name, NULL); + return gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU); + } else if (storage_type == GTK_IMAGE_ICON_SET) { GtkIconSet *icon_set; gtk_image_get_icon_set (image, &icon_set, NULL); return gtk_image_new_from_icon_set (icon_set, GTK_ICON_SIZE_MENU); } + else if (storage_type == GTK_IMAGE_GICON) + { + GIcon *icon; + gtk_image_get_gicon (image, &icon, NULL); + return gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_MENU); + } else if (storage_type == GTK_IMAGE_PIXBUF) { gint width, height; @@ -614,6 +814,9 @@ gtk_tool_button_create_menu_proxy (GtkToolItem *item) gboolean use_mnemonic = TRUE; const char *label; + if (_gtk_tool_item_create_menu_proxy (item)) + return TRUE; + if (GTK_IS_LABEL (button->priv->label_widget)) { label = gtk_label_get_label (GTK_LABEL (button->priv->label_widget)); @@ -666,6 +869,13 @@ static void button_clicked (GtkWidget *widget, GtkToolButton *button) { + GtkAction *action; + + action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (button)); + + if (action) + gtk_action_activate (action); + g_signal_emit_by_name (button, "clicked"); } @@ -681,7 +891,7 @@ gtk_tool_button_update_icon_spacing (GtkToolButton *button) GtkWidget *box; guint spacing; - box = GTK_BIN (button->priv->button)->child; + box = gtk_bin_get_child (GTK_BIN (button->priv->button)); if (GTK_IS_BOX (box)) { gtk_widget_style_get (GTK_WIDGET (button), @@ -692,12 +902,111 @@ gtk_tool_button_update_icon_spacing (GtkToolButton *button) } static void -gtk_tool_button_style_set (GtkWidget *widget, - GtkStyle *prev_style) +gtk_tool_button_style_updated (GtkWidget *widget) { + GTK_WIDGET_CLASS (parent_class)->style_updated (widget); + gtk_tool_button_update_icon_spacing (GTK_TOOL_BUTTON (widget)); } +static void +gtk_tool_button_activatable_interface_init (GtkActivatableIface *iface) +{ + parent_activatable_iface = g_type_interface_peek_parent (iface); + iface->update = gtk_tool_button_update; + iface->sync_action_properties = gtk_tool_button_sync_action_properties; +} + +static void +gtk_tool_button_update (GtkActivatable *activatable, + GtkAction *action, + const gchar *property_name) +{ + GtkToolButton *button; + GtkWidget *image; + + parent_activatable_iface->update (activatable, action, property_name); + + if (!gtk_activatable_get_use_action_appearance (activatable)) + return; + + button = GTK_TOOL_BUTTON (activatable); + + if (strcmp (property_name, "short-label") == 0) + gtk_tool_button_set_label (button, gtk_action_get_short_label (action)); + else if (strcmp (property_name, "stock-id") == 0) + gtk_tool_button_set_stock_id (button, gtk_action_get_stock_id (action)); + else if (strcmp (property_name, "gicon") == 0) + { + const gchar *stock_id = gtk_action_get_stock_id (action); + GIcon *icon = gtk_action_get_gicon (action); + GtkIconSize icon_size = GTK_ICON_SIZE_BUTTON; + + if ((stock_id && gtk_icon_factory_lookup_default (stock_id)) || !icon) + image = NULL; + else + { + image = gtk_tool_button_get_icon_widget (button); + icon_size = gtk_tool_item_get_icon_size (GTK_TOOL_ITEM (button)); + + if (!image) + image = gtk_image_new (); + } + + gtk_tool_button_set_icon_widget (button, image); + gtk_image_set_from_gicon (GTK_IMAGE (image), icon, icon_size); + + } + else if (strcmp (property_name, "icon-name") == 0) + gtk_tool_button_set_icon_name (button, gtk_action_get_icon_name (action)); +} + +static void +gtk_tool_button_sync_action_properties (GtkActivatable *activatable, + GtkAction *action) +{ + GtkToolButton *button; + GIcon *icon; + const gchar *stock_id; + + parent_activatable_iface->sync_action_properties (activatable, action); + + if (!action) + return; + + if (!gtk_activatable_get_use_action_appearance (activatable)) + return; + + button = GTK_TOOL_BUTTON (activatable); + stock_id = gtk_action_get_stock_id (action); + + gtk_tool_button_set_label (button, gtk_action_get_short_label (action)); + gtk_tool_button_set_use_underline (button, TRUE); + gtk_tool_button_set_stock_id (button, stock_id); + gtk_tool_button_set_icon_name (button, gtk_action_get_icon_name (action)); + + if (stock_id && gtk_icon_factory_lookup_default (stock_id)) + gtk_tool_button_set_icon_widget (button, NULL); + else if ((icon = gtk_action_get_gicon (action)) != NULL) + { + GtkIconSize icon_size = gtk_tool_item_get_icon_size (GTK_TOOL_ITEM (button)); + GtkWidget *image = gtk_tool_button_get_icon_widget (button); + + if (!image) + { + image = gtk_image_new (); + gtk_widget_show (image); + gtk_tool_button_set_icon_widget (button, image); + } + + gtk_image_set_from_gicon (GTK_IMAGE (image), icon, icon_size); + } + else if (gtk_action_get_icon_name (action)) + gtk_tool_button_set_icon_name (button, gtk_action_get_icon_name (action)); + else + gtk_tool_button_set_label (button, gtk_action_get_short_label (action)); +} + /** * gtk_tool_button_new_from_stock: * @stock_id: the name of the stock item @@ -728,12 +1037,12 @@ gtk_tool_button_new_from_stock (const gchar *stock_id) /** * gtk_tool_button_new: - * @label: a string that will be used as label, or %NULL - * @icon_widget: a widget that will be used as icon widget, or %NULL - * - * Creates a new %GtkToolButton using @icon_widget as icon and @label as + * @label: (allow-none): a string that will be used as label, or %NULL + * @icon_widget: (allow-none): a widget that will be used as the button contents, or %NULL + * + * Creates a new %GtkToolButton using @icon_widget as contents and @label as * label. - * + * * Return value: A new #GtkToolButton * * Since: 2.4 @@ -744,6 +1053,8 @@ gtk_tool_button_new (GtkWidget *icon_widget, { GtkToolButton *button; + g_return_val_if_fail (icon_widget == NULL || GTK_IS_WIDGET (icon_widget), NULL); + button = g_object_new (GTK_TYPE_TOOL_BUTTON, "label", label, "icon-widget", icon_widget, @@ -755,8 +1066,8 @@ gtk_tool_button_new (GtkWidget *icon_widget, /** * gtk_tool_button_set_label: * @button: a #GtkToolButton - * @label: a string that will be used as label, or %NULL. - * + * @label: (allow-none): a string that will be used as label, or %NULL. + * * Sets @label as the label used for the tool button. The "label" property * only has an effect if not overridden by a non-%NULL "label_widget" property. * If both the "label_widget" and "label" properties are %NULL, the label @@ -770,6 +1081,8 @@ gtk_tool_button_set_label (GtkToolButton *button, const gchar *label) { gchar *old_label; + gchar *elided_label; + AtkObject *accessible; g_return_if_fail (GTK_IS_TOOL_BUTTON (button)); @@ -778,6 +1091,14 @@ gtk_tool_button_set_label (GtkToolButton *button, button->priv->label_text = g_strdup (label); button->priv->contents_invalid = TRUE; + if (label) + { + elided_label = _gtk_toolbar_elide_underscores (label); + accessible = gtk_widget_get_accessible (GTK_WIDGET (button->priv->button)); + atk_object_set_name (accessible, elided_label); + g_free (elided_label); + } + g_free (old_label); g_object_notify (G_OBJECT (button), "label"); @@ -795,7 +1116,7 @@ gtk_tool_button_set_label (GtkToolButton *button, * * Since: 2.4 **/ -G_CONST_RETURN gchar * +const gchar * gtk_tool_button_get_label (GtkToolButton *button) { g_return_val_if_fail (GTK_IS_TOOL_BUTTON (button), NULL); @@ -859,8 +1180,8 @@ gtk_tool_button_get_use_underline (GtkToolButton *button) /** * gtk_tool_button_set_stock_id: * @button: a #GtkToolButton - * @stock_id: a name of a stock item, or %NULL - * + * @stock_id: (allow-none): a name of a stock item, or %NULL + * * Sets the name of the stock item. See gtk_tool_button_new_from_stock(). * The stock_id property only has an effect if not * overridden by non-%NULL "label" and "icon_widget" properties. @@ -896,7 +1217,7 @@ gtk_tool_button_set_stock_id (GtkToolButton *button, * * Since: 2.4 **/ -G_CONST_RETURN gchar * +const gchar * gtk_tool_button_get_stock_id (GtkToolButton *button) { g_return_val_if_fail (GTK_IS_TOOL_BUTTON (button), NULL); @@ -905,10 +1226,10 @@ gtk_tool_button_get_stock_id (GtkToolButton *button) } /** - * gtk_tool_button_set_icon_name + * gtk_tool_button_set_icon_name: * @button: a #GtkToolButton - * @icon_name: the name of the themed icon - * + * @icon_name: (allow-none): the name of the themed icon + * * Sets the icon for the tool button from a named themed icon. * See the docs for #GtkIconTheme for more details. * The "icon_name" property only has an effect if not @@ -936,18 +1257,18 @@ gtk_tool_button_set_icon_name (GtkToolButton *button, } /** - * gtk_tool_button_get_icon_name + * gtk_tool_button_get_icon_name: * @button: a #GtkToolButton - * + * * Returns the name of the themed icon for the tool button, * see gtk_tool_button_set_icon_name(). * * Returns: the icon name or %NULL if the tool button has * no themed icon - * + * * Since: 2.8 **/ -G_CONST_RETURN gchar* +const gchar* gtk_tool_button_get_icon_name (GtkToolButton *button) { g_return_val_if_fail (GTK_IS_TOOL_BUTTON (button), NULL); @@ -958,8 +1279,8 @@ gtk_tool_button_get_icon_name (GtkToolButton *button) /** * gtk_tool_button_set_icon_widget: * @button: a #GtkToolButton - * @icon_widget: the widget used as icon, or %NULL - * + * @icon_widget: (allow-none): the widget used as icon, or %NULL + * * Sets @icon as the widget used as icon on @button. If @icon_widget is * %NULL the icon is determined by the "stock_id" property. If the * "stock_id" property is also %NULL, @button will not have an icon. @@ -977,9 +1298,12 @@ gtk_tool_button_set_icon_widget (GtkToolButton *button, { if (button->priv->icon_widget) { - if (button->priv->icon_widget->parent) - gtk_container_remove (GTK_CONTAINER (button->priv->icon_widget->parent), - button->priv->icon_widget); + GtkWidget *parent; + + parent = gtk_widget_get_parent (button->priv->icon_widget); + if (parent) + gtk_container_remove (GTK_CONTAINER (parent), + button->priv->icon_widget); g_object_unref (button->priv->icon_widget); } @@ -997,8 +1321,8 @@ gtk_tool_button_set_icon_widget (GtkToolButton *button, /** * gtk_tool_button_set_label_widget: * @button: a #GtkToolButton - * @label_widget: the widget used as label, or %NULL - * + * @label_widget: (allow-none): the widget used as label, or %NULL + * * Sets @label_widget as the widget that will be used as the label * for @button. If @label_widget is %NULL the "label" property is used * as label. If "label" is also %NULL, the label in the stock item @@ -1018,10 +1342,13 @@ gtk_tool_button_set_label_widget (GtkToolButton *button, { if (button->priv->label_widget) { - if (button->priv->label_widget->parent) - gtk_container_remove (GTK_CONTAINER (button->priv->label_widget->parent), - button->priv->label_widget); - + GtkWidget *parent; + + parent = gtk_widget_get_parent (button->priv->label_widget); + if (parent) + gtk_container_remove (GTK_CONTAINER (parent), + button->priv->label_widget); + g_object_unref (button->priv->label_widget); } @@ -1038,12 +1365,13 @@ gtk_tool_button_set_label_widget (GtkToolButton *button, /** * gtk_tool_button_get_label_widget: * @button: a #GtkToolButton - * - * Returns the widget used as label on @button. See - * gtk_tool_button_set_label_widget(). - * - * Return value: The widget used as label on @button, or %NULL. - * + * + * Returns the widget used as label on @button. + * See gtk_tool_button_set_label_widget(). + * + * Return value: (transfer none): The widget used as label + * on @button, or %NULL. + * * Since: 2.4 **/ GtkWidget * @@ -1057,12 +1385,13 @@ gtk_tool_button_get_label_widget (GtkToolButton *button) /** * gtk_tool_button_get_icon_widget: * @button: a #GtkToolButton - * - * Return the widget used as icon widget on @button. See - * gtk_tool_button_set_icon_widget(). - * - * Return value: The widget used as icon on @button, or %NULL. - * + * + * Return the widget used as icon widget on @button. + * See gtk_tool_button_set_icon_widget(). + * + * Return value: (transfer none): The widget used as icon + * on @button, or %NULL. + * * Since: 2.4 **/ GtkWidget * @@ -1080,7 +1409,3 @@ _gtk_tool_button_get_button (GtkToolButton *button) return button->priv->button; } - - -#define __GTK_TOOL_BUTTON_C__ -#include "gtkaliasdef.c"