diff options
author | Ryan Lortie <desrt@desrt.ca> | 2012-09-10 14:36:23 -0400 |
---|---|---|
committer | Ryan Lortie <desrt@desrt.ca> | 2012-09-17 12:31:22 -0400 |
commit | 778aa7ade0107fa645ab1427132551d138c7334a (patch) | |
tree | ecb61096cd6d72d7dc4f4362f8158d2f3c9bcdf8 /gtk/gtkmodelmenuitem.c | |
parent | 338b5f6c2dc6cdb73ec3dfb6973b2269d4664b80 (diff) | |
download | gtk+-778aa7ade0107fa645ab1427132551d138c7334a.tar.gz |
GtkAccelLabel: add manual accel API
Add an API to GtkAccelLabel for hardcoding the accel key to be displayed
(ie: allowing us to bypass the GtkAccelGroup lookup).
Use that from the GMenuModel-based GtkMenu construction code instead of
passing around the accel group.
This makes accel labels work in bloatpad again.
This patch effectively removes any hope of automatic runtime accel
changes in GMenuModel-based menus without additional application
support but it leaves the door open for this to be supported again in
the future (if we decide that it's important).
https://bugzilla.gnome.org/show_bug.cgi?id=683738
Diffstat (limited to 'gtk/gtkmodelmenuitem.c')
-rw-r--r-- | gtk/gtkmodelmenuitem.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/gtk/gtkmodelmenuitem.c b/gtk/gtkmodelmenuitem.c index 450cd9a4bf..61e10e5a3c 100644 --- a/gtk/gtkmodelmenuitem.c +++ b/gtk/gtkmodelmenuitem.c @@ -25,6 +25,7 @@ #include "gtkactionhelper.h" #include "gtkmodelmenu.h" #include "gtkwidgetprivate.h" +#include "gtkaccellabel.h" struct _GtkModelMenuItem { @@ -107,8 +108,7 @@ static void gtk_model_menu_item_setup (GtkModelMenuItem *item, GMenuModel *model, gint item_index, - const gchar *action_namespace, - GtkAccelGroup *accels) + const gchar *action_namespace) { GMenuAttributeIter *iter; GMenuModel *submenu; @@ -125,12 +125,12 @@ gtk_model_menu_item_setup (GtkModelMenuItem *item, if (action_namespace) { gchar *namespace = g_strjoin (".", action_namespace, section_namespace, NULL); - menu = gtk_model_menu_create_menu (submenu, namespace, accels); + menu = gtk_model_menu_create_menu (submenu, namespace); g_free (namespace); } else { - menu = gtk_model_menu_create_menu (submenu, section_namespace, accels); + menu = gtk_model_menu_create_menu (submenu, section_namespace); } gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu); @@ -145,6 +145,26 @@ gtk_model_menu_item_setup (GtkModelMenuItem *item, if (g_str_equal (key, "label") && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) gtk_menu_item_set_label (GTK_MENU_ITEM (item), g_variant_get_string (value, NULL)); + else if (g_str_equal (key, "accel") && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) + { + GdkModifierType modifiers; + guint key; + + gtk_accelerator_parse (g_variant_get_string (value, NULL), &key, &modifiers); + + if (key) + { + GtkAccelLabel *accel_label; + + /* Ensure that the GtkAccelLabel has been created... */ + (void) gtk_menu_item_get_label (GTK_MENU_ITEM (item)); + accel_label = GTK_ACCEL_LABEL (gtk_bin_get_child (GTK_BIN (item))); + g_assert (accel_label); + + gtk_accel_label_set_accel (accel_label, key, modifiers); + } + } + else if (g_str_equal (key, "action") && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) gtk_actionable_set_namespaced_action_name (GTK_ACTIONABLE (item), action_namespace, g_variant_get_string (value, NULL)); @@ -260,14 +280,13 @@ gtk_model_menu_item_class_init (GtkModelMenuItemClass *class) GtkMenuItem * gtk_model_menu_item_new (GMenuModel *model, gint item_index, - const gchar *action_namespace, - GtkAccelGroup *accels) + const gchar *action_namespace) { GtkModelMenuItem *item; item = g_object_new (GTK_TYPE_MODEL_MENU_ITEM, NULL); - gtk_model_menu_item_setup (item, model, item_index, action_namespace, accels); + gtk_model_menu_item_setup (item, model, item_index, action_namespace); return GTK_MENU_ITEM (item); } |