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



commit 499c47b8ed737dbae7d1860d2be09a4d42bcc5e5
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 | 91 ++++++++++++++++++++++++++++++++++--
 1 file changed, 87 insertions(+), 4 deletions(-)
---
diff --git a/gnome-flashback/libdesktop/gf-icon.c b/gnome-flashback/libdesktop/gf-icon.c
index a89ec9f..7e08c0c 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,6 +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
+set_file (GfIcon *self,
+          GFile  *file)
+{
+  GfIconPrivate *priv;
+  GError *error;
+
+  priv = gf_icon_get_instance_private (self);
+
+  g_clear_object (&priv->file);
+  g_clear_object (&priv->monitor);
+
+  priv->file = g_object_ref (file);
+
+  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)
 {
@@ -1058,6 +1141,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);
@@ -1134,7 +1219,7 @@ gf_icon_set_property (GObject      *object,
 
       case PROP_FILE:
         g_assert (priv->file == NULL);
-        priv->file = g_value_dup_object (value);
+        set_file (self, g_value_get_object (value));
         break;
 
       case PROP_INFO:
@@ -1438,9 +1523,7 @@ gf_icon_set_file (GfIcon *self,
 
   g_clear_pointer (&priv->popover, gtk_widget_destroy);
 
-  g_clear_object (&priv->file);
-  priv->file = g_object_ref (file);
-
+  set_file (self, file);
   gf_icon_update (self);
 }
 


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