← Back to team overview

ayatana-commits team mailing list archive

[Branch ~dbusmenu-team/dbusmenu/trunk] Rev 142: Only send layout updates after we reach the idle portion of the mainloop. Reduces the number sen...

 

Merge authors:
  Ted Gould (ted)
Related merge proposals:
  https://code.launchpad.net/~ted/dbusmenu/glob-layout-updates/+merge/30466
  proposed by: Ted Gould (ted)
  review: Approve - Cody Russell (bratsche)
------------------------------------------------------------
revno: 142 [merge]
committer: Ted Gould <ted@xxxxxxxx>
branch nick: trunk
timestamp: Mon 2010-08-02 17:02:47 -0500
message:
  Only send layout updates after we reach the idle portion of the mainloop.  Reduces the number sent with rapid updates.
modified:
  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/server.c'
--- libdbusmenu-glib/server.c	2010-08-02 22:02:14 +0000
+++ libdbusmenu-glib/server.c	2010-08-02 22:02:47 +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) \
@@ -216,6 +219,7 @@
 	priv->root = NULL;
 	priv->dbusobject = NULL;
 	priv->layout_revision = 1;
+	priv->layout_idle = 0;
 
 	return;
 }
@@ -225,6 +229,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);
@@ -277,8 +285,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();
@@ -322,6 +329,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)
 {
@@ -352,10 +388,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;
 }
 
@@ -363,19 +396,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;
 }