Index: gnome-menus-3.13.3/libmenu/menu-monitor.c =================================================================== --- gnome-menus-3.13.3.orig/libmenu/menu-monitor.c +++ gnome-menus-3.13.3/libmenu/menu-monitor.c @@ -32,6 +32,7 @@ struct MenuMonitor guint refcount; GSList *notifies; + GList *timeout_handlers; GFileMonitor *monitor; @@ -52,6 +53,14 @@ typedef struct guint refcount; } MenuMonitorNotify; +typedef struct +{ + MenuMonitor *menu_monitor; + GFile *child; + GFileMonitorEvent eflags; + guint timeout_handler; +} MonitorCallbackInfo; + static MenuMonitorNotify *menu_monitor_notify_ref (MenuMonitorNotify *notify); static void menu_monitor_notify_unref (MenuMonitorNotify *notify); @@ -160,18 +169,18 @@ get_registry_key (const char *path, } static gboolean -monitor_callback (GFileMonitor *monitor, - GFile *child, - GFile *other_file, - GFileMonitorEvent eflags, - gpointer user_data) +monitor_callback_delayed (gpointer user_data) { + MonitorCallbackInfo *info; MenuMonitorEventInfo *event_info; MenuMonitorEvent event; - MenuMonitor *menu_monitor = (MenuMonitor *) user_data; + MenuMonitor *menu_monitor; + + info = (MonitorCallbackInfo *) user_data; + menu_monitor = info->menu_monitor; event = MENU_MONITOR_EVENT_INVALID; - switch (eflags) + switch (info->eflags) { case G_FILE_MONITOR_EVENT_CHANGED: event = MENU_MONITOR_EVENT_CHANGED; @@ -183,17 +192,48 @@ monitor_callback (GFileMonitor *mon event = MENU_MONITOR_EVENT_DELETED; break; default: + menu_monitor->timeout_handlers = g_list_remove (menu_monitor->timeout_handlers, + GUINT_TO_POINTER(info->timeout_handler)); return TRUE; } event_info = g_new0 (MenuMonitorEventInfo, 1); - event_info->path = g_file_get_path (child); + event_info->path = g_file_get_path (info->child); event_info->event = event; event_info->monitor = menu_monitor; menu_monitor_queue_event (event_info); + menu_monitor->timeout_handlers = g_list_remove (menu_monitor->timeout_handlers, + GUINT_TO_POINTER(info->timeout_handler)); + + return TRUE; +} + +static gboolean +monitor_callback (GFileMonitor *monitor, + GFile *child, + GFile *other_file, + GFileMonitorEvent eflags, + gpointer user_data) +{ + MenuMonitor *menu_monitor; + MonitorCallbackInfo *info; + guint timeout_handler; + + menu_monitor = (MenuMonitor *) user_data; + + info = g_new0 (MonitorCallbackInfo, 1); + info->menu_monitor = menu_monitor; + info->child = child; + info->eflags = eflags; + + timeout_handler = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, 2, monitor_callback_delayed, info, g_free); + menu_monitor->timeout_handlers = g_list_append (menu_monitor->timeout_handlers, + GUINT_TO_POINTER (timeout_handler)); + info->timeout_handler = timeout_handler; + return TRUE; } @@ -366,6 +406,9 @@ menu_monitor_unref (MenuMonitor *monitor g_slist_free (monitor->notifies); monitor->notifies = NULL; + g_list_free_full (monitor->timeout_handlers, (GDestroyNotify *) g_source_remove) ; + monitor->timeout_handlers = NULL; + menu_monitor_clear_pending_events (monitor); g_free (monitor->path);