*/
#include <config.h>
+#include <string.h>
#include "gtkactiongroup.h"
+#include "gtkbuildable.h"
+#include "gtkiconfactory.h"
+#include "gtkicontheme.h"
#include "gtkstock.h"
#include "gtktoggleaction.h"
#include "gtkradioaction.h"
#include "gtkaccelmap.h"
#include "gtkmarshalers.h"
+#include "gtkbuilderprivate.h"
+#include "gtkprivate.h"
#include "gtkintl.h"
+#include "gtkalias.h"
#define GTK_ACTION_GROUP_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ACTION_GROUP, GtkActionGroupPrivate))
static GtkAction *gtk_action_group_real_get_action (GtkActionGroup *self,
const gchar *name);
+/* GtkBuildable */
+static void gtk_action_group_buildable_init (GtkBuildableIface *iface);
+static void gtk_action_group_buildable_add_child (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *type);
+static void gtk_action_group_buildable_set_name (GtkBuildable *buildable,
+ const gchar *name);
+static const gchar* gtk_action_group_buildable_get_name (GtkBuildable *buildable);
+static gboolean gtk_action_group_buildable_custom_tag_start (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ GMarkupParser *parser,
+ gpointer *data);
+static void gtk_action_group_buildable_custom_tag_end (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ gpointer *user_data);
GType
gtk_action_group_get_type (void)
if (!type)
{
- static const GTypeInfo type_info =
+ const GTypeInfo type_info =
{
sizeof (GtkActionGroupClass),
NULL, /* base_init */
(GInstanceInitFunc) gtk_action_group_init,
};
- type = g_type_register_static (G_TYPE_OBJECT, "GtkActionGroup",
+ static const GInterfaceInfo buildable_info =
+ {
+ (GInterfaceInitFunc) gtk_action_group_buildable_init,
+ NULL,
+ NULL
+ };
+
+ type = g_type_register_static (G_TYPE_OBJECT, I_("GtkActionGroup"),
&type_info, 0);
- }
+ g_type_add_interface_static (type,
+ GTK_TYPE_BUILDABLE,
+ &buildable_info);
+ }
return type;
}
P_("Name"),
P_("A name for the action group."),
NULL,
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
+ GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (gobject_class,
PROP_SENSITIVE,
g_param_spec_boolean ("sensitive",
P_("Sensitive"),
P_("Whether the action group is enabled."),
TRUE,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_VISIBLE,
g_param_spec_boolean ("visible",
P_("Visible"),
P_("Whether the action group is visible."),
TRUE,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
/**
- * GtkGroupAction::connect-proxy:
+ * GtkActionGroup::connect-proxy:
* @action_group: the group
* @action: the action
* @proxy: the proxy
* Since: 2.4
*/
action_group_signals[CONNECT_PROXY] =
- g_signal_new ("connect_proxy",
+ g_signal_new (I_("connect_proxy"),
G_OBJECT_CLASS_TYPE (klass),
0, 0, NULL, NULL,
_gtk_marshal_VOID__OBJECT_OBJECT,
GTK_TYPE_ACTION, GTK_TYPE_WIDGET);
/**
- * GtkAction::disconnect-proxy:
+ * GtkActionGroup::disconnect-proxy:
* @action_group: the group
* @action: the action
* @proxy: the proxy
* Since: 2.4
*/
action_group_signals[DISCONNECT_PROXY] =
- g_signal_new ("disconnect_proxy",
+ g_signal_new (I_("disconnect_proxy"),
G_OBJECT_CLASS_TYPE (klass),
0, 0, NULL, NULL,
_gtk_marshal_VOID__OBJECT_OBJECT,
GTK_TYPE_ACTION, GTK_TYPE_WIDGET);
/**
- * GtkActionGroup::pre_activate:
+ * GtkActionGroup::pre-activate:
* @action_group: the group
* @action: the action
*
* Since: 2.4
*/
action_group_signals[PRE_ACTIVATE] =
- g_signal_new ("pre_activate",
+ g_signal_new (I_("pre_activate"),
G_OBJECT_CLASS_TYPE (klass),
0, 0, NULL, NULL,
_gtk_marshal_VOID__OBJECT,
GTK_TYPE_ACTION);
/**
- * GtkActionGroup::post_activate:
+ * GtkActionGroup::post-activate:
* @action_group: the group
* @action: the action
*
* Since: 2.4
*/
action_group_signals[POST_ACTIVATE] =
- g_signal_new ("post_activate",
+ g_signal_new (I_("post_activate"),
G_OBJECT_CLASS_TYPE (klass),
0, 0, NULL, NULL,
_gtk_marshal_VOID__OBJECT,
static void
remove_action (GtkAction *action)
{
- g_object_set (action, "action_group", NULL, NULL);
+ g_object_set (action, I_("action-group"), NULL, NULL);
g_object_unref (action);
}
self->private_data->translate_notify = NULL;
}
+static void
+gtk_action_group_buildable_init (GtkBuildableIface *iface)
+{
+ iface->add_child = gtk_action_group_buildable_add_child;
+ iface->set_name = gtk_action_group_buildable_set_name;
+ iface->get_name = gtk_action_group_buildable_get_name;
+ iface->custom_tag_start = gtk_action_group_buildable_custom_tag_start;
+ iface->custom_tag_end = gtk_action_group_buildable_custom_tag_end;
+}
+
+static void
+gtk_action_group_buildable_add_child (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *type)
+{
+ gtk_action_group_add_action_with_accel (GTK_ACTION_GROUP (buildable),
+ GTK_ACTION (child), NULL);
+}
+
+static void
+gtk_action_group_buildable_set_name (GtkBuildable *buildable,
+ const gchar *name)
+{
+ GtkActionGroup *self = GTK_ACTION_GROUP (buildable);
+ self->private_data->name = g_strdup (name);
+}
+
+static const gchar *
+gtk_action_group_buildable_get_name (GtkBuildable *buildable)
+{
+ GtkActionGroup *self = GTK_ACTION_GROUP (buildable);
+ return self->private_data->name;
+}
+
+typedef struct {
+ GObject *child;
+ guint key;
+ guint modifiers;
+} AcceleratorParserData;
+
+static void
+accelerator_start_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **names,
+ const gchar **values,
+ gpointer user_data,
+ GError **error)
+{
+ gint i;
+ guint key = 0;
+ gint modifiers = 0;
+ AcceleratorParserData *parser_data = (AcceleratorParserData*)user_data;
+
+ if (strcmp (element_name, "accelerator") != 0)
+ g_warning ("Unknown <accelerator> tag: %s", element_name);
+
+ for (i = 0; names[i]; i++)
+ {
+ if (strcmp (names[i], "key") == 0)
+ key = gdk_keyval_from_name (values[i]);
+ else if (strcmp (names[i], "modifiers") == 0)
+ {
+ if (!_gtk_builder_flags_from_string (GDK_TYPE_MODIFIER_TYPE,
+ values[i],
+ &modifiers,
+ error))
+ return;
+ }
+ }
+
+ if (key == 0)
+ {
+ g_warning ("<accelerator> requires a key attribute");
+ return;
+ }
+ parser_data->key = key;
+ parser_data->modifiers = (guint)modifiers;
+}
+
+static const GMarkupParser accelerator_parser =
+ {
+ accelerator_start_element
+ };
+
+static gboolean
+gtk_action_group_buildable_custom_tag_start (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ GMarkupParser *parser,
+ gpointer *user_data)
+{
+ AcceleratorParserData *parser_data;
+
+ if (child && strcmp (tagname, "accelerator") == 0)
+ {
+ parser_data = g_slice_new0 (AcceleratorParserData);
+ parser_data->child = child;
+ *user_data = parser_data;
+ *parser = accelerator_parser;
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void
+gtk_action_group_buildable_custom_tag_end (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ gpointer *user_data)
+{
+ AcceleratorParserData *data;
+
+ if (strcmp (tagname, "accelerator") == 0)
+ {
+ GtkActionGroup *action_group;
+ GtkAction *action;
+ gchar *accel_path;
+
+ data = (AcceleratorParserData*)user_data;
+ action_group = GTK_ACTION_GROUP (buildable);
+ action = GTK_ACTION (child);
+
+ accel_path = g_strconcat ("<Actions>/",
+ action_group->private_data->name, "/",
+ gtk_action_get_name (action), NULL);
+
+ if (gtk_accel_map_lookup_entry (accel_path, NULL))
+ gtk_accel_map_change_entry (accel_path, data->key, data->modifiers, TRUE);
+ else
+ gtk_accel_map_add_entry (accel_path, data->key, data->modifiers);
+
+ gtk_action_set_accel_path (action, accel_path);
+
+ g_free (accel_path);
+ g_slice_free (AcceleratorParserData, data);
+ }
+}
+
/**
* gtk_action_group_new:
* @name: the name of the action group.
*
* Since: 2.4
*/
-const gchar *
+G_CONST_RETURN gchar *
gtk_action_group_get_name (GtkActionGroup *action_group)
{
g_return_val_if_fail (GTK_IS_ACTION_GROUP (action_group), NULL);
}
static void
-cb_set_action_sensitivity (const gchar *name, GtkAction *action)
+cb_set_action_sensitivity (const gchar *name,
+ GtkAction *action)
{
- /* Minor optimization, the action_groups state only effects actions that are
- * themselves sensitive */
+ /* Minor optimization, the action_groups state only affects actions
+ * that are themselves sensitive */
if (gtk_action_get_sensitive (action))
- g_object_notify (G_OBJECT (action), "sensitive");
+ _gtk_action_sync_sensitive (action);
}
/**
* Since: 2.4
*/
void
-gtk_action_group_set_sensitive (GtkActionGroup *action_group, gboolean sensitive)
+gtk_action_group_set_sensitive (GtkActionGroup *action_group,
+ gboolean sensitive)
{
g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
- if (action_group->private_data->sensitive ^ sensitive)
+ sensitive = sensitive != FALSE;
+
+ if (action_group->private_data->sensitive != sensitive)
{
action_group->private_data->sensitive = sensitive;
g_hash_table_foreach (action_group->private_data->actions,
(GHFunc) cb_set_action_sensitivity, NULL);
+
+ g_object_notify (G_OBJECT (action_group), "sensitive");
}
}
* they are visible (see gtk_action_get_visible()) and their group
* is visible.
*
- * Return value: %TRUE if the group is sensitive.
+ * Return value: %TRUE if the group is visible.
*
* Since: 2.4
*/
}
static void
-cb_set_action_visiblity (const gchar *name, GtkAction *action)
+cb_set_action_visiblity (const gchar *name,
+ GtkAction *action)
{
- /* Minor optimization, the action_groups state only effects actions that are
- * themselves sensitive */
+ /* Minor optimization, the action_groups state only affects actions
+ * that are themselves visible */
if (gtk_action_get_visible (action))
- g_object_notify (G_OBJECT (action), "visible");
+ _gtk_action_sync_visible (action);
}
/**
* Since: 2.4
*/
void
-gtk_action_group_set_visible (GtkActionGroup *action_group, gboolean visible)
+gtk_action_group_set_visible (GtkActionGroup *action_group,
+ gboolean visible)
{
g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
- if (action_group->private_data->visible ^ visible)
+ visible = visible != FALSE;
+
+ if (action_group->private_data->visible != visible)
{
action_group->private_data->visible = visible;
g_hash_table_foreach (action_group->private_data->actions,
(GHFunc) cb_set_action_visiblity, NULL);
+
+ g_object_notify (G_OBJECT (action_group), "visible");
}
}
(action_group, action_name);
}
+static gboolean
+check_unique_action (GtkActionGroup *action_group,
+ const gchar *action_name)
+{
+ if (gtk_action_group_get_action (action_group, action_name) != NULL)
+ {
+ g_warning ("Refusing to add non-unique action '%s' to action group '%s'",
+ action_name,
+ action_group->private_data->name);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
/**
* gtk_action_group_add_action:
* @action_group: the action group
* @action: an action
*
- * Adds an action object to the action group.
+ * Adds an action object to the action group. Note that this function
+ * does not set up the accel path of the action, which can lead to problems
+ * if a user tries to modify the accelerator of a menuitem associated with
+ * the action. Therefore you must either set the accel path yourself with
+ * gtk_action_set_accel_path(), or use
+ * <literal>gtk_action_group_add_action_with_accel (..., NULL)</literal>.
*
* Since: 2.4
*/
g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
g_return_if_fail (GTK_IS_ACTION (action));
g_return_if_fail (gtk_action_get_name (action) != NULL);
+
+ if (!check_unique_action (action_group, gtk_action_get_name (action)))
+ return;
g_hash_table_insert (action_group->private_data->actions,
g_strdup (gtk_action_get_name (action)),
g_object_ref (action));
- g_object_set (G_OBJECT (action), "action_group", action_group, NULL);
+ g_object_set (action, I_("action-group"), action_group, NULL);
}
/**
* @action_group: the action group
* @action: the action to add
* @accelerator: the accelerator for the action, in
- * the format understood by gtk_accelerator_parse(), or %NULL to use the
- * stock accelerator
+ * the format understood by gtk_accelerator_parse(), or "" for no accelerator, or
+ * %NULL to use the stock accelerator
*
* Adds an action object to the action group and sets up the accelerator.
*
* If @accelerator is %NULL, attempts to use the accelerator associated
- * with the stock_id of the action.
+ * with the stock_id of the action.
*
* Accel paths are set to
* <literal><Actions>/<replaceable>group-name</replaceable>/<replaceable>action-name</replaceable></literal>.
*/
void
gtk_action_group_add_action_with_accel (GtkActionGroup *action_group,
- GtkAction *action,
- const gchar *accelerator)
+ GtkAction *action,
+ const gchar *accelerator)
{
gchar *accel_path;
guint accel_key = 0;
GtkStockItem stock_item;
gchar *name;
gchar *stock_id;
+
+ if (!check_unique_action (action_group, gtk_action_get_name (action)))
+ return;
- g_object_get (action, "name", &name, "stock_id", &stock_id, NULL);
+ g_object_get (action, "name", &name, "stock-id", &stock_id, NULL);
accel_path = g_strconcat ("<Actions>/",
action_group->private_data->name, "/", name, NULL);
if (accelerator)
- gtk_accelerator_parse (accelerator, &accel_key, &accel_mods);
+ {
+ if (accelerator[0] == 0)
+ accel_key = 0;
+ else
+ {
+ gtk_accelerator_parse (accelerator, &accel_key, &accel_mods);
+ if (accel_key == 0)
+ g_warning ("Unable to parse accelerator '%s' for action '%s'",
+ accelerator, name);
+ }
+ }
else if (stock_id && gtk_stock_lookup (stock_id, &stock_item))
{
accel_key = stock_item.keyval;
* Since: 2.4
*/
void
-gtk_action_group_add_actions (GtkActionGroup *action_group,
- GtkActionEntry *entries,
- guint n_entries,
- gpointer user_data)
+gtk_action_group_add_actions (GtkActionGroup *action_group,
+ const GtkActionEntry *entries,
+ guint n_entries,
+ gpointer user_data)
{
gtk_action_group_add_actions_full (action_group,
entries, n_entries,
user_data, NULL);
}
+typedef struct _SharedData SharedData;
+
+struct _SharedData {
+ guint ref_count;
+ gpointer data;
+ GDestroyNotify destroy;
+};
+
+static void
+shared_data_unref (gpointer data)
+{
+ SharedData *shared_data = (SharedData *)data;
+
+ shared_data->ref_count--;
+ if (shared_data->ref_count == 0)
+ {
+ if (shared_data->destroy)
+ (*shared_data->destroy) (shared_data->data);
+
+ g_slice_free (SharedData, shared_data);
+ }
+}
+
/**
* gtk_action_group_add_actions_full:
* Since: 2.4
*/
void
-gtk_action_group_add_actions_full (GtkActionGroup *action_group,
- GtkActionEntry *entries,
- guint n_entries,
- gpointer user_data,
- GDestroyNotify destroy)
+gtk_action_group_add_actions_full (GtkActionGroup *action_group,
+ const GtkActionEntry *entries,
+ guint n_entries,
+ gpointer user_data,
+ GDestroyNotify destroy)
{
/* Keep this in sync with the other
* gtk_action_group_add_..._actions_full() functions.
*/
guint i;
- GtkTranslateFunc translate_func;
- gpointer translate_data;
+ SharedData *shared_data;
g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
- translate_func = action_group->private_data->translate_func;
- translate_data = action_group->private_data->translate_data;
+ shared_data = g_slice_new0 (SharedData);
+ shared_data->ref_count = 1;
+ shared_data->data = user_data;
+ shared_data->destroy = destroy;
for (i = 0; i < n_entries; i++)
{
const gchar *label;
const gchar *tooltip;
- if (translate_func)
- {
- label = translate_func (entries[i].label, translate_data);
- tooltip = translate_func (entries[i].tooltip, translate_data);
- }
- else
- {
- label = entries[i].label;
- tooltip = entries[i].tooltip;
- }
+ if (!check_unique_action (action_group, entries[i].name))
+ continue;
+
+ label = gtk_action_group_translate_string (action_group, entries[i].label);
+ tooltip = gtk_action_group_translate_string (action_group, entries[i].tooltip);
action = gtk_action_new (entries[i].name,
label,
tooltip,
- entries[i].stock_id);
+ NULL);
+ if (entries[i].stock_id)
+ {
+ g_object_set (action, "stock-id", entries[i].stock_id, NULL);
+ if (gtk_icon_theme_has_icon (gtk_icon_theme_get_default (),
+ entries[i].stock_id))
+ g_object_set (action, "icon-name", entries[i].stock_id, NULL);
+ }
+
if (entries[i].callback)
- g_signal_connect_data (action, "activate",
- entries[i].callback,
- user_data, (GClosureNotify)destroy, 0);
+ {
+ GClosure *closure;
+
+ closure = g_cclosure_new (entries[i].callback, user_data, NULL);
+ g_closure_add_finalize_notifier (closure, shared_data,
+ (GClosureNotify)shared_data_unref);
+ shared_data->ref_count++;
+ g_signal_connect_closure (action, "activate", closure, FALSE);
+ }
+
gtk_action_group_add_action_with_accel (action_group,
action,
entries[i].accelerator);
g_object_unref (action);
}
+
+ shared_data_unref (shared_data);
}
/**
* Since: 2.4
*/
void
-gtk_action_group_add_toggle_actions (GtkActionGroup *action_group,
- GtkToggleActionEntry *entries,
- guint n_entries,
- gpointer user_data)
+gtk_action_group_add_toggle_actions (GtkActionGroup *action_group,
+ const GtkToggleActionEntry *entries,
+ guint n_entries,
+ gpointer user_data)
{
gtk_action_group_add_toggle_actions_full (action_group,
entries, n_entries,
* Since: 2.4
*/
void
-gtk_action_group_add_toggle_actions_full (GtkActionGroup *action_group,
- GtkToggleActionEntry *entries,
- guint n_entries,
- gpointer user_data,
- GDestroyNotify destroy)
+gtk_action_group_add_toggle_actions_full (GtkActionGroup *action_group,
+ const GtkToggleActionEntry *entries,
+ guint n_entries,
+ gpointer user_data,
+ GDestroyNotify destroy)
{
/* Keep this in sync with the other
* gtk_action_group_add_..._actions_full() functions.
*/
guint i;
- GtkTranslateFunc translate_func;
- gpointer translate_data;
+ SharedData *shared_data;
g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
- translate_func = action_group->private_data->translate_func;
- translate_data = action_group->private_data->translate_data;
+ shared_data = g_slice_new0 (SharedData);
+ shared_data->ref_count = 1;
+ shared_data->data = user_data;
+ shared_data->destroy = destroy;
for (i = 0; i < n_entries; i++)
{
const gchar *label;
const gchar *tooltip;
- if (translate_func)
- {
- label = translate_func (entries[i].label, translate_data);
- tooltip = translate_func (entries[i].tooltip, translate_data);
- }
- else
- {
- label = entries[i].label;
- tooltip = entries[i].tooltip;
- }
+ if (!check_unique_action (action_group, entries[i].name))
+ continue;
+
+ label = gtk_action_group_translate_string (action_group, entries[i].label);
+ tooltip = gtk_action_group_translate_string (action_group, entries[i].tooltip);
action = gtk_toggle_action_new (entries[i].name,
label,
tooltip,
- entries[i].stock_id);
+ NULL);
+
+ if (entries[i].stock_id)
+ {
+ if (gtk_icon_factory_lookup_default (entries[i].stock_id))
+ 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);
if (entries[i].callback)
- g_signal_connect_data (action, "activate",
- entries[i].callback,
- user_data, (GClosureNotify)destroy, 0);
+ {
+ GClosure *closure;
+ closure = g_cclosure_new (entries[i].callback, user_data, NULL);
+ g_closure_add_finalize_notifier (closure, shared_data,
+ (GClosureNotify)shared_data_unref);
+ shared_data->ref_count++;
+
+ g_signal_connect_closure (action, "activate", closure, FALSE);
+ }
+
gtk_action_group_add_action_with_accel (action_group,
GTK_ACTION (action),
entries[i].accelerator);
g_object_unref (action);
}
+
+ shared_data_unref (shared_data);
}
/**
* Since: 2.4
**/
void
-gtk_action_group_add_radio_actions (GtkActionGroup *action_group,
- GtkRadioActionEntry *entries,
- guint n_entries,
- gint value,
- GCallback on_change,
- gpointer user_data)
+gtk_action_group_add_radio_actions (GtkActionGroup *action_group,
+ const GtkRadioActionEntry *entries,
+ guint n_entries,
+ gint value,
+ GCallback on_change,
+ gpointer user_data)
{
gtk_action_group_add_radio_actions_full (action_group,
entries, n_entries,
* Since: 2.4
**/
void
-gtk_action_group_add_radio_actions_full (GtkActionGroup *action_group,
- GtkRadioActionEntry *entries,
- guint n_entries,
- gint value,
- GCallback on_change,
- gpointer user_data,
- GDestroyNotify destroy)
+gtk_action_group_add_radio_actions_full (GtkActionGroup *action_group,
+ const GtkRadioActionEntry *entries,
+ guint n_entries,
+ gint value,
+ GCallback on_change,
+ gpointer user_data,
+ GDestroyNotify destroy)
{
/* Keep this in sync with the other
* gtk_action_group_add_..._actions_full() functions.
*/
guint i;
- GtkTranslateFunc translate_func;
- gpointer translate_data;
GSList *group = NULL;
GtkRadioAction *first_action = NULL;
g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
- translate_func = action_group->private_data->translate_func;
- translate_data = action_group->private_data->translate_data;
-
for (i = 0; i < n_entries; i++)
{
GtkRadioAction *action;
const gchar *label;
const gchar *tooltip;
- if (translate_func)
- {
- label = translate_func (entries[i].label, translate_data);
- tooltip = translate_func (entries[i].tooltip, translate_data);
- }
- else
- {
- label = entries[i].label;
- tooltip = entries[i].tooltip;
- }
+ if (!check_unique_action (action_group, entries[i].name))
+ continue;
+
+ label = gtk_action_group_translate_string (action_group, entries[i].label);
+ tooltip = gtk_action_group_translate_string (action_group, entries[i].tooltip);
action = gtk_radio_action_new (entries[i].name,
label,
tooltip,
- entries[i].stock_id,
- value);
+ NULL,
+ entries[i].value);
+
+ if (entries[i].stock_id)
+ {
+ if (gtk_icon_factory_lookup_default (entries[i].stock_id))
+ 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;
* Since: 2.4
**/
void
-gtk_action_group_set_translate_func (GtkActionGroup *action_group,
- GtkTranslateFunc func,
- gpointer data,
- GtkDestroyNotify notify)
+gtk_action_group_set_translate_func (GtkActionGroup *action_group,
+ GtkTranslateFunc func,
+ gpointer data,
+ GtkDestroyNotify notify)
{
g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
dgettext_swapped (const gchar *msgid,
const gchar *domainname)
{
- return dgettext (domainname, msgid);
+ /* Pass through dgettext if and only if msgid is nonempty. */
+ if (msgid && *msgid)
+ return dgettext (domainname, msgid);
+ else
+ return (gchar*) msgid;
}
/**
g_free);
}
+
+/**
+ * gtk_action_group_translate_string:
+ * @action_group: a #GtkActionGroup
+ * @string: a string
+ *
+ * Translates a string using the specified translate_func(). This
+ * is mainly intended for language bindings.
+ *
+ * Returns: the translation of @string
+ *
+ * Since: 2.6
+ **/
+G_CONST_RETURN gchar *
+gtk_action_group_translate_string (GtkActionGroup *action_group,
+ const gchar *string)
+{
+ GtkTranslateFunc translate_func;
+ gpointer translate_data;
+
+ g_return_val_if_fail (GTK_IS_ACTION_GROUP (action_group), string);
+
+ if (string == NULL)
+ return NULL;
+
+ translate_func = action_group->private_data->translate_func;
+ translate_data = action_group->private_data->translate_data;
+
+ if (translate_func)
+ return translate_func (string, translate_data);
+ else
+ return string;
+}
+
/* Protected for use by GtkAction */
void
_gtk_action_group_emit_connect_proxy (GtkActionGroup *action_group,
void
_gtk_action_group_emit_post_activate (GtkActionGroup *action_group,
- GtkAction *action)
+ GtkAction *action)
{
g_signal_emit (action_group, action_group_signals[POST_ACTIVATE], 0, action);
}
+
+#define __GTK_ACTION_GROUP_C__
+#include "gtkaliasdef.c"