← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~ted/dbusmenu/expose-yourself into lp:dbusmenu

 

Ted Gould has proposed merging lp:~ted/dbusmenu/expose-yourself into lp:dbusmenu.

Requested reviews:
  DBus Menu Team (dbusmenu-team)

For more details, see:
https://code.launchpad.net/~ted/dbusmenu/expose-yourself/+merge/50384

Track whether a menu item has been shown onto dbus before before it's property updates are sent as well.  This should, in some cases, remove property update signals all together.
-- 
https://code.launchpad.net/~ted/dbusmenu/expose-yourself/+merge/50384
Your team ayatana-commits is subscribed to branch lp:dbusmenu.
=== modified file 'libdbusmenu-glib/menuitem-private.h'
--- libdbusmenu-glib/menuitem-private.h	2011-02-15 04:32:51 +0000
+++ libdbusmenu-glib/menuitem-private.h	2011-02-18 19:53:01 +0000
@@ -38,6 +38,7 @@
 void dbusmenu_menuitem_set_realized (DbusmenuMenuitem * mi);
 GVariant * dbusmenu_menuitem_properties_variant (DbusmenuMenuitem * mi, const gchar ** properties);
 gboolean dbusmenu_menuitem_property_is_default (DbusmenuMenuitem * mi, const gchar * property);
+gboolean dbusmenu_menuitem_exposed (DbusmenuMenuitem * mi);
 
 G_END_DECLS
 

=== modified file 'libdbusmenu-glib/menuitem.c'
--- libdbusmenu-glib/menuitem.c	2011-02-15 17:42:52 +0000
+++ libdbusmenu-glib/menuitem.c	2011-02-18 19:53:01 +0000
@@ -59,6 +59,7 @@
 	GHashTable * properties;
 	gboolean root;
 	gboolean realized;
+	gboolean exposed;
 };
 
 /* Signals */
@@ -312,6 +313,7 @@
 
 	priv->root = FALSE;
 	priv->realized = FALSE;
+	priv->exposed = FALSE;
 	
 	return;
 }
@@ -1338,6 +1340,8 @@
 dbusmenu_menuitem_build_variant (DbusmenuMenuitem * mi, const gchar ** properties, gint recurse)
 {
 	g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), NULL);
+	DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi);
+	priv->exposed = TRUE;
 
 	gint id = 0;
 	if (!dbusmenu_menuitem_get_root(mi)) {
@@ -1507,3 +1511,13 @@
 	/* No defaults system yet */
 	return FALSE;
 }
+
+/* Check to see if this menu item has been sent into the bus yet or
+   not.  If no one cares we can give less info */
+gboolean
+dbusmenu_menuitem_exposed (DbusmenuMenuitem * mi)
+{
+	g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), FALSE);
+	DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi);
+	return priv->exposed;
+}

=== modified file 'libdbusmenu-glib/server.c'
--- libdbusmenu-glib/server.c	2011-02-15 17:42:52 +0000
+++ libdbusmenu-glib/server.c	2011-02-18 19:53:01 +0000
@@ -656,7 +656,7 @@
 
 typedef struct _prop_idle_item_t prop_idle_item_t;
 struct _prop_idle_item_t {
-	gint id;
+	DbusmenuMenuitem * mi;
 	GArray * array;
 };
 
@@ -686,6 +686,7 @@
 			}
 		}
 
+		g_object_unref(G_OBJECT(iitem->mi));
 		g_array_free(iitem->array, TRUE);
 	}
 
@@ -719,6 +720,12 @@
 	for (i = 0; i < priv->prop_array->len; i++) {
 		prop_idle_item_t * iitem = &g_array_index(priv->prop_array, prop_idle_item_t, i);
 
+		/* if it's not exposed we're going to block it's properties
+		   from getting into the dbus message */
+		if (dbusmenu_menuitem_exposed(iitem->mi) == FALSE) {
+			continue;
+		}
+
 		GVariantBuilder dictbuilder;
 		gboolean dictinit = FALSE;
 
@@ -756,7 +763,7 @@
 			GVariantBuilder tuplebuilder;
 			g_variant_builder_init(&tuplebuilder, G_VARIANT_TYPE_TUPLE);
 
-			g_variant_builder_add_value(&tuplebuilder, g_variant_new_int32(iitem->id));
+			g_variant_builder_add_value(&tuplebuilder, g_variant_new_int32(dbusmenu_menuitem_get_id(iitem->mi)));
 			g_variant_builder_add_value(&tuplebuilder, g_variant_builder_end(&dictbuilder));
 
 			if (!item_init) {
@@ -773,7 +780,7 @@
 			GVariantBuilder tuplebuilder;
 			g_variant_builder_init(&tuplebuilder, G_VARIANT_TYPE_TUPLE);
 
-			g_variant_builder_add_value(&tuplebuilder, g_variant_new_int32(iitem->id));
+			g_variant_builder_add_value(&tuplebuilder, g_variant_new_int32(dbusmenu_menuitem_get_id(iitem->mi)));
 			g_variant_builder_add_value(&tuplebuilder, g_variant_builder_end(&removedictbuilder));
 
 			if (!removeitem_init) {
@@ -786,9 +793,11 @@
 	}
 
 	GVariant * megadata[2];
+	gboolean gotsomething = FALSE;
 
 	if (item_init) {
 		megadata[0] = g_variant_builder_end(&itembuilder);
+		gotsomething = TRUE;
 	} else {
 		GError * error = NULL;
 		megadata[0] = g_variant_parse(G_VARIANT_TYPE("a(ia{sv})"), "[ ]", NULL, NULL, &error);
@@ -801,6 +810,7 @@
 
 	if (removeitem_init) {
 		megadata[1] = g_variant_builder_end(&removeitembuilder);
+		gotsomething = TRUE;
 	} else {
 		GError * error = NULL;
 		megadata[1] = g_variant_parse(G_VARIANT_TYPE("a(ia(s))"), "[ ]", NULL, NULL, &error);
@@ -811,7 +821,7 @@
 		}
 	}
 
-	if (priv->dbusobject != NULL && priv->bus != NULL) {
+	if (gotsomething && priv->dbusobject != NULL && priv->bus != NULL) {
 		g_dbus_connection_emit_signal(priv->bus,
 		                              NULL,
 		                              priv->dbusobject,
@@ -854,7 +864,7 @@
 	prop_idle_item_t * item = NULL;
 	for (i = 0; i < priv->prop_array->len; i++) {
 		prop_idle_item_t * iitem = &g_array_index(priv->prop_array, prop_idle_item_t, i);
-		if (iitem->id == item_id) {
+		if (iitem->mi == mi) {
 			item = iitem;
 			break;
 		}
@@ -864,7 +874,8 @@
 	/* If not, we'll need to build ourselves one */
 	if (item == NULL) {
 		prop_idle_item_t myitem;
-		myitem.id = item_id;
+		myitem.mi = mi;
+		g_object_ref(G_OBJECT(mi));
 		myitem.array = g_array_new(FALSE, FALSE, sizeof(prop_idle_prop_t));
 
 		g_array_append_val(priv->prop_array, myitem);


Follow ups