[Xfce4-commits] <ristretto:master> Add file monitor (Bug #6509)

Stephan Arts noreply at xfce.org
Sun Nov 13 23:18:02 CET 2011


Updating branch refs/heads/master
         to e9f758ce3daf3bff9e7c70e3e57edbb72236d948 (commit)
       from 9a72aee4ce0554bdab99ecf4e331fc93d6144d41 (commit)

commit e9f758ce3daf3bff9e7c70e3e57edbb72236d948
Author: Stephan Arts <stephan at xfce.org>
Date:   Thu Nov 10 22:29:36 2011 +0100

    Add file monitor (Bug #6509)

 src/image_list.c  |   89 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 src/main_window.c |    6 +++
 2 files changed, 91 insertions(+), 4 deletions(-)

diff --git a/src/image_list.c b/src/image_list.c
index dabac2d..64b7308 100644
--- a/src/image_list.c
+++ b/src/image_list.c
@@ -40,6 +40,14 @@ rstto_image_list_class_init(RsttoImageListClass *);
 static void
 rstto_image_list_dispose(GObject *object);
 
+static void
+cb_file_monitor_changed (
+        GFileMonitor      *monitor,
+        GFile             *file,
+        GFile             *other_file,
+        GFileMonitorEvent  event_type,
+        gpointer           user_data );
+
 static void 
 rstto_image_list_iter_init(RsttoImageListIter *);
 static void
@@ -80,11 +88,13 @@ struct _RsttoImageListIterPriv
 
 struct _RsttoImageListPriv
 {
-    GList *images;
-    gint n_images;
+    GFileMonitor *monitor;
 
-    GSList *iterators;
-    GCompareFunc cb_rstto_image_list_compare_func;
+    GList        *images;
+    gint          n_images;
+
+    GSList       *iterators;
+    GCompareFunc  cb_rstto_image_list_compare_func;
 };
 
 static gint rstto_image_list_signals[RSTTO_IMAGE_LIST_SIGNAL_COUNT];
@@ -320,6 +330,77 @@ rstto_image_list_remove_all (RsttoImageList *image_list)
     g_signal_emit (G_OBJECT (image_list), rstto_image_list_signals[RSTTO_IMAGE_LIST_SIGNAL_REMOVE_ALL], 0, NULL);
 }
 
+void
+rstto_image_list_monitor_dir (
+        RsttoImageList *image_list,
+        GFile *dir )
+{
+    GFileMonitor *monitor = NULL;
+
+    if ( NULL != image_list->priv->monitor )
+    {
+        g_object_unref (image_list->priv->monitor);
+        image_list->priv->monitor = NULL;
+    }
+
+    monitor = g_file_monitor_directory (
+            dir,
+            G_FILE_MONITOR_NONE,
+            NULL,
+            NULL);
+
+    g_signal_connect (
+            G_OBJECT(monitor),
+            "changed",
+            G_CALLBACK (cb_file_monitor_changed),
+            image_list);
+
+    image_list->priv->monitor = monitor;
+}
+
+static void
+cb_file_monitor_changed (
+        GFileMonitor      *monitor,
+        GFile             *file,
+        GFile             *other_file,
+        GFileMonitorEvent  event_type,
+        gpointer           user_data )
+{
+    RsttoImageList *image_list = RSTTO_IMAGE_LIST (user_data);
+    RsttoFile *r_file = rstto_file_new (file);
+
+    g_return_if_fail ( monitor == image_list->priv->monitor);
+
+    switch ( event_type )
+    {
+        case G_FILE_MONITOR_EVENT_DELETED:
+            g_debug("file deleted");
+            rstto_image_list_remove_file ( image_list, r_file );
+            r_file = NULL;
+            break;
+        case G_FILE_MONITOR_EVENT_CREATED:
+            g_debug("file created");
+            rstto_image_list_add_file (image_list, r_file, NULL);
+            r_file = NULL;
+            break;
+        case G_FILE_MONITOR_EVENT_MOVED:
+            g_debug("file moved");
+            rstto_image_list_remove_file ( image_list, r_file );
+
+            r_file = rstto_file_new (other_file);
+            rstto_image_list_add_file (image_list, r_file, NULL);
+            r_file = NULL;
+            break;
+        default:
+            break;
+    }
+
+    if ( NULL != r_file )
+    {
+        g_object_unref (r_file);
+    }
+}
+
 
 
 GType
diff --git a/src/main_window.c b/src/main_window.c
index 13abc6e..4dde536 100644
--- a/src/main_window.c
+++ b/src/main_window.c
@@ -2641,6 +2641,9 @@ cb_rstto_main_window_open_image (GtkWidget *widget, RsttoMainWindow *window)
                             rfile );
                 }
             }
+            rstto_image_list_monitor_dir (
+                window->priv->image_list,
+                p_file );
         }
  
         g_value_set_string (&current_uri_val, gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dialog)));
@@ -2707,6 +2710,9 @@ cb_rstto_main_window_open_recent(GtkRecentChooser *chooser, RsttoMainWindow *win
             g_object_unref (file_enumerator);
             file_enumerator = NULL;
         }
+        rstto_image_list_monitor_dir (
+            window->priv->image_list,
+            p_file );
         rstto_image_list_iter_find_file (
                 window->priv->iter,
                 rfile );


More information about the Xfce4-commits mailing list