Commit 1c6d0c3e authored by Matthias Clasen's avatar Matthias Clasen Committed by Allison Karlitskaya

GtkApplicationWindow: Set the accel group on constructed windows

This will make the menuitems pick up matching accel map entries
automatically. Currently, nothing creates such accel map entries,
though.
parent 9d62d24d
......@@ -122,7 +122,7 @@ gtk_application_window_update_menubar (GtkApplicationWindow *window)
g_menu_append_section (combined, NULL, G_MENU_MODEL (window->priv->app_menu_section));
g_menu_append_section (combined, NULL, G_MENU_MODEL (window->priv->menubar_section));
window->priv->menubar = gtk_model_menu_create_menu_bar (G_MENU_MODEL (combined), G_ACTION_OBSERVABLE (muxer));
window->priv->menubar = gtk_model_menu_create_menu_bar (G_MENU_MODEL (combined), G_ACTION_OBSERVABLE (muxer), window->priv->accels);
gtk_widget_set_parent (window->priv->menubar, GTK_WIDGET (window));
gtk_widget_show_all (window->priv->menubar);
g_object_unref (combined);
......
......@@ -33,6 +33,7 @@
typedef struct {
GActionObservable *actions;
GMenuModel *model;
GtkAccelGroup *accels;
GtkMenuShell *shell;
guint update_idle;
GSList *connected;
......@@ -85,7 +86,7 @@ gtk_model_menu_binding_append_item (GtkModelMenuBinding *binding,
{
GtkMenuItem *item;
item = gtk_model_menu_item_new (model, item_index, binding->actions);
item = gtk_model_menu_item_new (model, item_index, binding->actions, binding->accels);
gtk_menu_shell_append (binding->shell, GTK_WIDGET (item));
gtk_widget_show (GTK_WIDGET (item));
binding->n_items++;
......@@ -225,6 +226,7 @@ void
gtk_model_menu_bind (GtkMenuShell *shell,
GMenuModel *model,
GActionObservable *actions,
GtkAccelGroup *accels,
gboolean with_separators)
{
GtkModelMenuBinding *binding;
......@@ -232,6 +234,7 @@ gtk_model_menu_bind (GtkMenuShell *shell,
binding = g_slice_new (GtkModelMenuBinding);
binding->model = g_object_ref (model);
binding->actions = g_object_ref (actions);
binding->accels = accels;
binding->shell = shell;
binding->update_idle = 0;
binding->connected = NULL;
......@@ -243,24 +246,27 @@ gtk_model_menu_bind (GtkMenuShell *shell,
GtkWidget *
gtk_model_menu_create_menu (GMenuModel *model,
GActionObservable *actions)
GActionObservable *actions,
GtkAccelGroup *accels)
{
GtkWidget *menu;
menu = gtk_menu_new ();
gtk_model_menu_bind (GTK_MENU_SHELL (menu), model, actions, TRUE);
gtk_menu_set_accel_group (GTK_MENU (menu), accels);
gtk_model_menu_bind (GTK_MENU_SHELL (menu), model, actions, accels, TRUE);
return menu;
}
GtkWidget *
gtk_model_menu_create_menu_bar (GMenuModel *model,
GActionObservable *actions)
GActionObservable *actions,
GtkAccelGroup *accels)
{
GtkWidget *menubar;
menubar = gtk_menu_bar_new ();
gtk_model_menu_bind (GTK_MENU_SHELL (menubar), model, actions, FALSE);
gtk_model_menu_bind (GTK_MENU_SHELL (menubar), model, actions, accels, FALSE);
return menubar;
}
......
......@@ -24,20 +24,24 @@
#include <gtk/gactionobservable.h>
#include <gtk/gtkmenushell.h>
#include <gtk/gtkaccelgroup.h>
#include <gio/gio.h>
G_GNUC_INTERNAL
void gtk_model_menu_bind (GtkMenuShell *shell,
GMenuModel *model,
GActionObservable *actions,
GtkAccelGroup *accels,
gboolean with_separators);
G_GNUC_INTERNAL
GtkWidget * gtk_model_menu_create_menu_bar (GMenuModel *model,
GActionObservable *actions);
GActionObservable *actions,
GtkAccelGroup *accels);
G_GNUC_INTERNAL
GtkWidget * gtk_model_menu_create_menu (GMenuModel *model,
GActionObservable *actions);
GActionObservable *actions,
GtkAccelGroup *accels);
#endif /* __GTK_MODEL_MENU_H__ */
......@@ -23,6 +23,7 @@
#include "gtkmodelmenuitem.h"
#include "gtkaccelmap.h"
#include "gtkmodelmenu.h"
struct _GtkModelMenuItem
......@@ -188,11 +189,28 @@ gtk_model_menu_item_action_removed (GActionObserver *observer,
gtk_widget_queue_resize (GTK_WIDGET (item));
}
static gchar *
get_accel_path (const gchar *action_name,
GVariant *parameter)
{
GString *s;
s = g_string_new ("<Actions>/");
g_string_append (s, action_name);
if (parameter)
{
g_string_append_c (s, '/');
g_variant_print_string (parameter, s, FALSE);
}
return g_string_free (s, FALSE);
}
static void
gtk_model_menu_item_setup (GtkModelMenuItem *item,
GMenuModel *model,
gint item_index,
GActionObservable *actions)
GActionObservable *actions,
GtkAccelGroup *accels)
{
GMenuAttributeIter *iter;
GMenuModel *submenu;
......@@ -201,7 +219,7 @@ gtk_model_menu_item_setup (GtkModelMenuItem *item,
if ((submenu = g_menu_model_get_item_link (model, item_index, "submenu")))
{
gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), gtk_model_menu_create_menu (submenu, actions));
gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), gtk_model_menu_create_menu (submenu, actions, accels));
g_object_unref (submenu);
}
......@@ -228,6 +246,7 @@ gtk_model_menu_item_setup (GtkModelMenuItem *item,
const GVariantType *type;
gboolean enabled;
GVariant *state;
gchar *path;
/* observer already causes us to hold a hard ref on the group */
item->actions = G_ACTION_GROUP (actions);
......@@ -242,6 +261,10 @@ gtk_model_menu_item_setup (GtkModelMenuItem *item,
if (state != NULL)
g_variant_unref (state);
path = get_accel_path (item->action_name, item->target);
gtk_menu_item_set_accel_path (GTK_MENU_ITEM (item), path);
g_free (path);
}
}
......@@ -284,13 +307,14 @@ gtk_model_menu_item_class_init (GtkModelMenuItemClass *class)
GtkMenuItem *
gtk_model_menu_item_new (GMenuModel *model,
gint item_index,
GActionObservable *actions)
GActionObservable *actions,
GtkAccelGroup *accels)
{
GtkModelMenuItem *item;
item = g_object_new (GTK_TYPE_MODEL_MENU_ITEM, NULL);
gtk_model_menu_item_setup (item, model, item_index, actions);
gtk_model_menu_item_setup (item, model, item_index, actions, accels);
return GTK_MENU_ITEM (item);
}
......@@ -39,6 +39,7 @@ GType gtk_model_menu_item_get_type (void) G
G_GNUC_INTERNAL
GtkMenuItem * gtk_model_menu_item_new (GMenuModel *model,
gint item_index,
GActionObservable *actions);
GActionObservable *actions,
GtkAccelGroup *accels);
#endif /* __GTK_MODEL_MENU_ITEM_H__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment