[Xfce4-commits] <xfdesktop:master> Monitor the gvfs directory

Eric Koegel noreply at xfce.org
Sun Sep 1 16:20:11 CEST 2013


Updating branch refs/heads/master
         to 4c889999cb73b5f5f3224265641acb60e0cb7ecd (commit)
       from dc9f86912900c7d6461b273953ae6fad6c00daed (commit)

commit 4c889999cb73b5f5f3224265641acb60e0cb7ecd
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Fri Aug 30 11:20:08 2013 +0300

    Monitor the gvfs directory
    
    Added a file monitor watching the gvfs directory since there's no
    other way to be notified of these events. Now when the user adds
    an emblem to a file and gvfs commits the change to the db, xfdesktop
    will update the icons to reflect this change. There is about a one
    minute delay from setting the emblem and gvfs changing the file.

 src/xfdesktop-file-icon-manager.c |   85 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 84 insertions(+), 1 deletion(-)

diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c
index 26303a8..edfae1a 100644
--- a/src/xfdesktop-file-icon-manager.c
+++ b/src/xfdesktop-file-icon-manager.c
@@ -113,7 +113,10 @@ struct _XfdesktopFileIconManagerPrivate
     GFileEnumerator *enumerator;
 
     GVolumeMonitor *volume_monitor;
-    
+
+    GFileMonitor *metadata_monitor;
+    guint metadata_timer;
+
     GHashTable *icons;
     GHashTable *removable_icons;
     GHashTable *special_icons;
@@ -2296,6 +2299,70 @@ xfdesktop_file_icon_manager_file_changed(GFileMonitor     *monitor,
 }
 
 static void
+xfdesktop_file_icon_manager_update_file_info(gpointer key,
+                                             gpointer value,
+                                             gpointer user_data)
+{
+    XfdesktopFileIcon *icon = XFDESKTOP_FILE_ICON(value);
+    GFileInfo *file_info;
+
+    if(icon) {
+        file_info = g_file_query_info(key, XFDESKTOP_FILE_INFO_NAMESPACE,
+                                      G_FILE_QUERY_INFO_NONE, NULL, NULL);
+
+        if(file_info) {
+            /* update the icon if the file still exists */
+            xfdesktop_file_icon_update_file_info(icon, file_info);
+            g_object_unref(file_info);
+        }
+    }
+}
+
+static gboolean
+xfdesktop_file_icon_manager_metadata_timer(gpointer user_data)
+{
+    XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(user_data);
+
+    g_hash_table_foreach(fmanager->priv->icons,
+                         (GHFunc)xfdesktop_file_icon_manager_update_file_info,
+                         fmanager);
+
+    fmanager->priv->metadata_timer = 0;
+
+    return FALSE;
+}
+
+static void
+xfdesktop_file_icon_manager_metadata_changed(GFileMonitor     *monitor,
+                                             GFile            *file,
+                                             GFile            *other_file,
+                                             GFileMonitorEvent event,
+                                             gpointer          user_data)
+{
+    XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(user_data);
+
+    switch(event) {
+        case G_FILE_MONITOR_EVENT_CHANGED:
+            DBG("metadata file changed event");
+
+            /* cool down timer so we don't call this due to multiple file
+             * changes at the same time. */
+            if(fmanager->priv->metadata_timer == 0) {
+                guint timer;
+
+                timer = g_timeout_add_seconds(5,
+                                              (GSourceFunc)xfdesktop_file_icon_manager_metadata_timer,
+                                              fmanager);
+
+                fmanager->priv->metadata_timer = timer;
+            }
+            break;
+        default:
+            break;
+    }
+}
+
+static void
 xfdesktop_file_icon_manager_files_ready(GFileEnumerator *enumerator,
                                         GAsyncResult *result,
                                         gpointer user_data)
@@ -2346,6 +2413,7 @@ xfdesktop_file_icon_manager_files_ready(GFileEnumerator *enumerator,
         }
 
 
+        /* initialize the file monitor */
         if(!fmanager->priv->monitor) {
             fmanager->priv->monitor = g_file_monitor(fmanager->priv->folder,
                                                      G_FILE_MONITOR_SEND_MOVED,
@@ -2354,6 +2422,21 @@ xfdesktop_file_icon_manager_files_ready(GFileEnumerator *enumerator,
                              G_CALLBACK(xfdesktop_file_icon_manager_file_changed),
                              fmanager);
         }
+
+        /* initialize the metadata watching the gvfs files since it doesn't
+         * send notification messages when monitored files change */
+        if(!fmanager->priv->metadata_monitor) {
+            gchar *location = xfce_resource_lookup(XFCE_RESOURCE_DATA, "gvfs-metadata/");
+            GFile *metadata_location = g_file_new_for_path(location);
+
+            fmanager->priv->metadata_monitor = g_file_monitor(metadata_location,
+                                                              G_FILE_MONITOR_NONE,
+                                                              NULL, NULL);
+            g_signal_connect(fmanager->priv->metadata_monitor, "changed",
+                             G_CALLBACK(xfdesktop_file_icon_manager_metadata_changed),
+                             fmanager);
+            g_free(location);
+        }
     } else {
         for(l = files; l; l = l->next) {
             DBG("got a GFileInfo: %s", g_file_info_get_display_name(l->data));


More information about the Xfce4-commits mailing list