[gnome-shell] Compress notifications of menu changes with a timeout.
- From: Owen Taylor <otaylor src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] Compress notifications of menu changes with a timeout.
- Date: Fri, 4 Sep 2009 23:25:54 +0000 (UTC)
commit 0a29cf61955935ca1e7d3a48ccd38164ec9c80af
Author: Jon Nettleton <jon nettleton gmail com>
Date: Wed Sep 2 14:35:09 2009 -0700
Compress notifications of menu changes with a timeout.
GMenu currently gives us a separate notification on the entire
menu tree for each node in the tree that might potentially have
changed. (See http://bugzilla.gnome.org/show_bug.cgi?id=172046.)
Compress these with a timeout to avoid doing a lot of extra work.
http://bugzilla.gnome.org/show_bug.cgi?id=592608
src/shell-app-system.c | 45 +++++++++++++++++++++++++++++++++++++--------
1 files changed, 37 insertions(+), 8 deletions(-)
---
diff --git a/src/shell-app-system.c b/src/shell-app-system.c
index b39d3d1..b090910 100644
--- a/src/shell-app-system.c
+++ b/src/shell-app-system.c
@@ -52,10 +52,13 @@ struct _ShellAppSystemPrivate {
GList *cached_favorites; /* utf8 */
gint app_monitor_id;
+
+ guint app_change_timeout_id;
};
static void shell_app_system_finalize (GObject *object);
-static void on_tree_changed (GMenuTree *tree, gpointer user_data);
+static void on_tree_changed (gpointer user_data);
+static void on_tree_changed_cb (GMenuTree *tree, gpointer user_data);
static void reread_menus (ShellAppSystem *self);
static void on_favorite_apps_changed (GConfClient *client, guint id, GConfEntry *entry, gpointer user_data);
static void reread_favorite_apps (ShellAppSystem *system);
@@ -233,8 +236,10 @@ shell_app_system_init (ShellAppSystem *self)
priv->apps_tree = gmenu_tree_lookup ("applications.menu", GMENU_TREE_FLAGS_INCLUDE_NODISPLAY);
priv->settings_tree = gmenu_tree_lookup ("settings.menu", GMENU_TREE_FLAGS_NONE);
- gmenu_tree_add_monitor (priv->apps_tree, on_tree_changed, self);
- gmenu_tree_add_monitor (priv->settings_tree, on_tree_changed, self);
+ priv->app_change_timeout_id = 0;
+
+ gmenu_tree_add_monitor (priv->apps_tree, on_tree_changed_cb, self);
+ gmenu_tree_add_monitor (priv->settings_tree, on_tree_changed_cb, self);
reread_menus (self);
@@ -251,8 +256,8 @@ shell_app_system_finalize (GObject *object)
ShellAppSystem *self = SHELL_APP_SYSTEM (object);
ShellAppSystemPrivate *priv = self->priv;
- gmenu_tree_remove_monitor (priv->apps_tree, on_tree_changed, self);
- gmenu_tree_remove_monitor (priv->settings_tree, on_tree_changed, self);
+ gmenu_tree_remove_monitor (priv->apps_tree, on_tree_changed_cb, self);
+ gmenu_tree_remove_monitor (priv->settings_tree, on_tree_changed_cb, self);
gmenu_tree_unref (priv->apps_tree);
gmenu_tree_unref (priv->settings_tree);
@@ -411,13 +416,37 @@ reread_menus (ShellAppSystem *self)
}
static void
-on_tree_changed (GMenuTree *monitor, gpointer user_data)
+on_tree_changed (gpointer user_data)
{
ShellAppSystem *self = SHELL_APP_SYSTEM (user_data);
-
g_signal_emit (self, signals[INSTALLED_CHANGED], 0);
-
reread_menus (self);
+ self->priv->app_change_timeout_id = 0;
+}
+
+static void
+on_tree_changed_cb (GMenuTree *monitor, gpointer user_data)
+{
+ ShellAppSystem *self = SHELL_APP_SYSTEM (user_data);
+
+ /* GMenu currently gives us a separate notification on the entire
+ * menu tree for each node in the tree that might potentially have
+ * changed. (See http://bugzilla.gnome.org/show_bug.cgi?id=172046.)
+ * We need to compress these to avoid doing large extra amounts of
+ * work.
+ *
+ * Even when that bug is fixed, compression is still useful; for one
+ * thing we want to need to compress across notifications of changes
+ * to the settings tree. Second we want to compress if multiple
+ * changes are made to the desktop files at different times but in
+ * short succession.
+ */
+
+ if (self->priv->app_change_timeout_id != 0)
+ return;
+ self->priv->app_change_timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, 3000,
+ (GSourceFunc) on_tree_changed,
+ self, NULL);
}
static GList *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]