#include "hildon-app-menu-private.h"
#include "hildon-find-toolbar.h"
#include "hildon-defines.h"
+#include "hildon-private.h"
#define _(String) gettext(String)
}
}
+static void
+hildon_window_update_menu_flag (HildonWindow *self,
+ gboolean is_app_menu)
+{
+ HildonWindowPrivate *priv;
+
+ priv = HILDON_WINDOW_GET_PRIVATE (self);
+
+ if (is_app_menu)
+ {
+ /* Change the menu flag only if there is no program or common
+ application menu. */
+ if (!priv->program ||
+ !hildon_program_get_common_app_menu (priv->program))
+ {
+ hildon_window_set_menu_flag (self, priv->app_menu != NULL &&
+ hildon_app_menu_has_visible_children (priv->app_menu));
+ }
+ } else {
+ if (!priv->program || !hildon_program_get_common_menu (priv->program))
+ {
+ GList *menu_children = gtk_container_get_children (GTK_CONTAINER (priv->menu));
+ hildon_window_set_menu_flag (self, priv->menu != NULL && menu_children != NULL);
+ g_free (menu_children);
+ }
+ }
+}
+
+static void
+on_menu_changed (HildonAppMenu *menu,
+ HildonWindow *window)
+{
+ hildon_window_update_menu_flag (window, TRUE);
+}
+
/*
* Sets the program to which the window belongs. This should only be called
* by hildon_program_add_window
gtk_window_add_accel_group (GTK_WINDOW (self), accel_group);
}
+static void
+do_set_has_menu (GtkWindow *window,
+ gpointer boolptr)
+{
+ gboolean has_menu = GPOINTER_TO_INT (boolptr);
+ hildon_gtk_window_set_clear_window_flag (window, "_HILDON_WM_WINDOW_MENU_INDICATOR",
+ XA_INTEGER, has_menu);
+ g_signal_handlers_disconnect_matched (window, G_SIGNAL_MATCH_FUNC,
+ 0, 0, NULL, do_set_has_menu, NULL);
+}
+
+void
+hildon_window_set_menu_flag (HildonWindow *window,
+ gboolean has_menu)
+{
+ hildon_gtk_window_set_flag (GTK_WINDOW (window), (HildonFlagFunc) do_set_has_menu,
+ GUINT_TO_POINTER (has_menu));
+}
+
/**
* hildon_window_set_main_menu:
* @self: A #HildonWindow
if (accel_group != NULL)
hildon_window_add_accel_group (self, accel_group);
}
+
+ hildon_window_update_menu_flag (self, FALSE);
}
/**
/* Add new menu */
priv->app_menu = menu;
if (menu)
+ {
g_object_ref_sink (menu);
+ g_signal_connect (menu, "changed", G_CALLBACK (on_menu_changed), self);
+ }
/* Unref old menu */
if (old_menu)
+ {
+ g_signal_handlers_disconnect_by_func (old_menu, on_menu_changed, self);
g_object_unref (old_menu);
+ }
+
+ hildon_window_update_menu_flag (self, TRUE);
}
/**