X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkactiongroup.c;h=ac177e1ab3d2b6bfdf119af56b6321e03e12c735;hb=bb3c56abe2e7916126bd4f8234dee080b5381941;hp=cab79ee2d155480772a0a96ce4b91665b8533861;hpb=4fe044b77ddbfbbd797cc10b332631f33c807bdb;p=~andy%2Fgtk diff --git a/gtk/gtkactiongroup.c b/gtk/gtkactiongroup.c index cab79ee2d..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 . */ /* @@ -28,6 +26,66 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ +/** + * SECTION:gtkactiongroup + * @Short_description: A group of actions + * @Title: GtkActionGroup + * + * Actions are organised into groups. An action group is essentially a + * map from names to #GtkAction objects. + * + * All actions that would make sense to use in a particular context + * should be in a single group. Multiple action groups may be used for a + * particular user interface. In fact, it is expected that most nontrivial + * applications will make use of multiple groups. For example, in an + * application that can edit multiple documents, one group holding global + * actions (e.g. quit, about, new), and one group per document holding + * actions that act on that document (eg. save, cut/copy/paste, etc). Each + * window's menus would be constructed from a combination of two action + * groups. + * + * + * Accelerators are handled by the GTK+ accelerator map. All actions are + * assigned an accelerator path (which normally has the form + * <Actions>/group-name/action-name) + * and a shortcut is associated with this accelerator path. All menuitems + * and toolitems take on this accelerator path. The GTK+ accelerator map + * code makes sure that the correct shortcut is displayed next to the menu + * item. + * + * + * GtkActionGroup as GtkBuildable + * + * The #GtkActionGroup implementation of the #GtkBuildable interface accepts + * #GtkAction objects as <child> elements in UI definitions. + * + * Note that it is probably more common to define actions and action groups + * in the code, since they are directly related to what the code can do. + * + * The GtkActionGroup implementation of the GtkBuildable interface supports + * a custom <accelerator> element, which has attributes named key and + * modifiers and allows to specify accelerators. This is similar to the + * <accelerator> element of #GtkWidget, the main difference is that + * it doesn't allow you to specify a signal. + * + * + * A #GtkDialog UI definition fragment. + * + * + * + * About + * gtk-about + * + * + * + * + * + * ]]> + * + * + */ + #include "config.h" #include @@ -43,9 +101,7 @@ #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)) struct _GtkActionGroupPrivate { @@ -53,6 +109,7 @@ struct _GtkActionGroupPrivate gboolean sensitive; gboolean visible; GHashTable *actions; + GtkAccelGroup *accel_group; GtkTranslateFunc translate_func; gpointer translate_data; @@ -73,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); @@ -185,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: @@ -291,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; @@ -333,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); } @@ -342,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; } @@ -436,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 ("/", @@ -474,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; @@ -487,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; @@ -495,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); @@ -512,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) { @@ -527,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; @@ -543,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) { @@ -556,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; @@ -568,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); } @@ -583,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; } @@ -615,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; } @@ -647,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) @@ -680,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) @@ -711,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) @@ -724,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 @@ -754,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, @@ -795,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); } /** @@ -836,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); @@ -899,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); } @@ -932,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); @@ -941,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 * @@ -992,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 @@ -1072,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 * @@ -1100,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 @@ -1181,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 @@ -1214,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 @@ -1303,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(). @@ -1320,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); @@ -1344,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 @@ -1373,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) { @@ -1393,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; @@ -1436,6 +1578,3 @@ _gtk_action_group_emit_post_activate (GtkActionGroup *action_group, { g_signal_emit (action_group, action_group_signals[POST_ACTIVATE], 0, action); } - -#define __GTK_ACTION_GROUP_C__ -#include "gtkaliasdef.c"