2008-03-03 Sven Herzberg <sven@imendio.com>
authorSven Herzberg <herzi@imendio.com>
Mon, 3 Mar 2008 08:00:31 +0000 (08:00 +0000)
committerSven Herzberg <herzi@imendio.com>
Mon, 3 Mar 2008 08:00:31 +0000 (08:00 +0000)
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

ChangeLog
examples/hildon-window-menu-example.c
src/hildon-window.c

index db27407..7797397 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 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
index 70b38e0..2e6d200 100644 (file)
@@ -40,13 +40,19 @@ main                                            (int argc,
     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 ();
index c1b2241..a9904c5 100644 (file)
@@ -1817,6 +1817,24 @@ hildon_window_get_menu                          (HildonWindow * self)
     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
@@ -1835,6 +1853,7 @@ hildon_window_set_main_menu (HildonWindow* self,
                             GtkMenu     * menu)
 {
     HildonWindowPrivate *priv;
+    GtkAccelGroup *accel_group;
 
     g_return_if_fail (HILDON_IS_WINDOW (self));
 
@@ -1842,6 +1861,10 @@ hildon_window_set_main_menu (HildonWindow* 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);
     }
@@ -1852,6 +1875,10 @@ hildon_window_set_main_menu (HildonWindow* self,
         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);
     }
 }