+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
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__ */
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
gboolean is_topmost;
guint window_count;
GtkWidget *common_menu;
+ GtkWidget *common_app_menu;
GtkWidget *common_toolbar;
GSList *windows;
Window window_group;
#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);
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;
}
* 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,
}
/**
+ * 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
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);
#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);
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;
}
}