Author: kelnos
Date: 2007-10-01 07:09:08 +0000 (Mon, 01 Oct 2007)
New Revision: 26120

Modified:
   xfdesktop/trunk/modules/menu/desktop-menu.c
Log:
hook up jannis' new file monitoring stuff


Modified: xfdesktop/trunk/modules/menu/desktop-menu.c
===================================================================
--- xfdesktop/trunk/modules/menu/desktop-menu.c 2007-09-30 18:27:04 UTC (rev 
26119)
+++ xfdesktop/trunk/modules/menu/desktop-menu.c 2007-10-01 07:09:08 UTC (rev 
26120)
@@ -3,7 +3,7 @@
  *  Copyright (C) 2002-2003 Jasper Huijsmans ([EMAIL PROTECTED])
  *                     2003 Biju Chacko ([EMAIL PROTECTED])
  *                     2004 Danny Milosavljevic <[EMAIL PROTECTED]>
- *                     2004-2007 Brian Tarricone <[EMAIL PROTECTED]>
+ *                2004-2007 Brian Tarricone <[EMAIL PROTECTED]>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -82,8 +82,7 @@
                                gboolean deferred);
 static void desktop_menu_add_items(XfceDesktopMenu *desktop_menu,
                                    XfceMenu *xfce_menu,
-                                   GtkWidget *menu,
-                                   GHashTable *watch_dirs);
+                                   GtkWidget *menu);
 
 static void
 itheme_changed_cb(GtkIconTheme *itheme, gpointer user_data)
@@ -91,37 +90,10 @@
     _generate_menu((XfceDesktopMenu *)user_data, FALSE);
 }
 
-#if 0
-static gint
-compare_items(gconstpointer a,
-              gconstpointer b)
-{
-  return g_utf8_collate(xfce_menu_item_get_name((XfceMenuItem *)a),
-                        xfce_menu_item_get_name((XfceMenuItem *)b));
-}
-#endif
-
-static void
-desktop_menu_monitors_destroy(XfceDesktopMenu *desktop_menu)
-{
 #ifdef HAVE_THUNAR_VFS
-    ThunarVfsMonitor *monitor = thunar_vfs_monitor_get_default();
-    GList *l;
-    
-    for(l = desktop_menu->monitors; l; l = l->next) {
-        ThunarVfsMonitorHandle *mhandle = l->data;
-        thunar_vfs_monitor_remove(monitor, mhandle);
-    }
-    g_list_free(desktop_menu->monitors);
-    desktop_menu->monitors = NULL;
-    
-    g_object_unref(G_OBJECT(monitor));
-#endif
-}
 
-#ifdef HAVE_THUNAR_VFS
 static void
-desktop_menu_directory_changed(ThunarVfsMonitor *monitor,
+desktop_menu_something_changed(ThunarVfsMonitor *monitor,
                                ThunarVfsMonitorHandle *handle,
                                ThunarVfsMonitorEvent event,
                                ThunarVfsPath *handle_path,
@@ -129,71 +101,79 @@
                                gpointer user_data)
 {
     XfceDesktopMenu *desktop_menu = user_data;
+    TRACE("entering (%s)", thunar_vfs_path_get_name(event_path));
     _generate_menu(desktop_menu, FALSE);
 }
 
-static void
-desktop_menu_monitor_add(gpointer key,
-                         gpointer value,
-                         gpointer user_data)
+static gpointer
+desktop_menu_xfce_menu_monitor_file(XfceMenu *menu,
+                                    const gchar *filename,
+                                    gpointer user_data)
 {
     XfceDesktopMenu *desktop_menu = user_data;
-    const gchar *pathstr = key;
     ThunarVfsPath *path;
     ThunarVfsMonitor *monitor = thunar_vfs_monitor_get_default();
-    ThunarVfsMonitorHandle *mhandle;
+    ThunarVfsMonitorHandle *mhandle = NULL;
     
-    path = thunar_vfs_path_new(pathstr, NULL);
+    path = thunar_vfs_path_new(filename, NULL);
     if(path) {
-        mhandle = thunar_vfs_monitor_add_directory(monitor, path,
-                                                   
desktop_menu_directory_changed,
-                                                   desktop_menu);
-        desktop_menu->monitors = g_list_prepend(desktop_menu->monitors,
-                                                mhandle);
+        mhandle = thunar_vfs_monitor_add_file(monitor, path,
+                                              desktop_menu_something_changed,
+                                              desktop_menu);
         thunar_vfs_path_unref(path);
     }
     
     g_object_unref(G_OBJECT(monitor));
+    
+    TRACE("exiting (%s), returning 0x%p\n", filename, mhandle);
+    
+    return mhandle;
 }
-#endif
 
-static void
-desktop_menu_monitors_create(XfceDesktopMenu *desktop_menu,
-                            GHashTable *watch_dirs)
+static gpointer
+desktop_menu_xfce_menu_monitor_directory(XfceMenu *menu,
+                                         const gchar *filename,
+                                         gpointer user_data)
 {
-#ifdef HAVE_THUNAR_VFS
-    thunar_vfs_init();
+    XfceDesktopMenu *desktop_menu = user_data;
+    ThunarVfsPath *path;
+    ThunarVfsMonitor *monitor = thunar_vfs_monitor_get_default();
+    ThunarVfsMonitorHandle *mhandle = NULL;
     
-    if(desktop_menu->monitors) {
-        g_warning("Attempt to create new monitors without destroying the 
old.");
-        desktop_menu_monitors_destroy(desktop_menu);
+    path = thunar_vfs_path_new(filename, NULL);
+    if(path) {
+        mhandle = thunar_vfs_monitor_add_directory(monitor, path,
+                                                   
desktop_menu_something_changed,
+                                                   desktop_menu);
+        thunar_vfs_path_unref(path);
     }
     
-    g_hash_table_foreach(watch_dirs, desktop_menu_monitor_add, desktop_menu);
-#endif
+    g_object_unref(G_OBJECT(monitor));
+    
+    TRACE("exiting (%s), returning 0x%p", filename, mhandle);
+    
+    return mhandle;
 }
 
 static void
-desktop_menu_watch_dirs_add(GHashTable *watch_dirs,
-                            const gchar *filename)
+desktop_menu_xfce_menu_remove_monitor(XfceMenu *menu,
+                                      gpointer monitor_handle)
 {
-    gchar *dirname = g_strdup(filename), *p;
+    ThunarVfsMonitor *monitor = thunar_vfs_monitor_get_default();
+    ThunarVfsMonitorHandle *mhandle = monitor_handle;
     
-    p = g_strrstr(dirname, G_DIR_SEPARATOR_S);
-    if(!p) {
-        g_warning("Can't add \"%s\" to watch dirs: no dir separator", dirname);
-        return;
-    }
+    TRACE("entering (0x%p)", mhandle); 
     
-    *p = 0;    
-    g_hash_table_replace(watch_dirs, dirname, GINT_TO_POINTER(1));
+    thunar_vfs_monitor_remove(monitor, mhandle);
+    g_object_unref(G_OBJECT(monitor));
 }
 
+#endif
+
 static void
 desktop_menu_add_items(XfceDesktopMenu *desktop_menu,
                        XfceMenu *xfce_menu,
-                       GtkWidget *menu,
-                       GHashTable *watch_dirs)
+                       GtkWidget *menu)
 {
     GSList *items, *l;
     GtkWidget *submenu, *mi, *img;
@@ -226,8 +206,6 @@
             if(xfce_directory) {
                 name = xfce_menu_directory_get_name(xfce_directory);
                 icon_name = xfce_menu_directory_get_icon(xfce_directory);
-                desktop_menu_watch_dirs_add(watch_dirs,
-                                            
xfce_menu_directory_get_filename(xfce_directory));
             } else {
                 name = xfce_menu_get_name(xfce_submenu);
                 icon_name = NULL;
@@ -244,8 +222,7 @@
             gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
             gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), submenu);
             
-            desktop_menu_add_items(desktop_menu, xfce_submenu, submenu,
-                                   watch_dirs);
+            desktop_menu_add_items(desktop_menu, xfce_submenu, submenu);
             
             /* we have to check emptiness down here instead of at the top of 
the
              * loop because there may be further submenus that are empty */
@@ -271,9 +248,6 @@
                                              
xfce_menu_item_supports_startup_notification(xfce_item));
             gtk_widget_show(mi);
             gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
-            
-            desktop_menu_watch_dirs_add(watch_dirs,
-                                        
xfce_menu_item_get_filename(xfce_item));
         }
     }
     g_slist_free(items);
@@ -287,24 +261,20 @@
     XfceKiosk *kiosk;
     gboolean user_menu;
     GError *error = NULL;
-    GHashTable *watch_dirs;
-    gchar *local_menus_dir;
     
     _xfce_desktop_menu_free_menudata(desktop_menu);
     
-    watch_dirs = g_hash_table_new_full(g_str_hash, g_str_equal,
-                                       (GDestroyNotify)g_free, NULL);
-    
-    /* FIXME: do something with this */
     kiosk = xfce_kiosk_new("xfdesktop");
     user_menu = xfce_kiosk_query(kiosk, "UserMenu");
     xfce_kiosk_free(kiosk);
     
     DBG("menu file name is %s", desktop_menu->filename);
-    
+
+#if 0
     /* this is kinda lame, but xfcemenu currently caches too much */
     xfce_menu_shutdown();
     xfce_menu_init("XFCE");
+#endif
     
     if(g_file_test(desktop_menu->filename, G_FILE_TEST_EXISTS)) {
         desktop_menu->xfce_menu = xfce_menu_new(desktop_menu->filename, 
&error);
@@ -318,31 +288,10 @@
         desktop_menu->menu = gtk_menu_new();
         gtk_widget_show(desktop_menu->menu);
     
-        desktop_menu_watch_dirs_add(watch_dirs,
-                                    
xfce_menu_get_filename(desktop_menu->xfce_menu));
-    
-    
         desktop_menu_add_items(desktop_menu, desktop_menu->xfce_menu,
-                               desktop_menu->menu, watch_dirs);
-        
-        /* really don't need to keep this around */
-        g_object_unref(G_OBJECT(desktop_menu->xfce_menu));
-        desktop_menu->xfce_menu = NULL;
+                               desktop_menu->menu);
     }
     
-    if(user_menu && desktop_menu->using_default_menu) {
-        local_menus_dir = xfce_resource_save_location(XFCE_RESOURCE_CONFIG,
-                                                     "menus/", TRUE);
-        if(local_menus_dir) {
-            desktop_menu_watch_dirs_add(watch_dirs, local_menus_dir);
-            g_free(local_menus_dir);
-        }
-    }
-    
-    desktop_menu_monitors_create(desktop_menu, watch_dirs);
-    
-    g_hash_table_destroy(watch_dirs);
-    
     return ret;
 }
 
@@ -350,8 +299,6 @@
 void
 _xfce_desktop_menu_free_menudata(XfceDesktopMenu *desktop_menu)
 {
-    desktop_menu_monitors_destroy(desktop_menu);
-    
     if(desktop_menu->menu)
         gtk_widget_destroy(desktop_menu->menu);
     if(desktop_menu->xfce_menu)
@@ -384,6 +331,11 @@
 xfce_desktop_menu_new_impl(const gchar *menu_file,
                            gboolean deferred)
 {
+    static XfceMenuMonitorVTable monitor_vtable = {
+        desktop_menu_xfce_menu_monitor_file,
+        desktop_menu_xfce_menu_monitor_directory,
+        desktop_menu_xfce_menu_remove_monitor
+    };
     XfceDesktopMenu *desktop_menu = g_new0(XfceDesktopMenu, 1);
     
     desktop_menu->use_menu_icons = TRUE;
@@ -395,10 +347,16 @@
         desktop_menu->using_default_menu = TRUE;
     }
     
+#ifdef HAVE_THUNAR_VFS
+    thunar_vfs_init();
+    xfce_menu_monitor_set_vtable(&monitor_vtable, desktop_menu);
+#endif
+    
     if(deferred)
         desktop_menu->idle_id = g_idle_add(_generate_menu_initial, 
desktop_menu);
     else {
         if(!_generate_menu(desktop_menu, FALSE)) {
+            xfce_menu_monitor_set_vtable(NULL, NULL);
             g_free(desktop_menu);
             desktop_menu = NULL;
         }
@@ -477,6 +435,10 @@
         desktop_menu->idle_id = 0;
     }
     
+#ifdef HAVE_THUNAR_VFS
+    xfce_menu_monitor_set_vtable(NULL, NULL);
+#endif
+    
     g_signal_handlers_disconnect_by_func(_deskmenu_icon_theme,
                                          G_CALLBACK(itheme_changed_cb),
                                          desktop_menu);

_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to