[gnome-flashback/wip/muktupavels/lp1875317] desktop: monitor files for changes



commit f60e48ff4d52c6f027d02b088eb7a70e213ad899
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Tue Apr 28 12:18:07 2020 +0300

    desktop: monitor files for changes
    
    https://launchpad.net/bugs/1875317

 gnome-flashback/libdesktop/gf-icon.c | 85 +++++++++++++++++++++++++++++++++++-
 1 file changed, 84 insertions(+), 1 deletion(-)
---
diff --git a/gnome-flashback/libdesktop/gf-icon.c b/gnome-flashback/libdesktop/gf-icon.c
index a89ec9f..638c341 100644
--- a/gnome-flashback/libdesktop/gf-icon.c
+++ b/gnome-flashback/libdesktop/gf-icon.c
@@ -41,6 +41,8 @@ typedef struct
   GFile           *file;
   GFileInfo       *info;
 
+  GFileMonitor    *monitor;
+
   GfIconSize       icon_size;
   guint            extra_text_width;
 
@@ -1031,11 +1033,87 @@ set_icon_size (GfIcon *self,
   update_icon (self);
 }
 
+static void
+file_changed_cb (GFileMonitor      *monitor,
+                 GFile             *file,
+                 GFile             *other_file,
+                 GFileMonitorEvent  event_type,
+                 GfIcon            *self)
+{
+  switch (event_type)
+    {
+      case G_FILE_MONITOR_EVENT_CHANGED:
+        break;
+
+      case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
+        icon_refresh (self);
+        break;
+
+      case G_FILE_MONITOR_EVENT_DELETED:
+        break;
+
+      case G_FILE_MONITOR_EVENT_CREATED:
+        break;
+
+      case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED:
+        gf_icon_update (self);
+        break;
+
+      case G_FILE_MONITOR_EVENT_PRE_UNMOUNT:
+        break;
+
+      case G_FILE_MONITOR_EVENT_UNMOUNTED:
+        break;
+
+      case G_FILE_MONITOR_EVENT_MOVED:
+        break;
+
+      case G_FILE_MONITOR_EVENT_RENAMED:
+        break;
+
+      case G_FILE_MONITOR_EVENT_MOVED_IN:
+        break;
+
+      case G_FILE_MONITOR_EVENT_MOVED_OUT:
+        break;
+
+      default:
+        break;
+    }
+}
+
+static void
+create_file_monitor (GfIcon *self)
+{
+  GfIconPrivate *priv;
+  GError *error;
+
+  priv = gf_icon_get_instance_private (self);
+
+  error = NULL;
+  priv->monitor = g_file_monitor_file (priv->file,
+                                       G_FILE_MONITOR_NONE,
+                                       NULL,
+                                       &error);
+
+  if (error != NULL)
+    {
+      g_warning ("%s", error->message);
+      g_error_free (error);
+      return;
+    }
+
+  g_signal_connect (priv->monitor, "changed",
+                    G_CALLBACK (file_changed_cb),
+                    self);
+}
+
 static void
 gf_icon_constructed (GObject *object)
 {
   G_OBJECT_CLASS (gf_icon_parent_class)->constructed (object);
-  icon_refresh (GF_ICON (object));
+  create_file_monitor (GF_ICON (object));
+  gf_icon_update (GF_ICON (object));
 }
 
 static void
@@ -1058,6 +1136,8 @@ gf_icon_dispose (GObject *object)
   g_clear_object (&priv->file);
   g_clear_object (&priv->info);
 
+  g_clear_object (&priv->monitor);
+
   g_clear_object (&priv->app_info);
 
   g_clear_object (&priv->thumbnail);
@@ -1441,6 +1521,9 @@ gf_icon_set_file (GfIcon *self,
   g_clear_object (&priv->file);
   priv->file = g_object_ref (file);
 
+  g_clear_object (&priv->monitor);
+  create_file_monitor (self);
+
   gf_icon_update (self);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]