[gnome-builder] context: add recursive project file monitor



commit b2b1ac4ce5570e1aa4d655aadadad50a7bc5e024
Author: Christian Hergert <chergert redhat com>
Date:   Thu Nov 30 21:00:41 2017 -0800

    context: add recursive project file monitor
    
    This gives us a recursive file monitor that plugins can use to
    track changes in the project tree. It will automatically ignore
    paths that are set ignored by the VCS.

 src/libide/ide-context.c |   53 ++++++++++++++++++++++++++++++++++++++++++++++
 src/libide/ide-context.h |    4 +++
 2 files changed, 57 insertions(+), 0 deletions(-)
---
diff --git a/src/libide/ide-context.c b/src/libide/ide-context.c
index bfb6f68..560b254 100644
--- a/src/libide/ide-context.c
+++ b/src/libide/ide-context.c
@@ -109,6 +109,7 @@ struct _IdeContext
   IdeDoap                  *doap;
   IdeDocumentation         *documentation;
   GListStore               *pausables;
+  DzlRecursiveFileMonitor  *monitor;
   GtkRecentManager         *recent_manager;
   IdeRunManager            *run_manager;
   IdeRuntimeManager        *runtime_manager;
@@ -498,6 +499,7 @@ ide_context_dispose (GObject *object)
   IDE_ENTRY;
 
   g_list_store_remove_all (self->pausables);
+  dzl_recursive_file_monitor_cancel (self->monitor);
 
   G_OBJECT_CLASS (ide_context_parent_class)->dispose (object);
 
@@ -513,6 +515,7 @@ ide_context_finalize (GObject *object)
 
   g_clear_object (&self->services);
   g_clear_object (&self->pausables);
+  g_clear_object (&self->monitor);
 
   g_clear_pointer (&self->build_system_hint, g_free);
   g_clear_pointer (&self->services_by_gtype, g_hash_table_unref);
@@ -2489,3 +2492,53 @@ ide_context_cache_filename (IdeContext  *self,
 
   return g_build_filenamev ((gchar **)ar->pdata);
 }
+
+static gboolean
+ide_context_ignore_func (GFile    *file,
+                         gpointer  data)
+{
+  IdeContext *self = data;
+
+  g_assert (G_IS_FILE (file));
+  g_assert (IDE_IS_CONTEXT (self));
+
+  return ide_vcs_is_ignored (self->vcs, file, NULL);
+}
+
+/**
+ * ide_context_get_monitor:
+ * @self: a #IdeContext
+ *
+ * Gets a #DzlRecursiveFileMonitor that monitors the project directory
+ * recursively. You can use this to track changes across the project
+ * tree without creating your own #GFileMonitor.
+ *
+ * Returns: (transfer none): a #DzlRecursiveFileMonitor to monitor the
+ *   project tree.
+ *
+ * Since: 3.28
+ */
+DzlRecursiveFileMonitor *
+ide_context_get_monitor (IdeContext *self)
+{
+  g_return_val_if_fail (IDE_IS_CONTEXT (self), NULL);
+
+  if (self->monitor == NULL)
+    {
+      g_autoptr(GFile) root = NULL;
+
+      if (g_file_query_file_type (self->project_file, 0, NULL) == G_FILE_TYPE_DIRECTORY)
+        root = g_object_ref (self->project_file);
+      else
+        root = g_file_get_parent (self->project_file);
+
+      self->monitor = dzl_recursive_file_monitor_new (root);
+      dzl_recursive_file_monitor_set_ignore_func (self->monitor,
+                                                  ide_context_ignore_func,
+                                                  g_object_ref (self),
+                                                  g_object_unref);
+      dzl_recursive_file_monitor_start_async (self->monitor, NULL, NULL, NULL);
+    }
+
+  return self->monitor;
+}
diff --git a/src/libide/ide-context.h b/src/libide/ide-context.h
index 7a7c8c9..d6acf92 100644
--- a/src/libide/ide-context.h
+++ b/src/libide/ide-context.h
@@ -18,6 +18,7 @@
 
 #pragma once
 
+#include <dazzle.h>
 #include <gio/gio.h>
 #include <gtk/gtk.h>
 
@@ -125,6 +126,9 @@ IDE_AVAILABLE_IN_3_28
 gchar                    *ide_context_cache_filename            (IdeContext           *self,
                                                                  const gchar          *first_part,
                                                                  ...) G_GNUC_NULL_TERMINATED;
+IDE_AVAILABLE_IN_3_28
+DzlRecursiveFileMonitor  *ide_context_get_monitor               (IdeContext           *self);
+
 GListModel               *_ide_context_get_pausables            (IdeContext           *self) G_GNUC_INTERNAL;
 gboolean                  _ide_context_is_restoring             (IdeContext           *self) G_GNUC_INTERNAL;
 


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