From 967ee6c8d454b83c96f720d8bd5827e9ce6f9a34 Mon Sep 17 00:00:00 2001 From: Aurelien Gateau Date: Fri, 2 Apr 2010 16:50:34 +0200 Subject: Document "visible" property --- libdbusmenu-glib/dbus-menu.xml | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/dbus-menu.xml b/libdbusmenu-glib/dbus-menu.xml index ad21f68..7937049 100644 --- a/libdbusmenu-glib/dbus-menu.xml +++ b/libdbusmenu-glib/dbus-menu.xml @@ -81,6 +81,12 @@ License version 3 and version 2.1 along with this program. If not, see Whether the item can be activated or not. true + + visible + boolean + True if the item is visible in the menu. + true + icon-name string -- cgit v1.2.3 From 3dbca0954d9f02df4c9a45a2d4573000d5b4a622 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 14 Apr 2010 11:37:25 -0500 Subject: A couple of code review comments --- libdbusmenu-glib/client.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index f5546a2..3ce0ccb 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -748,6 +748,7 @@ parse_layout_xml(DbusmenuClient * client, xmlNodePtr node, DbusmenuMenuitem * it if (parent != NULL) { dbusmenu_menuitem_child_delete(parent, item); } + /* XXX: Should this be an unref? Who's reffing this that it exists without a parent? */ g_object_unref(G_OBJECT(item)); item = NULL; } @@ -773,6 +774,7 @@ parse_layout_xml(DbusmenuClient * client, xmlNodePtr node, DbusmenuMenuitem * it } } else { /* Refresh the properties */ + /* XXX: We shouldn't need to get the properties everytime we reuse an entry */ gchar * properties[1] = {NULL}; /* This gets them all */ org_ayatana_dbusmenu_get_properties_async(proxy, id, (const gchar **)properties, menuitem_get_properties_replace_cb, item); } -- cgit v1.2.3 From 19dfb9380fc86a873a30a8c748c78689a2bf6d33 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 14 Apr 2010 16:50:43 -0500 Subject: Fail if we add a child to a menu that already has that child. --- libdbusmenu-glib/menuitem.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index fce8ed5..2b4f9ca 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -533,6 +533,8 @@ dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + g_return_val_if_fail(g_list_find(priv->children, child), FALSE); + priv->children = g_list_append(priv->children, child); #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), g_list_length(priv->children) - 1); @@ -558,6 +560,8 @@ dbusmenu_menuitem_child_prepend (DbusmenuMenuitem * mi, DbusmenuMenuitem * child g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + g_return_val_if_fail(g_list_find(priv->children, child), FALSE); + priv->children = g_list_prepend(priv->children, child); #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), 0); @@ -611,6 +615,8 @@ dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + g_return_val_if_fail(g_list_find(priv->children, child), FALSE); + priv->children = g_list_insert(priv->children, child, position); #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), position); -- cgit v1.2.3 From a97cd5fdfba888c256b1bf0ec0fd28e869974281 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 14 Apr 2010 16:58:17 -0500 Subject: Return error if we can't find parent in a buildxml routine --- libdbusmenu-glib/server.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index d87c024..02c9c57 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -404,6 +404,16 @@ _dbusmenu_server_get_layout (DbusmenuServer * server, gint parent, guint * revis } } else { DbusmenuMenuitem * item = dbusmenu_menuitem_find_id(priv->root, parent); + if (item == NULL) { + if (error != NULL) { + g_set_error(error, + error_quark(), + INVALID_MENUITEM_ID, + "The ID supplied %d does not refer to a menu item we have", + parent); + } + return FALSE; + } dbusmenu_menuitem_buildxml(item, xmlarray); } g_ptr_array_add(xmlarray, NULL); -- cgit v1.2.3 From 9284777a7a53b0aa247b63d8b99359be7dd88296 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 14 Apr 2010 17:05:48 -0500 Subject: Keep an internal reference to the children. --- libdbusmenu-glib/menuitem.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 2b4f9ca..93d32a1 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -449,6 +449,7 @@ take_children_signal (gpointer data, gpointer user_data) #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child removed %d (%s)", ID(user_data), LABEL(user_data), ID(data), LABEL(data)); #endif + g_object_unref(G_OBJECT(data)); g_signal_emit(G_OBJECT(user_data), signals[CHILD_REMOVED], 0, DBUSMENU_MENUITEM(data), TRUE); return; } @@ -539,6 +540,7 @@ dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), g_list_length(priv->children) - 1); #endif + g_object_ref(G_OBJECT(child)); g_signal_emit(G_OBJECT(mi), signals[CHILD_ADDED], 0, child, g_list_length(priv->children) - 1, TRUE); return TRUE; } @@ -566,6 +568,7 @@ dbusmenu_menuitem_child_prepend (DbusmenuMenuitem * mi, DbusmenuMenuitem * child #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), 0); #endif + g_object_ref(G_OBJECT(child)); g_signal_emit(G_OBJECT(mi), signals[CHILD_ADDED], 0, child, 0, TRUE); return TRUE; } @@ -592,6 +595,7 @@ dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child removed %d (%s)", ID(mi), LABEL(mi), ID(child), LABEL(child)); #endif + g_object_unref(G_OBJECT(child)); g_signal_emit(G_OBJECT(mi), signals[CHILD_REMOVED], 0, child, TRUE); return TRUE; } @@ -621,6 +625,7 @@ dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), position); #endif + g_object_ref(G_OBJECT(child)); g_signal_emit(G_OBJECT(mi), signals[CHILD_ADDED], 0, child, position, TRUE); return TRUE; } -- cgit v1.2.3 From 42c0196f242841499c9b464e9b1176c4ee048faa Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 14 Apr 2010 17:13:17 -0500 Subject: Truth sucks --- libdbusmenu-glib/menuitem.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 93d32a1..e519473 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -534,7 +534,7 @@ dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); - g_return_val_if_fail(g_list_find(priv->children, child), FALSE); + g_return_val_if_fail(g_list_find(priv->children, child) != NULL, FALSE); priv->children = g_list_append(priv->children, child); #ifdef MASSIVEDEBUGGING @@ -562,7 +562,7 @@ dbusmenu_menuitem_child_prepend (DbusmenuMenuitem * mi, DbusmenuMenuitem * child g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); - g_return_val_if_fail(g_list_find(priv->children, child), FALSE); + g_return_val_if_fail(g_list_find(priv->children, child) != NULL, FALSE); priv->children = g_list_prepend(priv->children, child); #ifdef MASSIVEDEBUGGING @@ -619,7 +619,7 @@ dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); - g_return_val_if_fail(g_list_find(priv->children, child), FALSE); + g_return_val_if_fail(g_list_find(priv->children, child) != NULL, FALSE); priv->children = g_list_insert(priv->children, child, position); #ifdef MASSIVEDEBUGGING -- cgit v1.2.3 From 2ace387168eb78ef8bc8e919619516e4f1cffdc6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 14 Apr 2010 17:18:27 -0500 Subject: Man I suck --- libdbusmenu-glib/menuitem.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index e519473..515fd36 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -534,7 +534,7 @@ dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); - g_return_val_if_fail(g_list_find(priv->children, child) != NULL, FALSE); + g_return_val_if_fail(g_list_find(priv->children, child) == NULL, FALSE); priv->children = g_list_append(priv->children, child); #ifdef MASSIVEDEBUGGING @@ -562,7 +562,7 @@ dbusmenu_menuitem_child_prepend (DbusmenuMenuitem * mi, DbusmenuMenuitem * child g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); - g_return_val_if_fail(g_list_find(priv->children, child) != NULL, FALSE); + g_return_val_if_fail(g_list_find(priv->children, child) == NULL, FALSE); priv->children = g_list_prepend(priv->children, child); #ifdef MASSIVEDEBUGGING @@ -619,7 +619,7 @@ dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); - g_return_val_if_fail(g_list_find(priv->children, child) != NULL, FALSE); + g_return_val_if_fail(g_list_find(priv->children, child) == NULL, FALSE); priv->children = g_list_insert(priv->children, child, position); #ifdef MASSIVEDEBUGGING -- cgit v1.2.3 From a2170ac67ad0f5065922108479ccce3338e777d8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 14 Apr 2010 23:40:22 -0500 Subject: Adding two functions to set and get the realized state. --- libdbusmenu-glib/menuitem-private.h | 2 ++ libdbusmenu-glib/menuitem.c | 42 +++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/menuitem-private.h b/libdbusmenu-glib/menuitem-private.h index 1c7c16a..3a0c026 100644 --- a/libdbusmenu-glib/menuitem-private.h +++ b/libdbusmenu-glib/menuitem-private.h @@ -34,6 +34,8 @@ License version 3 and version 2.1 along with this program. If not, see G_BEGIN_DECLS void dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray * array); +gboolean dbusmenu_menuitem_realized (DbusmenuMenuitem * mi); +void dbusmenu_menuitem_set_realized (DbusmenuMenuitem * mi); G_END_DECLS diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 515fd36..dac491b 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -59,6 +59,7 @@ struct _DbusmenuMenuitemPrivate GList * children; GHashTable * properties; gboolean root; + gboolean realized; }; /* Signals */ @@ -278,6 +279,7 @@ dbusmenu_menuitem_init (DbusmenuMenuitem *self) priv->properties = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, _g_value_free); priv->root = FALSE; + priv->realized = FALSE; return; } @@ -422,6 +424,46 @@ dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi) return ret; } +/** + dbusmenu_menuitem_realized: + @mi: #DbusmenuMenuitem to check on + + This function returns whether the menuitem has been realized or + not. This is significant mostly in client implementations that + can use this additional state to see if the second layers of + the implementation have been built yet. + + Return value: Returns whether or not the menu item has been realized + yet or not. +*/ +gboolean +dbusmenu_menuitem_realized (DbusmenuMenuitem * mi) +{ + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), FALSE); + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + return priv->realized; +} + +/** + dbusmenu_menuitem_set_realized: + @mi: #DbusmenuMenuitem to realize + + Sets the internal variable tracking whether it's been realized and + signals the DbusmenuMenuitem::realized event. +*/ +void +dbusmenu_menuitem_set_realized (DbusmenuMenuitem * mi) +{ + g_return_if_fail(DBUSMENU_IS_MENUITEM(mi)); + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + if (priv->realized) { + g_warning("Realized entry realized again? ID: %d", dbusmenu_menuitem_get_id(mi)); + } + priv->realized = TRUE; + g_signal_emit(G_OBJECT(mi), signals[REALIZED], 0, TRUE); + return; +} + /** dbusmenu_menuitem_get_children: @mi: The #DbusmenuMenuitem to query. -- cgit v1.2.3 From 914b2a38181afb26ed2c8e1254c5bdb562f9e9df Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 14 Apr 2010 23:41:32 -0500 Subject: Use the set realized function in the client. --- libdbusmenu-glib/client.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 3ce0ccb..d61b1ae 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -35,6 +35,7 @@ License version 3 and version 2.1 along with this program. If not, see #include "client.h" #include "menuitem.h" +#include "menuitem-private.h" #include "client-menuitem.h" #include "dbusmenu-client.h" #include "server-marshal.h" @@ -645,7 +646,7 @@ menuitem_get_properties_new_cb (DBusGProxy * proxy, GHashTable * properties, GEr #ifdef MASSIVEDEBUGGING g_debug("Client has realized a menuitem: %d", dbusmenu_menuitem_get_id(propdata->item)); #endif - g_signal_emit(G_OBJECT(propdata->item), DBUSMENU_MENUITEM_SIGNAL_REALIZED_ID, 0, TRUE); + dbusmenu_menuitem_set_realized(propdata->item); if (!handled) { g_signal_emit(G_OBJECT(propdata->client), signals[NEW_MENUITEM], 0, propdata->item, TRUE); -- cgit v1.2.3 From 5148e0fd0106c1012f19be45c4bf79b187ad4d96 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 14 Apr 2010 23:47:01 -0500 Subject: Adding a function to only get the position in the children that are realized. --- libdbusmenu-glib/menuitem.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ libdbusmenu-glib/menuitem.h | 1 + 2 files changed, 45 insertions(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index dac491b..220f7e5 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -559,6 +559,50 @@ dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent return count; } +/** + dbusmenu_menuitem_get_position_realized: + @mi: The #DbusmenuMenuitem to find the position of + @parent: The #DbusmenuMenuitem who's children contain @mi + + This function is very similar to #dbusmenu_menuitem_get_position + except that it only counts in the children that have been realized. + + Return value: The position of @mi in the realized children of @parent. +*/ +guint +dbusmenu_menuitem_get_position_realized (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent) +{ + #ifdef MASSIVEDEBUGGING + if (!DBUSMENU_IS_MENUITEM(mi)) g_warning("Getting position of %d (%s), it's at: %d (mi fail)", ID(mi), LABEL(mi), 0); + if (!DBUSMENU_IS_MENUITEM(parent)) g_warning("Getting position of %d (%s), it's at: %d (parent fail)", ID(mi), LABEL(mi), 0); + #endif + + /* TODO: I'm not too happy returning zeros here. But that's all I've got */ + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), 0); + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(parent), 0); + + GList * childs = dbusmenu_menuitem_get_children(parent); + if (childs == NULL) return 0; + guint count = 0; + for ( ; childs != NULL; childs = childs->next, count++) { + if (!dbusmenu_menuitem_realized(DBUSMENU_MENUITEM(childs->data))) { + count--; + continue; + } + if (childs->data == mi) { + break; + } + } + + if (childs == NULL) return 0; + + #ifdef MASSIVEDEBUGGING + g_debug("Getting position of %d (%s), it's at: %d", ID(mi), LABEL(mi), count); + #endif + + return count; +} + /** dbusmenu_menuitem_child_append: @mi: The #DbusmenuMenuitem which will become a new parent diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index cb6b8f4..e5b5ae2 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -148,6 +148,7 @@ gint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi); GList * dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi); GList * dbusmenu_menuitem_take_children (DbusmenuMenuitem * mi) G_GNUC_WARN_UNUSED_RESULT; guint dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent); +guint dbusmenu_menuitem_get_position_realized (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent); gboolean dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child); gboolean dbusmenu_menuitem_child_prepend (DbusmenuMenuitem * mi, DbusmenuMenuitem * child); -- cgit v1.2.3 From 623b9c346ee991dfbff7fe89ff80834127a39014 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Apr 2010 10:43:31 -0500 Subject: Unreffing the object after it's been put into a menu. --- libdbusmenu-glib/client.c | 1 + 1 file changed, 1 insertion(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index d61b1ae..910f9a1 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -810,6 +810,7 @@ parse_layout_xml(DbusmenuClient * client, xmlNodePtr node, DbusmenuMenuitem * it dbusmenu_menuitem_child_delete(item, childmi); } dbusmenu_menuitem_child_add_position(item, newchildmi, position); + g_object_unref(newchildmi); } else { dbusmenu_menuitem_child_reorder(item, childmi, position); } -- cgit v1.2.3 From 6085d46272fb067b475f433ecf5a5477dfa4e721 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Apr 2010 10:47:39 -0500 Subject: Since we already have a ref to root, we don't need to make another. --- libdbusmenu-glib/client.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 910f9a1..f5e7115 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -848,9 +848,6 @@ parse_layout (DbusmenuClient * client, const gchar * layout) xmlNodePtr root = xmlDocGetRootElement(xmldoc); DbusmenuMenuitem * oldroot = priv->root; - if (oldroot != NULL) { - g_object_ref(oldroot); - } priv->root = parse_layout_xml(client, root, priv->root, NULL, priv->menuproxy); xmlFreeDoc(xmldoc); -- cgit v1.2.3 From e606dae698cb9a4e15fdc260c68744cbee7c3c82 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Apr 2010 11:04:16 -0500 Subject: Reffing oldroot again. --- libdbusmenu-glib/client.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index f5e7115..910f9a1 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -848,6 +848,9 @@ parse_layout (DbusmenuClient * client, const gchar * layout) xmlNodePtr root = xmlDocGetRootElement(xmldoc); DbusmenuMenuitem * oldroot = priv->root; + if (oldroot != NULL) { + g_object_ref(oldroot); + } priv->root = parse_layout_xml(client, root, priv->root, NULL, priv->menuproxy); xmlFreeDoc(xmldoc); -- cgit v1.2.3 From f8cf97fa209b64c4f466cda3c33bbec068a4539c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Apr 2010 11:43:06 -0500 Subject: Make sure to send the signal *before* unrefing so the object exists --- libdbusmenu-glib/menuitem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 220f7e5..6a3c4bc 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -491,8 +491,8 @@ take_children_signal (gpointer data, gpointer user_data) #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child removed %d (%s)", ID(user_data), LABEL(user_data), ID(data), LABEL(data)); #endif - g_object_unref(G_OBJECT(data)); g_signal_emit(G_OBJECT(user_data), signals[CHILD_REMOVED], 0, DBUSMENU_MENUITEM(data), TRUE); + g_object_unref(G_OBJECT(data)); return; } @@ -681,8 +681,8 @@ dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child removed %d (%s)", ID(mi), LABEL(mi), ID(child), LABEL(child)); #endif - g_object_unref(G_OBJECT(child)); g_signal_emit(G_OBJECT(mi), signals[CHILD_REMOVED], 0, child, TRUE); + g_object_unref(G_OBJECT(child)); return TRUE; } -- cgit v1.2.3 From 541193c9c95a4ee22286a9f43abf05741361f702 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Apr 2010 11:50:20 -0500 Subject: Removing the unref that was causing issues so that we can remove an extra ref of the root item. --- libdbusmenu-glib/client.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 910f9a1..c8706ac 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -749,8 +749,6 @@ parse_layout_xml(DbusmenuClient * client, xmlNodePtr node, DbusmenuMenuitem * it if (parent != NULL) { dbusmenu_menuitem_child_delete(parent, item); } - /* XXX: Should this be an unref? Who's reffing this that it exists without a parent? */ - g_object_unref(G_OBJECT(item)); item = NULL; } @@ -848,9 +846,6 @@ parse_layout (DbusmenuClient * client, const gchar * layout) xmlNodePtr root = xmlDocGetRootElement(xmldoc); DbusmenuMenuitem * oldroot = priv->root; - if (oldroot != NULL) { - g_object_ref(oldroot); - } priv->root = parse_layout_xml(client, root, priv->root, NULL, priv->menuproxy); xmlFreeDoc(xmldoc); -- cgit v1.2.3 From e45ecac9a2dad70c782c33e8d2f9b3ce295238a3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Apr 2010 12:13:20 -0500 Subject: Adding references when calling the properties callbacks as items could get destroyed in transit. --- libdbusmenu-glib/client.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index c8706ac..3df5c6a 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -367,6 +367,7 @@ id_update (DBusGProxy * proxy, gint id, DbusmenuClient * client) gchar * properties[1] = {NULL}; /* This gets them all */ g_debug("Getting properties"); + g_object_ref(menuitem); org_ayatana_dbusmenu_get_properties_async(proxy, id, (const gchar **)properties, menuitem_get_properties_cb, menuitem); return; } @@ -574,10 +575,12 @@ menuitem_get_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError g_return_if_fail(DBUSMENU_IS_MENUITEM(data)); if (error != NULL) { g_warning("Error getting properties on a menuitem: %s", error->message); + g_object_unref(data); return; } g_hash_table_foreach(properties, get_properties_helper, data); g_hash_table_destroy(properties); + g_object_unref(data); return; } @@ -606,6 +609,8 @@ menuitem_get_properties_replace_cb (DBusGProxy * proxy, GHashTable * properties, if (!have_error) { menuitem_get_properties_cb(proxy, properties, error, data); + } else { + g_object_unref(data); } return; @@ -618,6 +623,7 @@ menuitem_get_properties_new_cb (DBusGProxy * proxy, GHashTable * properties, GEr { if (error != NULL) { g_warning("Error getting properties on a new menuitem: %s", error->message); + g_object_unref(data); return; } g_return_if_fail(data != NULL); @@ -625,6 +631,7 @@ menuitem_get_properties_new_cb (DBusGProxy * proxy, GHashTable * properties, GEr newItemPropData * propdata = (newItemPropData *)data; DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(propdata->client); + g_object_ref(propdata->item); menuitem_get_properties_cb (proxy, properties, error, propdata->item); gboolean handled = FALSE; @@ -652,6 +659,7 @@ menuitem_get_properties_new_cb (DBusGProxy * proxy, GHashTable * properties, GEr g_signal_emit(G_OBJECT(propdata->client), signals[NEW_MENUITEM], 0, propdata->item, TRUE); } + g_object_unref(propdata->item); g_free(propdata); return; @@ -767,6 +775,7 @@ parse_layout_xml(DbusmenuClient * client, xmlNodePtr node, DbusmenuMenuitem * it propdata->parent = parent; gchar * properties[1] = {NULL}; /* This gets them all */ + g_object_ref(item); org_ayatana_dbusmenu_get_properties_async(proxy, id, (const gchar **)properties, menuitem_get_properties_new_cb, propdata); } else { g_warning("Unable to allocate memory to get properties for menuitem. This menuitem will never be realized."); @@ -775,6 +784,7 @@ parse_layout_xml(DbusmenuClient * client, xmlNodePtr node, DbusmenuMenuitem * it /* Refresh the properties */ /* XXX: We shouldn't need to get the properties everytime we reuse an entry */ gchar * properties[1] = {NULL}; /* This gets them all */ + g_object_ref(item); org_ayatana_dbusmenu_get_properties_async(proxy, id, (const gchar **)properties, menuitem_get_properties_replace_cb, item); } -- cgit v1.2.3 From e26f80a52f0453ee7efaca86487f5e04a17fd35b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Apr 2010 12:21:02 -0500 Subject: Now that we're not reffing the root locally, we need to only unref it if we're changing roots --- libdbusmenu-glib/client.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 3df5c6a..d2ba541 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -873,17 +873,14 @@ parse_layout (DbusmenuClient * client, const gchar * layout) clean up that old root */ if (oldroot != NULL) { dbusmenu_menuitem_set_root(oldroot, FALSE); + g_object_unref(oldroot); + oldroot = NULL; } /* If the root changed we can signal that */ g_signal_emit(G_OBJECT(client), signals[ROOT_CHANGED], 0, priv->root, TRUE); } - /* We need to unref it in this function no matter */ - if (oldroot != NULL) { - g_object_unref(oldroot); - } - return 1; } -- cgit v1.2.3 From 59602b1fbb159f181a416ca710108b24d114e8db Mon Sep 17 00:00:00 2001 From: Aurelien Gateau Date: Mon, 3 May 2010 15:48:17 +0200 Subject: Added main page --- libdbusmenu-glib/dbus-menu.xml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/dbus-menu.xml b/libdbusmenu-glib/dbus-menu.xml index 7937049..7bccf28 100644 --- a/libdbusmenu-glib/dbus-menu.xml +++ b/libdbusmenu-glib/dbus-menu.xml @@ -29,12 +29,18 @@ License version 3 and version 2.1 along with this program. If not, see --> + Date: Sun, 9 May 2010 17:12:51 +0200 Subject: Check to make sure they're real nodes before parsing more. --- libdbusmenu-glib/client.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index d2ba541..c0d3b7a 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -533,6 +533,9 @@ build_proxies (DbusmenuClient * client) static gint parse_node_get_id (xmlNodePtr node) { + if (node->type != XML_ELEMENT_NODE) { + return -1; + } if (g_strcmp0((gchar *)node->name, "menu") != 0) { /* This kills some nodes early */ g_warning("XML Node is not 'menu' it is '%s'", node->name); -- cgit v1.2.3 From 7ca5934ac17a21b066daf98aceb2af086b2cf1b6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 20 May 2010 09:57:03 -0500 Subject: Changing the name of the gir files and adding namespace flags to make everything shrink correctly. --- libdbusmenu-glib/Makefile.am | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/Makefile.am b/libdbusmenu-glib/Makefile.am index c1aff41..4a5e1f6 100644 --- a/libdbusmenu-glib/Makefile.am +++ b/libdbusmenu-glib/Makefile.am @@ -106,14 +106,15 @@ if HAVE_INTROSPECTION introspection_sources = $(libdbusmenu_glibinclude_HEADERS) -DbusmenuGlib-0.2.gir: libdbusmenu-glib.la -DbusmenuGlib_0_2_gir_INCLUDES = \ +Dbusmenu_Glib-0.2.gir: libdbusmenu-glib.la +Dbusmenu_Glib_0_2_gir_INCLUDES = \ GObject-2.0 -DbusmenuGlib_0_2_gir_CFLAGS = $(DBUSMENUGLIB_CFLAGS) -DbusmenuGlib_0_2_gir_LIBS = libdbusmenu-glib.la -DbusmenuGlib_0_2_gir_FILES = $(addprefix $(srcdir)/, $(introspection_sources)) +Dbusmenu_Glib_0_2_gir_CFLAGS = $(DBUSMENUGLIB_CFLAGS) +Dbusmenu_Glib_0_2_gir_LIBS = libdbusmenu-glib.la +Dbusmenu_Glib_0_2_gir_FILES = $(addprefix $(srcdir)/, $(introspection_sources)) +Dbusmenu_Glib_0_2_gir_NAMESPACE = Dbusmenu -INTROSPECTION_GIRS += DbusmenuGlib-0.2.gir +INTROSPECTION_GIRS += Dbusmenu-Glib-0.2.gir girdir = $(datadir)/gir-1.0 gir_DATA = $(INTROSPECTION_GIRS) @@ -132,10 +133,10 @@ endif if HAVE_INTROSPECTION vapidir = $(datadir)/vala/vapi -vapi_DATA = DbusmenuGlib-0.2.vapi +vapi_DATA = Dbusmenu-Glib-0.2.vapi -DbusmenuGlib-0.2.vapi: DbusmenuGlib-0.2.gir - $(VALA_API_GEN) --library=DbusmenuGlib-0.2 $< +Dbusmenu-Glib-0.2.vapi: Dbusmenu-Glib-0.2.gir + $(VALA_API_GEN) --library=Dbusmenu-Glib-0.2 $< CLEANFILES += $(vapi_DATA) -- cgit v1.2.3 From 2950a5ff83f5754b50c249be3d5ff4f0cedf55c1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 20 May 2010 10:30:06 -0500 Subject: Adding c includes to the introspector --- libdbusmenu-glib/Makefile.am | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/Makefile.am b/libdbusmenu-glib/Makefile.am index 4a5e1f6..87a8cb0 100644 --- a/libdbusmenu-glib/Makefile.am +++ b/libdbusmenu-glib/Makefile.am @@ -99,7 +99,9 @@ menuitem-marshal.c: $(srcdir)/menuitem-marshal.list -include $(INTROSPECTION_MAKEFILE) INTROSPECTION_GIRS = -INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir) +INTROSPECTION_SCANNER_ARGS = \ + --add-include-path=$(srcdir) \ + $(addprefix --c-include=libdbusmenu-glib/, $(introspection_sources)) INTROSPECTION_COMPILER_ARGS = --includedir=$(builddir) if HAVE_INTROSPECTION -- cgit v1.2.3 From a02759840b6bd595a0f6871539acf68233b39a13 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 21 May 2010 13:37:36 -0500 Subject: Changing the version string to match how people refer to the gir file. --- libdbusmenu-glib/Makefile.am | 1 + 1 file changed, 1 insertion(+) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/Makefile.am b/libdbusmenu-glib/Makefile.am index 87a8cb0..3df1513 100644 --- a/libdbusmenu-glib/Makefile.am +++ b/libdbusmenu-glib/Makefile.am @@ -115,6 +115,7 @@ Dbusmenu_Glib_0_2_gir_CFLAGS = $(DBUSMENUGLIB_CFLAGS) Dbusmenu_Glib_0_2_gir_LIBS = libdbusmenu-glib.la Dbusmenu_Glib_0_2_gir_FILES = $(addprefix $(srcdir)/, $(introspection_sources)) Dbusmenu_Glib_0_2_gir_NAMESPACE = Dbusmenu +Dbusmenu_Glib_0_2_gir_VERSION = Glib-0.2 INTROSPECTION_GIRS += Dbusmenu-Glib-0.2.gir -- cgit v1.2.3 From 23bda1f081c96c21af4f645e936fa746013c46a2 Mon Sep 17 00:00:00 2001 From: Aurelien Gateau Date: Thu, 27 May 2010 16:44:35 +0200 Subject: Make sure the ItemUpdated signal matches with what is written in the xml file --- libdbusmenu-glib/server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libdbusmenu-glib') diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 02c9c57..0da66cc 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -146,8 +146,8 @@ dbusmenu_server_class_init (DbusmenuServerClass *class) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(DbusmenuServerClass, id_update), NULL, NULL, - g_cclosure_marshal_VOID__UINT, - G_TYPE_NONE, 1, G_TYPE_UINT); + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT); /** DbusmenuServer::layout-updated: @arg0: The #DbusmenuServer emitting the signal. -- cgit v1.2.3