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.
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 ++;
}
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);
}
/**
*
* 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,
}
}
+ /* 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)
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
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);
}
}