X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkactiongroup.c;h=ac177e1ab3d2b6bfdf119af56b6321e03e12c735;hb=fd51c8f5e9d6fb68c8e81b9b1e2ab80931f963f0;hp=4ed7e38204d87bfb362178c41d806a77a713eba2;hpb=75e75cd3050fd974e097ab4b7a801e59823fad85;p=~andy%2Fgtk diff --git a/gtk/gtkactiongroup.c b/gtk/gtkactiongroup.c index 4ed7e3820..ac177e1ab 100644 --- a/gtk/gtkactiongroup.c +++ b/gtk/gtkactiongroup.c @@ -14,9 +14,7 @@ * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public - * License along with the Gnome Library; see the file COPYING.LIB. 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 . */ /* @@ -104,7 +102,6 @@ #include "gtkprivate.h" #include "gtkintl.h" -#define GTK_ACTION_GROUP_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ACTION_GROUP, GtkActionGroupPrivate)) struct _GtkActionGroupPrivate { @@ -112,6 +109,7 @@ struct _GtkActionGroupPrivate gboolean sensitive; gboolean visible; GHashTable *actions; + GtkAccelGroup *accel_group; GtkTranslateFunc translate_func; gpointer translate_data; @@ -132,7 +130,8 @@ enum PROP_0, PROP_NAME, PROP_SENSITIVE, - PROP_VISIBLE + PROP_VISIBLE, + PROP_ACCEL_GROUP }; static void gtk_action_group_init (GtkActionGroup *self); @@ -244,6 +243,13 @@ gtk_action_group_class_init (GtkActionGroupClass *klass) P_("Whether the action group is visible."), TRUE, GTK_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_ACCEL_GROUP, + g_param_spec_object ("accel-group", + P_("Accelerator Group"), + P_("The accelerator group the actions of this group should use."), + GTK_TYPE_ACCEL_GROUP, + GTK_PARAM_READWRITE)); /** * GtkActionGroup::connect-proxy: @@ -350,11 +356,14 @@ remove_action (GtkAction *action) } static void -gtk_action_group_init (GtkActionGroup *self) +gtk_action_group_init (GtkActionGroup *action_group) { GtkActionGroupPrivate *private; - private = GTK_ACTION_GROUP_GET_PRIVATE (self); + action_group->priv = G_TYPE_INSTANCE_GET_PRIVATE (action_group, + GTK_TYPE_ACTION_GROUP, + GtkActionGroupPrivate); + private = action_group->priv; private->name = NULL; private->sensitive = TRUE; @@ -392,7 +401,7 @@ gtk_action_group_buildable_set_name (GtkBuildable *buildable, const gchar *name) { GtkActionGroup *self = GTK_ACTION_GROUP (buildable); - GtkActionGroupPrivate *private = GTK_ACTION_GROUP_GET_PRIVATE (self); + GtkActionGroupPrivate *private = self->priv; private->name = g_strdup (name); } @@ -401,7 +410,8 @@ static const gchar * gtk_action_group_buildable_get_name (GtkBuildable *buildable) { GtkActionGroup *self = GTK_ACTION_GROUP (buildable); - GtkActionGroupPrivate *private = GTK_ACTION_GROUP_GET_PRIVATE (self); + GtkActionGroupPrivate *private = self->priv; + return private->name; } @@ -495,7 +505,7 @@ gtk_action_group_buildable_custom_tag_end (GtkBuildable *buildable, data = (AcceleratorParserData*)user_data; action_group = GTK_ACTION_GROUP (buildable); - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; action = GTK_ACTION (child); accel_path = g_strconcat ("/", @@ -533,7 +543,7 @@ gtk_action_group_new (const gchar *name) GtkActionGroupPrivate *private; self = g_object_new (GTK_TYPE_ACTION_GROUP, NULL); - private = GTK_ACTION_GROUP_GET_PRIVATE (self); + private = self->priv; private->name = g_strdup (name); return self; @@ -546,7 +556,7 @@ gtk_action_group_finalize (GObject *object) GtkActionGroupPrivate *private; self = GTK_ACTION_GROUP (object); - private = GTK_ACTION_GROUP_GET_PRIVATE (self); + private = self->priv; g_free (private->name); private->name = NULL; @@ -554,6 +564,8 @@ gtk_action_group_finalize (GObject *object) g_hash_table_destroy (private->actions); private->actions = NULL; + g_clear_object (&private->accel_group); + if (private->translate_notify) private->translate_notify (private->translate_data); @@ -571,7 +583,7 @@ gtk_action_group_set_property (GObject *object, gchar *tmp; self = GTK_ACTION_GROUP (object); - private = GTK_ACTION_GROUP_GET_PRIVATE (self); + private = self->priv; switch (prop_id) { @@ -586,6 +598,9 @@ gtk_action_group_set_property (GObject *object, case PROP_VISIBLE: gtk_action_group_set_visible (self, g_value_get_boolean (value)); break; + case PROP_ACCEL_GROUP: + gtk_action_group_set_accel_group (self, g_value_get_object (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -602,7 +617,7 @@ gtk_action_group_get_property (GObject *object, GtkActionGroupPrivate *private; self = GTK_ACTION_GROUP (object); - private = GTK_ACTION_GROUP_GET_PRIVATE (self); + private = self->priv; switch (prop_id) { @@ -615,6 +630,9 @@ gtk_action_group_get_property (GObject *object, case PROP_VISIBLE: g_value_set_boolean (value, private->visible); break; + case PROP_ACCEL_GROUP: + g_value_set_object (value, private->accel_group); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -627,7 +645,7 @@ gtk_action_group_real_get_action (GtkActionGroup *self, { GtkActionGroupPrivate *private; - private = GTK_ACTION_GROUP_GET_PRIVATE (self); + private = self->priv; return g_hash_table_lookup (private->actions, action_name); } @@ -642,14 +660,14 @@ gtk_action_group_real_get_action (GtkActionGroup *self, * * Since: 2.4 */ -G_CONST_RETURN gchar * +const gchar * gtk_action_group_get_name (GtkActionGroup *action_group) { GtkActionGroupPrivate *private; g_return_val_if_fail (GTK_IS_ACTION_GROUP (action_group), NULL); - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; return private->name; } @@ -674,7 +692,7 @@ gtk_action_group_get_sensitive (GtkActionGroup *action_group) g_return_val_if_fail (GTK_IS_ACTION_GROUP (action_group), FALSE); - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; return private->sensitive; } @@ -706,7 +724,7 @@ gtk_action_group_set_sensitive (GtkActionGroup *action_group, g_return_if_fail (GTK_IS_ACTION_GROUP (action_group)); - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; sensitive = sensitive != FALSE; if (private->sensitive != sensitive) @@ -739,11 +757,30 @@ gtk_action_group_get_visible (GtkActionGroup *action_group) g_return_val_if_fail (GTK_IS_ACTION_GROUP (action_group), FALSE); - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; return private->visible; } +/** + * gtk_action_group_get_accel_group: + * @action_group: a #GtkActionGroup + * + * Gets the accelerator group. + * + * Returns: (transfer none): the accelerator group associated with this action + * group or %NULL if there is none. + * + * Since: 3.6 + */ +GtkAccelGroup * +gtk_action_group_get_accel_group (GtkActionGroup *action_group) +{ + g_return_val_if_fail (GTK_IS_ACTION_GROUP (action_group), FALSE); + + return action_group->priv->accel_group; +} + static void cb_set_action_visiblity (const gchar *name, GtkAction *action) @@ -770,7 +807,7 @@ gtk_action_group_set_visible (GtkActionGroup *action_group, g_return_if_fail (GTK_IS_ACTION_GROUP (action_group)); - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; visible = visible != FALSE; if (private->visible != visible) @@ -783,6 +820,47 @@ gtk_action_group_set_visible (GtkActionGroup *action_group, } } +static void +gtk_action_group_accel_group_foreach (gpointer key, gpointer val, gpointer data) +{ + gtk_action_set_accel_group (val, data); +} + +/** + * gtk_action_group_set_accel_group: + * @action_group: a #GtkActionGroup + * @accel_group: (allow-none): a #GtkAccelGroup to set or %NULL + * + * Sets the accelerator group to be used by every action in this group. + * + * Since: 3.6 + */ +void +gtk_action_group_set_accel_group (GtkActionGroup *action_group, + GtkAccelGroup *accel_group) +{ + GtkActionGroupPrivate *private; + + g_return_if_fail (GTK_IS_ACTION_GROUP (action_group)); + + private = action_group->priv; + + if (private->accel_group == accel_group) + return; + + g_clear_object (&private->accel_group); + + if (accel_group) + private->accel_group = g_object_ref (accel_group); + + /* Set the new accel group on every action */ + g_hash_table_foreach (private->actions, + gtk_action_group_accel_group_foreach, + accel_group); + + g_object_notify (G_OBJECT (action_group), "accel-group"); +} + /** * gtk_action_group_get_action: * @action_group: the action group @@ -813,7 +891,7 @@ check_unique_action (GtkActionGroup *action_group, { GtkActionGroupPrivate *private; - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; g_warning ("Refusing to add non-unique action '%s' to action group '%s'", action_name, @@ -854,12 +932,15 @@ gtk_action_group_add_action (GtkActionGroup *action_group, if (!check_unique_action (action_group, name)) return; - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; g_hash_table_insert (private->actions, (gpointer) name, g_object_ref (action)); g_object_set (action, I_("action-group"), action_group, NULL); + + if (private->accel_group) + gtk_action_set_accel_group (action, private->accel_group); } /** @@ -895,7 +976,7 @@ gtk_action_group_add_action_with_accel (GtkActionGroup *action_group, if (!check_unique_action (action_group, name)) return; - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; accel_path = g_strconcat ("/", private->name, "/", name, NULL); @@ -958,7 +1039,7 @@ gtk_action_group_remove_action (GtkActionGroup *action_group, name = gtk_action_get_name (action); g_return_if_fail (name != NULL); - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; g_hash_table_remove (private->actions, name); } @@ -991,7 +1072,7 @@ gtk_action_group_list_actions (GtkActionGroup *action_group) g_return_val_if_fail (GTK_IS_ACTION_GROUP (action_group), NULL); - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; g_hash_table_foreach (private->actions, add_single_action, &actions); @@ -1000,9 +1081,9 @@ gtk_action_group_list_actions (GtkActionGroup *action_group) /** - * gtk_action_group_add_actions: + * gtk_action_group_add_actions: (skip) * @action_group: the action group - * @entries: an array of action descriptions + * @entries: (array length=n_entries): an array of action descriptions * @n_entries: the number of entries * @user_data: data to pass to the action callbacks * @@ -1051,9 +1132,9 @@ shared_data_unref (gpointer data) /** - * gtk_action_group_add_actions_full: + * gtk_action_group_add_actions_full: (skip) * @action_group: the action group - * @entries: an array of action descriptions + * @entries: (array length=n_entries): an array of action descriptions * @n_entries: the number of entries * @user_data: data to pass to the action callbacks * @destroy: destroy notification callback for @user_data @@ -1131,9 +1212,9 @@ gtk_action_group_add_actions_full (GtkActionGroup *action_group, } /** - * gtk_action_group_add_toggle_actions: + * gtk_action_group_add_toggle_actions: (skip) * @action_group: the action group - * @entries: an array of toggle action descriptions + * @entries: (array length=n_entries): an array of toggle action descriptions * @n_entries: the number of entries * @user_data: data to pass to the action callbacks * @@ -1159,9 +1240,9 @@ gtk_action_group_add_toggle_actions (GtkActionGroup *action_group, /** - * gtk_action_group_add_toggle_actions_full: + * gtk_action_group_add_toggle_actions_full: (skip) * @action_group: the action group - * @entries: an array of toggle action descriptions + * @entries: (array length=n_entries): an array of toggle action descriptions * @n_entries: the number of entries * @user_data: data to pass to the action callbacks * @destroy: destroy notification callback for @user_data @@ -1240,9 +1321,9 @@ gtk_action_group_add_toggle_actions_full (GtkActionGroup *action_gro } /** - * gtk_action_group_add_radio_actions: + * gtk_action_group_add_radio_actions: (skip) * @action_group: the action group - * @entries: an array of radio action descriptions + * @entries: (array length=n_entries): an array of radio action descriptions * @n_entries: the number of entries * @value: the value of the action to activate initially, or -1 if * no action should be activated @@ -1273,9 +1354,9 @@ gtk_action_group_add_radio_actions (GtkActionGroup *action_group, } /** - * gtk_action_group_add_radio_actions_full: + * gtk_action_group_add_radio_actions_full: (skip) * @action_group: the action group - * @entries: an array of radio action descriptions + * @entries: (array length=n_entries): an array of radio action descriptions * @n_entries: the number of entries * @value: the value of the action to activate initially, or -1 if * no action should be activated @@ -1362,7 +1443,7 @@ gtk_action_group_add_radio_actions_full (GtkActionGroup *action_group * destroyed and when the translation function is changed again * * Sets a function to be used for translating the @label and @tooltip of - * #GtkActionGroupEntrys added by gtk_action_group_add_actions(). + * #GtkActionEntrys added by gtk_action_group_add_actions(). * * If you're using gettext(), it is enough to set the translation domain * with gtk_action_group_set_translation_domain(). @@ -1379,7 +1460,7 @@ gtk_action_group_set_translate_func (GtkActionGroup *action_group, g_return_if_fail (GTK_IS_ACTION_GROUP (action_group)); - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; if (private->translate_notify) private->translate_notify (private->translate_data); @@ -1403,7 +1484,8 @@ dgettext_swapped (const gchar *msgid, /** * gtk_action_group_set_translation_domain: * @action_group: a #GtkActionGroup - * @domain: the translation domain to use for g_dgettext() calls + * @domain: (allow-none): the translation domain to use for g_dgettext() + * calls, or %NULL to use the domain set with textdomain() * * Sets the translation domain and uses g_dgettext() for translating the * @label and @tooltip of #GtkActionEntrys added by @@ -1432,14 +1514,15 @@ gtk_action_group_set_translation_domain (GtkActionGroup *action_group, * @action_group: a #GtkActionGroup * @string: a string * - * Translates a string using the specified translate_func(). This + * Translates a string using the function set with + * gtk_action_group_set_translate_func(). This * is mainly intended for language bindings. * * Returns: the translation of @string * * Since: 2.6 **/ -G_CONST_RETURN gchar * +const gchar * gtk_action_group_translate_string (GtkActionGroup *action_group, const gchar *string) { @@ -1452,7 +1535,7 @@ gtk_action_group_translate_string (GtkActionGroup *action_group, if (string == NULL) return NULL; - private = GTK_ACTION_GROUP_GET_PRIVATE (action_group); + private = action_group->priv; translate_func = private->translate_func; translate_data = private->translate_data;