2008-03-03 Sven Herzberg <sven@imendio.com>
+ Fixes: MB#1220: HildonWindow should take GtkMenu accel_group into account
+
+ * examples/hildon-window-menu-example.c: (main): extended the window
+ menu example to serve as a testcase for automatically added
+ accelerator groups, too
+ * src/hildon-window.c: (hildon_window_add_accel_group),
+ (hildon_window_set_menu): added patch by Tommi Komulainen
+
+2008-03-03 Sven Herzberg <sven@imendio.com>
+
Fixes: MB#1276: wrong allocators used in hildon_window_get_borders
* src/hildon-window.c: (hildon_window_get_borders): don't imply any
hildon_program_add_window (program, HILDON_WINDOW (window));
GtkMenu *menu = GTK_MENU (gtk_menu_new ());
- GtkWidget *menu_item = gtk_menu_item_new_with_label ("Test item");
+ GtkAccelGroup *group = gtk_accel_group_new ();
+ gtk_menu_set_accel_group (menu, group);
+ GtkWidget *menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT,
+ gtk_menu_get_accel_group (menu));
gtk_widget_show (menu_item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
hildon_window_set_main_menu (HILDON_WINDOW (window), menu);
- g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL);
+ g_signal_connect_swapped (menu_item, "activate",
+ G_CALLBACK (gtk_object_destroy), window);
+
+ g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_show_all (GTK_WIDGET (window));
gtk_main ();
return GTK_MENU (priv->menu);
}
+/* Since we've been asking developers to call gtk_window_add_accel_group()
+ * themselves, do not trigger criticals by trying it again.
+ */
+static void
+hildon_window_add_accel_group (HildonWindow *self,
+ GtkAccelGroup *accel_group)
+{
+ GSList *groups, *l;
+
+ groups = gtk_accel_groups_from_object (G_OBJECT (self));
+ for (l = groups; l != NULL; l = l->next)
+ if (l->data == (gpointer)accel_group)
+ /* Maybe print a warning here? */
+ return;
+
+ gtk_window_add_accel_group (GTK_WINDOW (self), accel_group);
+}
+
/**
* hildon_window_set_main_menu:
* @self: A #HildonWindow
GtkMenu * menu)
{
HildonWindowPrivate *priv;
+ GtkAccelGroup *accel_group;
g_return_if_fail (HILDON_IS_WINDOW (self));
if (priv->menu != NULL)
{
+ accel_group = gtk_menu_get_accel_group (GTK_MENU (priv->menu));
+ if (accel_group != NULL)
+ gtk_window_remove_accel_group (GTK_WINDOW (self), accel_group);
+
gtk_menu_detach (GTK_MENU (priv->menu));
g_object_unref (priv->menu);
}
gtk_widget_set_name (priv->menu, "menu_force_with_corners");
gtk_menu_attach_to_widget (GTK_MENU (priv->menu), GTK_WIDGET (self), &detach_menu_func);
g_object_ref (GTK_MENU (priv->menu));
+
+ accel_group = gtk_menu_get_accel_group (GTK_MENU (priv->menu));
+ if (accel_group != NULL)
+ hildon_window_add_accel_group (self, accel_group);
}
}