gchar *label;
gchar *short_label;
gchar *tooltip;
- gchar *stock_id; /* icon */
+ gchar *stock_id; /* stock icon */
+ gchar *icon_name; /* themed icon */
guint sensitive : 1;
guint visible : 1;
PROP_SHORT_LABEL,
PROP_TOOLTIP,
PROP_STOCK_ID,
+ PROP_ICON_NAME,
PROP_VISIBLE_HORIZONTAL,
PROP_VISIBLE_VERTICAL,
PROP_VISIBLE_OVERFLOWN,
const gchar *tooltip);
static void gtk_action_set_stock_id (GtkAction *action,
const gchar *stock_id);
+static void gtk_action_set_icon_name (GtkAction *action,
+ const gchar *icon_name);
static void gtk_action_sync_tooltip (GtkAction *action,
GtkWidget *proxy);
"this action."),
NULL,
GTK_PARAM_READWRITE));
+ /**
+ * GtkAction::icon-name:
+ *
+ * The name of the icon from the icon theme.
+ * Note that the stock icon is preferred, if
+ * the ::stock-id property holds the id of an
+ * existing stock icon.
+ *
+ * Since: 2.10
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_ICON_NAME,
+ g_param_spec_string ("icon-name",
+ P_("Icon Name"),
+ P_("The name of the icon from the icon theme"),
+ NULL,
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_VISIBLE_HORIZONTAL,
g_param_spec_boolean ("visible-horizontal",
action->private_data->short_label = NULL;
action->private_data->tooltip = NULL;
action->private_data->stock_id = NULL;
+ action->private_data->icon_name = NULL;
action->private_data->visible_horizontal = TRUE;
action->private_data->visible_vertical = TRUE;
action->private_data->visible_overflown = TRUE;
g_free (action->private_data->short_label);
g_free (action->private_data->tooltip);
g_free (action->private_data->stock_id);
+ g_free (action->private_data->icon_name);
g_closure_unref (action->private_data->accel_closure);
if (action->private_data->accel_group)
case PROP_STOCK_ID:
gtk_action_set_stock_id (action, g_value_get_string (value));
break;
+ case PROP_ICON_NAME:
+ gtk_action_set_icon_name (action, g_value_get_string (value));
+ break;
case PROP_VISIBLE_HORIZONTAL:
gtk_action_set_visible_horizontal (action, g_value_get_boolean (value));
break;
case PROP_STOCK_ID:
g_value_set_string (value, action->private_data->stock_id);
break;
+ case PROP_ICON_NAME:
+ g_value_set_string (value, action->private_data->icon_name);
+ break;
case PROP_VISIBLE_HORIZONTAL:
g_value_set_boolean (value, action->private_data->visible_horizontal);
break;
}
if (!image)
{
- image = gtk_image_new_from_stock (NULL,
- GTK_ICON_SIZE_MENU);
+ image = gtk_image_new ();
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (proxy),
image);
gtk_widget_show (image);
}
- gtk_image_set_from_stock (GTK_IMAGE (image),
- action->private_data->stock_id, GTK_ICON_SIZE_MENU);
+ if (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_object_set (proxy,
"label", action->private_data->short_label,
- "use_underline", TRUE,
- "stock_id", action->private_data->stock_id,
+ "use-underline", TRUE,
+ "stock-id", action->private_data->stock_id,
+ "icon-name", action->private_data->icon_name,
NULL);
g_signal_connect_object (proxy, "clicked",
"label", action->private_data->stock_id,
NULL);
}
- else if (GTK_BIN (proxy)->child == NULL ||
- GTK_IS_LABEL (GTK_BIN (proxy)->child))
+ else
{
- /* synchronise the label */
- g_object_set (proxy,
- "label", action->private_data->short_label,
- "use_underline", TRUE,
- NULL);
+ GtkWidget *image;
+
+ image = gtk_button_get_image (GTK_BUTTON (proxy));
+
+ 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,
if (action->private_data->stock_id)
return gtk_image_new_from_stock (action->private_data->stock_id, icon_size);
+ else if (action->private_data->icon_name)
+ return gtk_image_new_from_icon_name (action->private_data->icon_name, icon_size);
else
return NULL;
}
{
GtkStockItem stock_item;
- if (gtk_stock_lookup (action->private_data->stock_id, &stock_item))
+ if (action->private_data->stock_id &&
+ gtk_stock_lookup (action->private_data->stock_id, &stock_item))
gtk_action_set_label (action, stock_item.label);
else
gtk_action_set_label (action, NULL);
}
}
+static void
+gtk_action_set_icon_name (GtkAction *action,
+ const gchar *icon_name)
+{
+ GSList *p;
+ GtkWidget *proxy, *image;
+ gchar *tmp;
+
+ tmp = action->private_data->icon_name;
+ action->private_data->icon_name = g_strdup (icon_name);
+ g_free (tmp);
+
+ for (p = action->private_data->proxies; p; p = p->next)
+ {
+ proxy = (GtkWidget *)p->data;
+
+ if (GTK_IS_IMAGE_MENU_ITEM (proxy))
+ {
+ image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (proxy));
+
+ if (GTK_IS_IMAGE (image) &&
+ (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
+ gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME))
+ gtk_image_set_from_icon_name (GTK_IMAGE (image),
+ action->private_data->icon_name, GTK_ICON_SIZE_MENU);
+ }
+ else if (GTK_IS_TOOL_BUTTON (proxy))
+ {
+ gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (proxy),
+ action->private_data->icon_name);
+ }
+ else if (GTK_IS_BUTTON (proxy) &&
+ !gtk_button_get_use_stock (GTK_BUTTON (proxy)))
+ {
+ GtkWidget *image;
+
+ image = gtk_button_get_image (GTK_BUTTON (proxy));
+
+ if (GTK_IS_IMAGE (image) &&
+ (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
+ gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME))
+ gtk_image_set_from_icon_name (GTK_IMAGE (image),
+ action->private_data->icon_name, GTK_ICON_SIZE_MENU);
+ }
+ }
+
+ g_object_notify (G_OBJECT (action), "icon-name");
+}
+
/**
* gtk_action_block_activate_from:
action = gtk_action_new (entries[i].name,
label,
tooltip,
- entries[i].stock_id);
+ NULL);
+ if (entries[i].stock_id)
+ {
+ GtkStockItem item;
+
+ if (gtk_stock_lookup (entries[i].stock_id, &item))
+ g_object_set (action, "stock-id", entries[i].stock_id, NULL);
+ else
+ g_object_set (action, "icon-name", entries[i].stock_id, NULL);
+ }
+
if (entries[i].callback)
{
GClosure *closure;
action = gtk_toggle_action_new (entries[i].name,
label,
tooltip,
- entries[i].stock_id);
+ NULL);
+
+ if (entries[i].stock_id)
+ {
+ GtkStockItem item;
+
+ if (gtk_stock_lookup (entries[i].stock_id, &item))
+ g_object_set (action, "stock-id", entries[i].stock_id, NULL);
+ else
+ g_object_set (action, "icon-name", entries[i].stock_id, NULL);
+ }
gtk_toggle_action_set_active (action, entries[i].is_active);
action = gtk_radio_action_new (entries[i].name,
label,
tooltip,
- entries[i].stock_id,
+ NULL,
entries[i].value);
+ if (entries[i].stock_id)
+ {
+ GtkStockItem item;
+
+ if (gtk_stock_lookup (entries[i].stock_id, &item))
+ g_object_set (action, "stock-id", entries[i].stock_id, NULL);
+ else
+ g_object_set (action, "icon-name", entries[i].stock_id, NULL);
+ }
+
if (i == 0)
first_action = action;