aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@canonical.com>2009-08-27 12:52:30 -0500
committerTed Gould <ted@canonical.com>2009-08-27 12:52:30 -0500
commit1765940759064c0d7cd8428a3c89fa862f24f076 (patch)
treed7579a00d32431b1424947fcee4d53188c7c590c
parent409e654b54e19d0e50d200a706487d141c5cf89f (diff)
downloadayatana-indicator-session-1765940759064c0d7cd8428a3c89fa862f24f076.tar.gz
ayatana-indicator-session-1765940759064c0d7cd8428a3c89fa862f24f076.tar.bz2
ayatana-indicator-session-1765940759064c0d7cd8428a3c89fa862f24f076.zip
Instead of populating the menu on added, populate it on realization.
-rw-r--r--src/indicator-session.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/indicator-session.c b/src/indicator-session.c
index 07efc86..43c568f 100644
--- a/src/indicator-session.c
+++ b/src/indicator-session.c
@@ -61,6 +61,7 @@ static void child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, gu
static guint status_menu_pos_offset (void);
static guint users_menu_pos_offset (void);
static guint session_menu_pos_offset (void);
+static void child_realized (DbusmenuMenuitem * child, gpointer userdata);
GtkLabel *
get_label (void)
@@ -79,14 +80,44 @@ get_icon (void)
return status_image;
}
+typedef struct _realized_data_t realized_data_t;
+struct _realized_data_t {
+ guint position;
+ section_t section;
+};
+
static void
child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position, gpointer section)
{
+ realized_data_t * data = g_new0(realized_data_t, 1);
+ if (data == NULL) {
+ g_warning("Unable to allocate data for realization of item");
+ return;
+ }
+
+ data->position = position;
+ data->section = GPOINTER_TO_UINT(section);
+
+ g_signal_connect(G_OBJECT(child), DBUSMENU_MENUITEM_SIGNAL_REALIZED, G_CALLBACK(child_realized), data);
+ return;
+}
+
+static void
+child_realized (DbusmenuMenuitem * child, gpointer userdata)
+{
+ g_return_if_fail(userdata != NULL);
+ g_return_if_fail(DBUSMENU_IS_MENUITEM(child));
+
+ realized_data_t * data = (realized_data_t *)userdata;
+ guint position = data->position;
+ section_t section = data->section;
+ g_free(data);
+
DbusmenuGtkClient * client = NULL;
gchar * errorstr = NULL;
guint (*posfunc) (void) = NULL;
- switch (GPOINTER_TO_UINT(section)) {
+ switch (section) {
case STATUS_SECTION:
client = status_client;
errorstr = "Status";