From ed03c490d184a711e6e9a0a816585548ed068617 Mon Sep 17 00:00:00 2001 From: JosephMcc Date: Sat, 21 Jan 2017 14:08:11 -0800 Subject: [PATCH] xed-document: Rework externally modified/deleted check https://github.com/GNOME/gedit/commit/7c5e872ad6556c14714ffd87f8e9c235d71a9d9c --- xed/xed-document.c | 127 +++++++++++++++++++++++++++------------------ 1 file changed, 77 insertions(+), 50 deletions(-) diff --git a/xed/xed-document.c b/xed/xed-document.c index 694b3c7..ff9be4e 100644 --- a/xed/xed-document.c +++ b/xed/xed-document.c @@ -140,6 +140,8 @@ struct _XedDocumentPrivate gpointer mount_operation_userdata; guint readonly : 1; + guint externally_modified : 1; + guint deleted : 1; guint last_save_was_manually : 1; guint language_set_by_user : 1; guint stop_cursor_moved_emission : 1; @@ -1217,54 +1219,6 @@ xed_document_get_readonly (XedDocument *doc) return doc->priv->readonly; } -gboolean -_xed_document_check_externally_modified (XedDocument *doc) -{ - GFileInfo *info; - - g_return_val_if_fail (XED_IS_DOCUMENT (doc), FALSE); - - if (doc->priv->location == NULL) - { - return FALSE; - } - - info = g_file_query_info (doc->priv->location, - G_FILE_ATTRIBUTE_TIME_MODIFIED "," \ - G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, - G_FILE_QUERY_INFO_NONE, - NULL, NULL); - - if (info != NULL) - { - /* While at it also check if permissions changed */ - if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE)) - { - gboolean read_only; - - read_only = !g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); - - _xed_document_set_readonly (doc, read_only); - } - - if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_TIME_MODIFIED)) - { - GTimeVal timeval; - - g_file_info_get_modification_time (info, &timeval); - g_object_unref (info); - - return (timeval.tv_sec > doc->priv->mtime.tv_sec) || - (timeval.tv_sec == doc->priv->mtime.tv_sec && - timeval.tv_usec > doc->priv->mtime.tv_usec); - } - - g_object_unref (info); - } - - return FALSE; -} - static void reset_temp_loading_data (XedDocument *doc) { @@ -1317,6 +1271,9 @@ document_loader_loaded (XedDocumentLoader *loader, g_get_current_time (&doc->priv->time_of_last_save_or_load); + doc->priv->externally_modified = FALSE; + doc->priv->deleted = FALSE; + set_encoding (doc, xed_document_loader_get_encoding (loader), (doc->priv->requested_encoding != NULL)); set_content_type (doc, content_type); @@ -1551,6 +1508,9 @@ document_saver_saving (XedDocumentSaver *saver, g_get_current_time (&doc->priv->time_of_last_save_or_load); + doc->priv->externally_modified = FALSE; + doc->priv->deleted = FALSE; + _xed_document_set_readonly (doc, FALSE); gtk_text_buffer_set_modified (GTK_TEXT_BUFFER (doc), FALSE); @@ -1698,13 +1658,80 @@ xed_document_is_local (XedDocument *doc) return xed_utils_location_has_file_scheme (doc->priv->location); } +static void +check_file_on_disk (XedDocument *doc) +{ + GFileInfo *info; + + if (doc->priv->location == NULL) + { + return; + } + + info = g_file_query_info (doc->priv->location, + G_FILE_ATTRIBUTE_TIME_MODIFIED "," \ + G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, + G_FILE_QUERY_INFO_NONE, + NULL, NULL); + + if (info != NULL) + { + /* While at it also check if permissions changed */ + if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE)) + { + gboolean read_only; + + read_only = !g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); + + _xed_document_set_readonly (doc, read_only); + } + + if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_TIME_MODIFIED)) + { + GTimeVal timeval; + + g_file_info_get_modification_time (info, &timeval); + + if (timeval.tv_sec > doc->priv->mtime.tv_sec || + (timeval.tv_sec == doc->priv->mtime.tv_sec && + timeval.tv_usec > doc->priv->mtime.tv_usec)) + { + doc->priv->externally_modified = TRUE; + } + } + + g_object_unref (info); + } + else + { + doc->priv->deleted = TRUE; + } +} + +gboolean +_xed_document_check_externally_modified (XedDocument *doc) +{ + g_return_val_if_fail (XED_IS_DOCUMENT (doc), FALSE); + + if (!doc->priv->externally_modified) + { + check_file_on_disk (doc); + } + + return doc->priv->externally_modified; +} + gboolean xed_document_get_deleted (XedDocument *doc) { g_return_val_if_fail (XED_IS_DOCUMENT (doc), FALSE); - /* This is done sync, maybe we should do it async? */ - return doc->priv->location && !g_file_query_exists (doc->priv->location, NULL); + if (!doc->priv->deleted) + { + check_file_on_disk (doc); + } + + return doc->priv->deleted; } /*