[gnome-builder] context: add recursive project file monitor
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] context: add recursive project file monitor
- Date: Fri, 1 Dec 2017 07:05:18 +0000 (UTC)
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]