2008-12-04 Alberto Garcia <agarcia@igalia.com>
authorAlberto Garcia <agarcia@igalia.com>
Thu, 4 Dec 2008 15:56:32 +0000 (15:56 +0000)
committerAlberto Garcia <agarcia@igalia.com>
Thu, 4 Dec 2008 15:56:32 +0000 (15:56 +0000)
* src/hildon-program.h
* src/hildon-program-private.h
* src/hildon-program.c (hildon_program_init)
(hildon_program_set_common_app_menu)
(hildon_program_get_common_app_menu):
New API for setting a common HildonAppMenu for all
HildonStackableWindows registered with the HildonProgram.

* src/hildon-stackable-window.c
(hildon_stackable_window_toggle_menu):
Use the common HildonAppMenu if a window doesn't have a specific
one.

* src/hildon-app-menu-private.h
* src/hildon-app-menu.c
(hildon_app_menu_get_parent_window):
Function to obtain the window a HildonAppMenu is attached to.
(hildon_app_menu_set_parent_window):
Hide the menu if the parent window is set to NULL.

ChangeLog
src/hildon-app-menu-private.h
src/hildon-app-menu.c
src/hildon-program-private.h
src/hildon-program.c
src/hildon-program.h
src/hildon-stackable-window.c

index df79c1d..c07c5c2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2008-12-04  Alberto Garcia  <agarcia@igalia.com>
+
+       * src/hildon-program.h
+       * src/hildon-program-private.h
+       * src/hildon-program.c (hildon_program_init)
+       (hildon_program_set_common_app_menu)
+       (hildon_program_get_common_app_menu):
+       New API for setting a common HildonAppMenu for all
+       HildonStackableWindows registered with the HildonProgram.
+
+       * src/hildon-stackable-window.c
+       (hildon_stackable_window_toggle_menu):
+       Use the common HildonAppMenu if a window doesn't have a specific
+       one.
+
+       * src/hildon-app-menu-private.h
+       * src/hildon-app-menu.c
+       (hildon_app_menu_get_parent_window):
+       Function to obtain the window a HildonAppMenu is attached to.
+       (hildon_app_menu_set_parent_window):
+       Hide the menu if the parent window is set to NULL.
+
 2008-12-04  Claudio Saavedra  <csaavedra@igalia.com>
 
        * src/hildon-gtk.c: (hildon_gtk_tree_view_new): Explicitly
index dd36b64..60778e1 100644 (file)
@@ -42,6 +42,9 @@ void G_GNUC_INTERNAL
 hildon_app_menu_set_parent_window              (HildonAppMenu *self,
                                                 GtkWindow     *parent_window);
 
+gpointer G_GNUC_INTERNAL
+hildon_app_menu_get_parent_window              (HildonAppMenu *self);
+
 G_END_DECLS
 
 #endif /* __HILDON_APP_MENU_PRIVATE_H__ */
index 0b41b64..2769637 100644 (file)
@@ -319,6 +319,21 @@ hildon_app_menu_set_parent_window              (HildonAppMenu *self,
     priv = HILDON_APP_MENU_GET_PRIVATE(self);
 
     priv->parent_window = parent_window;
+
+    if (parent_window == NULL && GTK_WIDGET_VISIBLE (self))
+        gtk_widget_hide (GTK_WIDGET (self));
+}
+
+gpointer G_GNUC_INTERNAL
+hildon_app_menu_get_parent_window              (HildonAppMenu *self)
+{
+    HildonAppMenuPrivate *priv;
+
+    g_return_val_if_fail (HILDON_IS_APP_MENU (self), NULL);
+
+    priv = HILDON_APP_MENU_GET_PRIVATE (self);
+
+    return priv->parent_window;
 }
 
 static void
index ae8666c..e61a641 100644 (file)
@@ -44,6 +44,7 @@ struct                                          _HildonProgramPrivate
     gboolean is_topmost;
     guint window_count;
     GtkWidget *common_menu;
+    GtkWidget *common_app_menu;
     GtkWidget *common_toolbar;
     GSList *windows;
     Window window_group;
index 3cb63fa..faff94c 100644 (file)
@@ -88,6 +88,7 @@
 #include                                        "hildon-program-private.h"
 #include                                        "hildon-window-private.h"
 #include                                        "hildon-window-stack.h"
+#include                                        "hildon-app-menu-private.h"
 
 static void
 hildon_program_init                             (HildonProgram *self);
@@ -151,6 +152,8 @@ hildon_program_init                             (HildonProgram *self)
     priv->window_count = 0;
     priv->is_topmost = FALSE;
     priv->window_group = GDK_WINDOW_XID (gdk_display_get_default_group (gdk_display_get_default()));
+    priv->common_menu = NULL;
+    priv->common_app_menu = NULL;
     priv->common_toolbar = NULL;
     priv->windows = NULL;
 }
@@ -571,9 +574,11 @@ hildon_program_get_can_hibernate                (HildonProgram *self)
  * Sets a GtkMenu that will appear in all the #HildonWindow registered
  * with the #HildonProgram. Only one common GtkMenu can be set, further
  * calls will detach the previous common GtkMenu. A #HildonWindow
- * can use it's own GtkMenu with hildon_window_set_menu()
+ * can use its own GtkMenu with hildon_window_set_menu()
  *
- * This method does not support #HildonAppMenu objects.
+ * This method is not intented for #HildonStackableWindow<!-- -->s and
+ * does not support #HildonAppMenu objects. See
+ * hildon_program_set_common_app_menu() for that.
  **/
 void
 hildon_program_set_common_menu                  (HildonProgram *self, 
@@ -635,6 +640,73 @@ hildon_program_get_common_menu                  (HildonProgram *self)
 }
 
 /**
+ * hildon_program_set_common_app_menu:
+ * @self: The #HildonProgram in which the common menu should be used
+ * @menu: A #HildonAppMenu to use as common menu for the program
+ *
+ * Sets a #HildonAppMenu that will appear in all the
+ * #HildonStackableWindow<!-- -->s registered with the
+ * #HildonProgram. Only one common #HildonAppMenu can be set, further
+ * calls will detach the previous common #HildonAppMenu. A
+ * #HildonStackableWindow can use its own #HildonAppMenu with
+ * hildon_stackable_window_set_main_menu()
+ *
+ * This method is not intented for standard #HildonWindow<!-- -->s and
+ * does not support #GtkMenu objects. See
+ * hildon_program_set_common_menu() for that.
+ *
+ * Since: Hildon 2.2
+ **/
+void
+hildon_program_set_common_app_menu              (HildonProgram *self,
+                                                 HildonAppMenu *menu)
+{
+    HildonProgramPrivate *priv;
+    GtkWidget *old_menu;
+
+    g_return_if_fail (HILDON_IS_PROGRAM (self));
+    g_return_if_fail (menu == NULL || HILDON_IS_APP_MENU (menu));
+
+    priv = HILDON_PROGRAM_GET_PRIVATE (self);
+    g_assert (priv);
+
+    old_menu = priv->common_app_menu;
+
+    /* Set new menu */
+    priv->common_app_menu = GTK_WIDGET (menu);
+    if (menu)
+        g_object_ref_sink (menu);
+
+    /* Hide and unref old menu */
+    if (old_menu) {
+        hildon_app_menu_set_parent_window (HILDON_APP_MENU (old_menu), NULL);
+        g_object_unref (old_menu);
+    }
+}
+
+/**
+ * hildon_program_get_common_app_menu:
+ * @self: The #HildonProgram from which to retrieve the common app menu
+ *
+ * Return value: the #HildonAppMenu that was set as common menu for this
+ * #HildonProgram, or %NULL of no common app menu was set.
+ *
+ * Since: Hildon 2.2
+ **/
+HildonAppMenu*
+hildon_program_get_common_app_menu              (HildonProgram *self)
+{
+    HildonProgramPrivate *priv;
+
+    g_return_val_if_fail (HILDON_IS_PROGRAM (self), NULL);
+
+    priv = HILDON_PROGRAM_GET_PRIVATE (self);
+    g_assert (priv);
+
+    return HILDON_APP_MENU (priv->common_app_menu);
+}
+
+/**
  * hildon_program_set_common_toolbar:
  * @self: The #HildonProgram in which the common toolbar should be used
  * @toolbar: A GtkToolbar to use as common toolbar for the program
index 4bb5422..8732262 100644 (file)
@@ -101,6 +101,13 @@ GtkMenu*
 hildon_program_get_common_menu                  (HildonProgram *self);
 
 void
+hildon_program_set_common_app_menu              (HildonProgram *self,
+                                                 HildonAppMenu *menu);
+
+HildonAppMenu*
+hildon_program_get_common_app_menu              (HildonProgram *self);
+
+void
 hildon_program_set_common_toolbar               (HildonProgram *self, 
                                                  GtkToolbar *toolbar);
 
index df95905..06be0b8 100644 (file)
@@ -98,6 +98,8 @@
 #include                                        "hildon-app-menu-private.h"
 #include                                        "hildon-window-stack.h"
 #include                                        "hildon-window-stack-private.h"
+#include                                        "hildon-window-private.h"
+#include                                        "hildon-program.h"
 
 G_DEFINE_TYPE (HildonStackableWindow, hildon_stackable_window, HILDON_TYPE_WINDOW);
 
@@ -182,28 +184,38 @@ hildon_stackable_window_toggle_menu             (HildonWindow *self,
                                                 guint32 time)
 {
     HildonStackableWindowPrivate *priv;
+    HildonAppMenu *menu_to_use = NULL;
 
     g_return_val_if_fail (HILDON_IS_STACKABLE_WINDOW (self), FALSE);
     priv = HILDON_STACKABLE_WINDOW_GET_PRIVATE (self);
     g_assert (priv != NULL);
 
-    if (priv->app_menu)
-    {
-        if (GTK_WIDGET_MAPPED (GTK_WIDGET (priv->app_menu))) {
-            gtk_widget_hide (GTK_WIDGET (priv->app_menu));
+    if (priv->app_menu) {
+        menu_to_use = priv->app_menu;
+    } else {
+        HildonProgram *program = HILDON_WINDOW_GET_PRIVATE (self)->program;
+
+        if (program) {
+            menu_to_use = hildon_program_get_common_app_menu (program);
+            if (menu_to_use) {
+                if (self != hildon_app_menu_get_parent_window (HILDON_APP_MENU (menu_to_use)))
+                    gtk_widget_hide (GTK_WIDGET (menu_to_use));
+            }
+        }
+    }
+
+    if (menu_to_use) {
+        if (GTK_WIDGET_MAPPED (GTK_WIDGET (menu_to_use))) {
+            gtk_widget_hide (GTK_WIDGET (menu_to_use));
         } else {
-            hildon_app_menu_set_parent_window (priv->app_menu, GTK_WINDOW (self));
-            gtk_widget_show (GTK_WIDGET (priv->app_menu));
+            hildon_app_menu_set_parent_window (menu_to_use, GTK_WINDOW (self));
+            gtk_widget_show (GTK_WIDGET (menu_to_use));
         }
 
         return TRUE;
-    }
-    else if (HILDON_WINDOW_CLASS (hildon_stackable_window_parent_class)->toggle_menu)
-    {
+    } else if (HILDON_WINDOW_CLASS (hildon_stackable_window_parent_class)->toggle_menu) {
         return HILDON_WINDOW_CLASS (hildon_stackable_window_parent_class)->toggle_menu (self, button, time);
-    }
-    else
-    {
+    } else {
         return FALSE;
     }
 }