[gtksourceview/wip/gedit-document-stuff] file: add is_externally_modified() and is_deleted() functions
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview/wip/gedit-document-stuff] file: add is_externally_modified() and is_deleted() functions
- Date: Thu, 11 Jun 2015 12:13:49 +0000 (UTC)
commit 7b1dd05bb0ddf2344daac5b9d01a1e54b4873a7a
Author: Sébastien Wilmet <swilmet gnome org>
Date: Thu Jun 11 14:09:40 2015 +0200
file: add is_externally_modified() and is_deleted() functions
The code comes from GeditDocument.
gtksourceview/gtksourcefile.c | 89 ++++++++++++++++++++++++++++++++++-
gtksourceview/gtksourcefile.h | 14 +++++-
gtksourceview/gtksourcefileloader.c | 3 +
gtksourceview/gtksourcefilesaver.c | 3 +
4 files changed, 107 insertions(+), 2 deletions(-)
---
diff --git a/gtksourceview/gtksourcefile.c b/gtksourceview/gtksourcefile.c
index 8926660..46fea65 100644
--- a/gtksourceview/gtksourcefile.c
+++ b/gtksourceview/gtksourcefile.c
@@ -2,7 +2,7 @@
/* gtksourcefile.c
* This file is part of GtkSourceView
*
- * Copyright (C) 2014 - Sébastien Wilmet <swilmet gnome org>
+ * Copyright (C) 2014, 2015 - Sébastien Wilmet <swilmet gnome org>
*
* GtkSourceView is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -65,6 +65,9 @@ struct _GtkSourceFilePrivate
GTimeVal modification_time;
guint modification_time_set : 1;
+
+ guint externally_modified : 1;
+ guint deleted : 1;
};
G_DEFINE_TYPE_WITH_PRIVATE (GtkSourceFile, gtk_source_file, G_TYPE_OBJECT)
@@ -457,3 +460,87 @@ _gtk_source_file_set_modification_time (GtkSourceFile *file,
file->priv->modification_time_set = TRUE;
}
}
+
+static void
+check_file_on_disk (GtkSourceFile *file)
+{
+ GFileInfo *info;
+
+ if (file->priv->location == NULL)
+ {
+ return;
+ }
+
+ info = g_file_query_info (file->priv->location,
+ G_FILE_ATTRIBUTE_TIME_MODIFIED,
+ G_FILE_QUERY_INFO_NONE,
+ NULL,
+ NULL);
+
+ if (info == NULL)
+ {
+ file->priv->deleted = TRUE;
+ }
+ else if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_TIME_MODIFIED) &&
+ file->priv->modification_time_set)
+ {
+ GTimeVal timeval;
+
+ g_file_info_get_modification_time (info, &timeval);
+
+ /* Note that the modification time can even go backwards if the
+ * user is copying over an old file.
+ */
+ if (timeval.tv_sec != file->priv->modification_time.tv_sec ||
+ timeval.tv_usec != file->priv->modification_time.tv_usec)
+ {
+ file->priv->externally_modified = TRUE;
+ }
+ }
+
+ g_clear_object (&info);
+}
+
+void
+_gtk_source_file_set_externally_modified (GtkSourceFile *file,
+ gboolean externally_modified)
+{
+ g_return_if_fail (GTK_SOURCE_IS_FILE (file));
+
+ file->priv->externally_modified = externally_modified != FALSE;
+}
+
+gboolean
+gtk_source_file_is_externally_modified (GtkSourceFile *file)
+{
+ g_return_val_if_fail (GTK_SOURCE_IS_FILE (file), FALSE);
+
+ if (!file->priv->externally_modified)
+ {
+ check_file_on_disk (file);
+ }
+
+ return file->priv->externally_modified;
+}
+
+void
+_gtk_source_file_set_deleted (GtkSourceFile *file,
+ gboolean deleted)
+{
+ g_return_if_fail (GTK_SOURCE_IS_FILE (file));
+
+ file->priv->deleted = deleted != FALSE;
+}
+
+gboolean
+gtk_source_file_is_deleted (GtkSourceFile *file)
+{
+ g_return_val_if_fail (GTK_SOURCE_IS_FILE (file), FALSE);
+
+ if (!file->priv->deleted)
+ {
+ check_file_on_disk (file);
+ }
+
+ return file->priv->deleted;
+}
diff --git a/gtksourceview/gtksourcefile.h b/gtksourceview/gtksourcefile.h
index e4859f1..ddb7987 100644
--- a/gtksourceview/gtksourcefile.h
+++ b/gtksourceview/gtksourcefile.h
@@ -2,7 +2,7 @@
/* gtksourcefile.h
* This file is part of GtkSourceView
*
- * Copyright (C) 2014 - Sébastien Wilmet <swilmet gnome org>
+ * Copyright (C) 2014, 2015 - Sébastien Wilmet <swilmet gnome org>
*
* GtkSourceView is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -87,6 +87,10 @@ void gtk_source_file_set_mount_operation_factory (GtkSourceFile
gpointer user_data,
GDestroyNotify notify);
+gboolean gtk_source_file_is_externally_modified (GtkSourceFile *file);
+
+gboolean gtk_source_file_is_deleted (GtkSourceFile *file);
+
G_GNUC_INTERNAL
void _gtk_source_file_set_encoding (GtkSourceFile *file,
const GtkSourceEncoding *encoding);
@@ -110,6 +114,14 @@ G_GNUC_INTERNAL
void _gtk_source_file_set_modification_time (GtkSourceFile *file,
GTimeVal modification_time);
+G_GNUC_INTERNAL
+void _gtk_source_file_set_externally_modified (GtkSourceFile *file,
+ gboolean externally_modified);
+
+G_GNUC_INTERNAL
+void _gtk_source_file_set_deleted (GtkSourceFile *file,
+ gboolean deleted);
+
G_END_DECLS
#endif /* __GTK_SOURCE_FILE_H__ */
diff --git a/gtksourceview/gtksourcefileloader.c b/gtksourceview/gtksourcefileloader.c
index cfec545..244b579 100644
--- a/gtksourceview/gtksourcefileloader.c
+++ b/gtksourceview/gtksourcefileloader.c
@@ -1131,6 +1131,9 @@ gtk_source_file_loader_load_finish (GtkSourceFileLoader *loader,
_gtk_source_file_set_compression_type (loader->priv->file,
loader->priv->auto_detected_compression_type);
+ _gtk_source_file_set_externally_modified (loader->priv->file, FALSE);
+ _gtk_source_file_set_deleted (loader->priv->file, FALSE);
+
if (g_file_info_has_attribute (loader->priv->info, G_FILE_ATTRIBUTE_TIME_MODIFIED))
{
GTimeVal modification_time;
diff --git a/gtksourceview/gtksourcefilesaver.c b/gtksourceview/gtksourcefilesaver.c
index 0c6e3c9..d88d910 100644
--- a/gtksourceview/gtksourcefilesaver.c
+++ b/gtksourceview/gtksourcefilesaver.c
@@ -1404,6 +1404,9 @@ gtk_source_file_saver_save_finish (GtkSourceFileSaver *saver,
_gtk_source_file_set_compression_type (saver->priv->file,
saver->priv->compression_type);
+ _gtk_source_file_set_externally_modified (saver->priv->file, FALSE);
+ _gtk_source_file_set_deleted (saver->priv->file, FALSE);
+
if (g_file_info_has_attribute (saver->priv->info, G_FILE_ATTRIBUTE_TIME_MODIFIED))
{
GTimeVal modification_time;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]