← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~ted/dbusmenu/glob-layout-updates into lp:dbusmenu

 

Ted Gould has proposed merging lp:~ted/dbusmenu/glob-layout-updates into lp:dbusmenu with lp:~ted/dbusmenu/glob-property-requests as a prerequisite.

Requested reviews:
  DBus Menu Team (dbusmenu-team)


This branch makes it so that layout updates are sent once every visit to the idle loop.  So sets of updates are pulled together to a single signal.
-- 
https://code.launchpad.net/~ted/dbusmenu/glob-layout-updates/+merge/30466
Your team ayatana-commits is subscribed to branch lp:dbusmenu.
=== modified file 'libdbusmenu-glib/server.c'
--- libdbusmenu-glib/server.c	2010-07-20 21:03:42 +0000
+++ libdbusmenu-glib/server.c	2010-07-20 21:03:42 +0000
@@ -48,6 +48,8 @@
 
 #include "dbusmenu-server.h"
 
+static void layout_update_signal (DbusmenuServer * server);
+
 #define DBUSMENU_VERSION_NUMBER  2
 
 /* Privates, I'll show you mine... */
@@ -58,6 +60,7 @@
 	DbusmenuMenuitem * root;
 	gchar * dbusobject;
 	gint layout_revision;
+	guint layout_idle;
 };
 
 #define DBUSMENU_SERVER_GET_PRIVATE(o) \
@@ -199,6 +202,7 @@
 	priv->root = NULL;
 	priv->dbusobject = NULL;
 	priv->layout_revision = 1;
+	priv->layout_idle = 0;
 
 	return;
 }
@@ -208,6 +212,10 @@
 {
 	DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(object);
 
+	if (priv->layout_idle != 0) {
+		g_source_remove(priv->layout_idle);
+	}
+
 	if (priv->root != NULL) {
 		dbusmenu_menuitem_foreach(priv->root, menuitem_signals_remove, object);
 		g_object_unref(priv->root);
@@ -260,8 +268,7 @@
 		} else {
 			g_debug("Setting root node to NULL");
 		}
-		priv->layout_revision++;
-		g_signal_emit(obj, signals[LAYOUT_UPDATED], 0, priv->layout_revision, 0, TRUE);
+		layout_update_signal(DBUSMENU_SERVER(obj));
 		break;
 	default:
 		g_return_if_reached();
@@ -305,6 +312,35 @@
 	return;
 }
 
+/* Handle actually signalling in the idle loop.  This way we collect all
+   the updates. */
+static gboolean
+layout_update_idle (gpointer user_data)
+{
+	DbusmenuServer * server = DBUSMENU_SERVER(user_data);
+	DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
+
+	g_signal_emit(G_OBJECT(server), signals[LAYOUT_UPDATED], 0, priv->layout_revision, 0, TRUE);
+
+	priv->layout_idle = 0;
+
+	return FALSE;
+}
+
+/* Signals that the layout has been updated */
+static void
+layout_update_signal (DbusmenuServer * server)
+{
+	DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
+	priv->layout_revision++;
+
+	if (priv->layout_idle == 0) {
+		priv->layout_idle = g_idle_add(layout_update_idle, server);
+	}
+
+	return;
+}
+
 static void 
 menuitem_property_changed (DbusmenuMenuitem * mi, gchar * property, GValue * value, DbusmenuServer * server)
 {
@@ -335,10 +371,7 @@
 	menuitem_signals_create(child, server);
 	g_list_foreach(dbusmenu_menuitem_get_children(child), added_check_children, server);
 
-	/* TODO: We probably need to group the layout update signals to make the number more reasonble. */
-	DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
-	priv->layout_revision++;
-	g_signal_emit(G_OBJECT(server), signals[LAYOUT_UPDATED], 0, priv->layout_revision, 0, TRUE);
+	layout_update_signal(server);
 	return;
 }
 
@@ -346,19 +379,14 @@
 menuitem_child_removed (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, DbusmenuServer * server)
 {
 	menuitem_signals_remove(child, server);
-	/* TODO: We probably need to group the layout update signals to make the number more reasonble. */
-	DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
-	priv->layout_revision++;
-	g_signal_emit(G_OBJECT(server), signals[LAYOUT_UPDATED], 0, priv->layout_revision, 0, TRUE);
+	layout_update_signal(server);
 	return;
 }
 
 static void 
 menuitem_child_moved (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint newpos, guint oldpos, DbusmenuServer * server)
 {
-	DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
-	priv->layout_revision++;
-	g_signal_emit(G_OBJECT(server), signals[LAYOUT_UPDATED], 0, priv->layout_revision, 0, TRUE);
+	layout_update_signal(server);
 	return;
 }
 

=== modified file 'tests/test-glib-layout-server.c'
--- tests/test-glib-layout-server.c	2010-07-20 21:03:42 +0000
+++ tests/test-glib-layout-server.c	2010-02-05 07:18:24 +0000
@@ -78,7 +78,6 @@
 	GError * error = NULL;
 
 	g_type_init();
-	g_log_set_always_fatal(G_LOG_LEVEL_WARNING);
 
 	DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
 	g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL))));


Follow ups