← Back to team overview

ayatana-commits team mailing list archive

[Branch ~dbusmenu-team/dbusmenu/trunk] Rev 227: Only send property updates if the item has been already requested.

 

Merge authors:
  Ted Gould (ted)
Related merge proposals:
  https://code.launchpad.net/~ted/dbusmenu/expose-yourself/+merge/50384
  proposed by: Ted Gould (ted)
  review: Approve - Kalle Valo (kvalo)
------------------------------------------------------------
revno: 227 [merge]
committer: Ted Gould <ted@xxxxxxxx>
branch nick: trunk
timestamp: Thu 2011-02-24 08:34:48 -0600
message:
  Only send property updates if the item has been already requested.
modified:
  libdbusmenu-glib/menuitem-private.h
  libdbusmenu-glib/menuitem.c
  libdbusmenu-glib/server.c


--
lp:dbusmenu
https://code.launchpad.net/~dbusmenu-team/dbusmenu/trunk

Your team ayatana-commits is subscribed to branch lp:dbusmenu.
To unsubscribe from this branch go to https://code.launchpad.net/~dbusmenu-team/dbusmenu/trunk/+edit-subscription
=== 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:21:14 +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-24 14:33:38 +0000
+++ libdbusmenu-glib/menuitem.c	2011-02-24 14:34:48 +0000
@@ -61,6 +61,7 @@
 	gboolean root;
 	gboolean realized;
 	DbusmenuDefaults * defaults;
+	gboolean exposed;
 };
 
 /* Signals */
@@ -316,6 +317,7 @@
 	priv->realized = FALSE;
 
 	priv->defaults = dbusmenu_defaults_ref_default();
+	priv->exposed = FALSE;
 	
 	return;
 }
@@ -1439,6 +1441,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)) {
@@ -1621,3 +1625,13 @@
 	g_warn_if_reached();
 	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-24 14:33:38 +0000
+++ libdbusmenu-glib/server.c	2011-02-24 14:34:48 +0000
@@ -791,7 +791,7 @@
 
 typedef struct _prop_idle_item_t prop_idle_item_t;
 struct _prop_idle_item_t {
-	gint id;
+	DbusmenuMenuitem * mi;
 	GArray * array;
 };
 
@@ -821,6 +821,7 @@
 			}
 		}
 
+		g_object_unref(G_OBJECT(iitem->mi));
 		g_array_free(iitem->array, TRUE);
 	}
 
@@ -854,6 +855,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;
 
@@ -891,7 +898,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) {
@@ -908,7 +915,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) {
@@ -921,9 +928,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);
@@ -936,6 +945,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);
@@ -946,7 +956,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,
@@ -989,7 +999,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;
 		}
@@ -999,7 +1009,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);