Updating branch refs/heads/master to 3ffd9b2a021e730fbca82f2b8085c80815b4f738 (commit) from afc4f4b3a844cbdc8e036363e033caed4e17b9a7 (commit)
commit 3ffd9b2a021e730fbca82f2b8085c80815b4f738 Author: Nick Schermer <n...@xfce.org> Date: Sat Jun 25 17:09:03 2011 +0200 Merge multiple reload-required signals. The signal is triggered up to 5 times when the menu is changed. Use and idle to combine those events in 1 signal emit. garcon/garcon-menu.c | 36 +++++++++++++++++++++++++++++++++--- 1 files changed, 33 insertions(+), 3 deletions(-) diff --git a/garcon/garcon-menu.c b/garcon/garcon-menu.c index e7c8871..0bd1d6b 100644 --- a/garcon/garcon-menu.c +++ b/garcon/garcon-menu.c @@ -216,6 +216,9 @@ struct _GarconMenuPrivate /* Flag for marking custom path menus */ guint uses_custom_path : 1; + + /* idle reload-required to group events */ + guint idle_reload_required_id; }; @@ -330,6 +333,7 @@ garcon_menu_init (GarconMenu *menu) menu->priv->pool = garcon_menu_item_pool_new (); menu->priv->uses_custom_path = TRUE; menu->priv->changed_files = NULL; + menu->priv->idle_reload_required_id = 0; /* Take reference on the menu item cache */ menu->priv->cache = garcon_menu_item_cache_get_default (); @@ -377,6 +381,13 @@ garcon_menu_clear (GarconMenu *menu) /* Clear the item pool */ garcon_menu_item_pool_clear (menu->priv->pool); + + /* Stop reload-required emit */ + if (menu->priv->idle_reload_required_id != 0) + { + g_source_remove (menu->priv->idle_reload_required_id); + menu->priv->idle_reload_required_id = 0; + } } @@ -2030,6 +2041,22 @@ garcon_menu_monitor_directory_dirs (GarconMenu *menu) +static gboolean +garcon_menu_file_emit_reload_required (gpointer data) +{ + GarconMenu *menu = GARCON_MENU (data); + + g_return_val_if_fail (GARCON_IS_MENU (menu), FALSE); + + menu->priv->idle_reload_required_id = 0; + + g_signal_emit (menu, menu_signals[RELOAD_REQUIRED], 0); + + return FALSE; +} + + + static void garcon_menu_file_changed (GarconMenu *menu, GFile *file, @@ -2051,7 +2078,8 @@ garcon_menu_file_changed (GarconMenu *menu, /* Quick check: reloading is needed if the menu file being used has changed */ if (g_file_equal (menu->priv->file, file)) { - g_signal_emit (menu, menu_signals[RELOAD_REQUIRED], 0); + if (menu->priv->idle_reload_required_id == 0) + menu->priv->idle_reload_required_id = g_idle_add (garcon_menu_file_emit_reload_required, menu); return; } @@ -2089,8 +2117,10 @@ garcon_menu_file_changed (GarconMenu *menu, g_free (relative_filename); /* If the event file has higher priority, a menu reload is needed */ - if (!lower_priority && higher_priority) - g_signal_emit (menu, menu_signals[RELOAD_REQUIRED], 0); + if (!lower_priority + && higher_priority + && menu->priv->idle_reload_required_id == 0) + menu->priv->idle_reload_required_id = g_idle_add (garcon_menu_file_emit_reload_required, menu); } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits