Do not set any flag for empty legacy menus
[hildon] / hildon / hildon-program.c
index ccac791..33205f0 100644 (file)
@@ -411,6 +411,32 @@ hildon_program_root_window_event_filter         (GdkXEvent *xevent,
     return GDK_FILTER_CONTINUE;
 }
 
+static void
+hildon_program_window_set_common_menu_flag (HildonWindow *window,
+                                            gboolean common_menu)
+{
+    if (HILDON_IS_WINDOW (window))
+    {
+        gboolean has_menu = hildon_window_get_app_menu (window) ||
+            hildon_window_get_main_menu (window);
+
+        if (!has_menu) {
+            hildon_window_set_menu_flag (window, common_menu);
+        }
+    }
+}
+
+static void
+hildon_program_set_common_menu_flag (HildonProgram *self,
+                                     gboolean common_menu)
+{
+    HildonProgramPrivate *priv = HILDON_PROGRAM_GET_PRIVATE (self);
+
+    g_slist_foreach (priv->windows,
+                     (GFunc) hildon_program_window_set_common_menu_flag,
+                     GINT_TO_POINTER (common_menu));
+}
+
 /* 
  * Checks if the window is the topmost window of the program and in
  * that case forces the window to take the common toolbar.
@@ -491,6 +517,9 @@ hildon_program_add_window                       (HildonProgram *self,
 
     hildon_window_set_program (window, G_OBJECT (self));
 
+    if (priv->common_menu || priv->common_app_menu)
+        hildon_program_window_set_common_menu_flag (window, TRUE);
+
     priv->windows = g_slist_append (priv->windows, window);
     priv->window_count ++;
 }
@@ -528,6 +557,9 @@ hildon_program_remove_window                    (HildonProgram *self,
         gdk_window_remove_filter (gdk_get_default_root_window(),
                 hildon_program_root_window_event_filter,
                 self);
+
+    if (priv->common_menu || priv->common_app_menu)
+        hildon_program_window_set_common_menu_flag (window, FALSE);
 }
 
 /**
@@ -593,8 +625,6 @@ hildon_program_get_can_hibernate                (HildonProgram *self)
  *
  * This method does not support #HildonAppMenu<!-- -->s. See
  * hildon_program_set_common_app_menu() for that.
- *
- * Since: 2.2
  **/
 void
 hildon_program_set_common_menu                  (HildonProgram *self, 
@@ -625,6 +655,21 @@ hildon_program_set_common_menu                  (HildonProgram *self,
         }
     }
 
+    /* Only set the menu flag if there was no common menu and
+       we are setting one. If we are unsetting the current common menu,
+       remove the commmon menu flag. Otherwise, nothing to do. */
+
+    GList *menu_children = gtk_container_get_children (GTK_CONTAINER (menu));
+    if (!priv->common_menu
+        && menu && menu_children != NULL) {
+        hildon_program_set_common_menu_flag (self, TRUE);
+    } else if (priv->common_menu &&
+               (!menu || menu_children == NULL))
+    {
+        hildon_program_set_common_menu_flag (self, FALSE);
+    }
+    g_list_free (menu_children);
+
     priv->common_menu = menu;
 
     if (priv->common_menu)
@@ -657,6 +702,14 @@ hildon_program_get_common_menu                  (HildonProgram *self)
     return priv->common_menu;
 }
 
+static void
+hildon_program_on_common_app_menu_changed       (HildonAppMenu *menu,
+                                                 HildonProgram *program)
+{
+    hildon_program_set_common_menu_flag (program,
+                                         hildon_app_menu_has_visible_children (menu));
+}
+
 /**
  * hildon_program_set_common_app_menu:
  * @self: The #HildonProgram in which the common menu should be used
@@ -688,14 +741,31 @@ hildon_program_set_common_app_menu              (HildonProgram *self,
 
     old_menu = priv->common_app_menu;
 
+    /* Only set the menu flag if there was no common menu and
+       we are setting one. If we are unsetting the current common menu,
+       remove the commmon menu flag. Otherwise, nothing to do. */
+    if (!priv->common_app_menu
+        && menu && hildon_app_menu_has_visible_children (menu)) {
+        hildon_program_set_common_menu_flag (self, TRUE);
+    } else if (priv->common_app_menu &&
+               (!menu || !hildon_app_menu_has_visible_children (menu))) {
+        hildon_program_set_common_menu_flag (self, FALSE);
+    }
+
     /* Set new menu */
     priv->common_app_menu = menu;
-    if (menu)
+    if (menu) {
+        g_signal_connect (menu, "changed",
+                          G_CALLBACK (hildon_program_on_common_app_menu_changed), self);
         g_object_ref_sink (menu);
+    }
 
     /* Hide and unref old menu */
     if (old_menu) {
         hildon_app_menu_set_parent_window (old_menu, NULL);
+        g_signal_handlers_disconnect_by_func (old_menu,
+                                              hildon_program_on_common_app_menu_changed,
+                                              self);
         g_object_unref (old_menu);
     }
 }