[gedit/wip/loader-saver] Use GtkSourceFile for file saving (not finished!)
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit/wip/loader-saver] Use GtkSourceFile for file saving (not finished!)
- Date: Fri, 3 Jan 2014 23:24:00 +0000 (UTC)
commit 1aa068c5afb23ca9f6c2d8ab0359dadd6e07df12
Author: Sébastien Wilmet <swilmet gnome org>
Date: Mon Dec 30 16:47:03 2013 +0100
Use GtkSourceFile for file saving (not finished!)
The plan is to write an adapter between the GeditDocument and
GtkSourceFile APIs.
docs/reference/Makefile.am | 1 -
gedit/Makefile.am | 4 -
gedit/gedit-document-input-stream.c | 506 -----------------
gedit/gedit-document-input-stream.h | 71 ---
gedit/gedit-document-saver.c | 1061 -----------------------------------
gedit/gedit-document-saver.h | 121 ----
gedit/gedit-document.c | 263 +++++----
gedit/gedit-settings.h | 1 +
po/POTFILES.in | 1 -
tests/Makefile.am | 12 +-
tests/document-input-stream.c | 156 -----
tests/document-saver.c | 750 -------------------------
tests/setup-document-saver.sh | 27 -
13 files changed, 158 insertions(+), 2816 deletions(-)
---
diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am
index 8e18e30..9518c13 100644
--- a/docs/reference/Makefile.am
+++ b/docs/reference/Makefile.am
@@ -42,7 +42,6 @@ CFILE_GLOB=$(top_srcdir)/gedit/*.c
IGNORE_HFILES= \
gedit-commands.h \
gedit-document-loader.h \
- gedit-document-saver.h \
gedit-documents-panel.h \
gedit-io-error-info-bar.h \
gedit-languages-manager.h \
diff --git a/gedit/Makefile.am b/gedit/Makefile.am
index 9ce957c..c569fc2 100644
--- a/gedit/Makefile.am
+++ b/gedit/Makefile.am
@@ -99,10 +99,8 @@ NOINST_H_FILES = \
gedit-cell-renderer-button.h \
gedit-close-confirmation-dialog.h \
gedit-dirs.h \
- gedit-document-input-stream.h \
gedit-document-loader.h \
gedit-document-output-stream.h \
- gedit-document-saver.h \
gedit-documents-panel.h \
gedit-encodings-dialog.h \
gedit-file-chooser-dialog.h \
@@ -178,10 +176,8 @@ libgedit_c_files = \
gedit-debug.c \
gedit-dirs.c \
gedit-document.c \
- gedit-document-input-stream.c \
gedit-document-loader.c \
gedit-document-output-stream.c \
- gedit-document-saver.c \
gedit-documents-panel.c \
gedit-encodings.c \
gedit-encodings-combo-box.c \
diff --git a/gedit/gedit-document.c b/gedit/gedit-document.c
index 33b4bd5..a8a0344 100644
--- a/gedit/gedit-document.c
+++ b/gedit/gedit-document.c
@@ -5,6 +5,7 @@
* Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence
* Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi
* Copyright (C) 2002-2005 Paolo Maggi
+ * Copyright (C) 2014 Sébastien Wilmet
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -22,14 +23,6 @@
* Boston, MA 02111-1307, USA.
*/
-/*
- * Modified by the gedit Team, 1998-2005. See the AUTHORS file for a
- * list of people on the gedit Team.
- * See the ChangeLog files for a list of changes.
- *
- * $Id$
- */
-
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -45,7 +38,6 @@
#include "gedit-debug.h"
#include "gedit-utils.h"
#include "gedit-document-loader.h"
-#include "gedit-document-saver.h"
#include "gedit-marshal.h"
#include "gedit-enum-types.h"
@@ -79,6 +71,7 @@ static void gedit_document_load_real (GeditDocument *doc,
gint line_pos,
gint column_pos,
gboolean create);
+
static void gedit_document_save_real (GeditDocument *doc,
GFile *location,
const GeditEncoding *encoding,
@@ -123,7 +116,7 @@ struct _GeditDocumentPrivate
gint requested_column_pos;
/* Saving stuff */
- GeditDocumentSaver *saver;
+ GtkSourceFile *source_file;
GtkTextTag *error_tag;
@@ -1445,8 +1438,8 @@ document_loader_loaded (GeditDocumentLoader *loader,
g_get_current_time (&doc->priv->time_of_last_save_or_load);
- doc->priv->externally_modified = FALSE;
- doc->priv->deleted = FALSE;
+ doc->priv->externally_modified = FALSE;
+ doc->priv->deleted = FALSE;
set_encoding (doc,
gedit_document_loader_get_encoding (loader),
@@ -1718,83 +1711,132 @@ has_invalid_chars (GeditDocument *doc)
return FALSE;
}
-static void
-document_saver_saving (GeditDocumentSaver *saver,
- gboolean completed,
- const GError *error,
- GeditDocument *doc)
+static GtkSourceNewlineType
+convert_newline_type (GeditDocumentNewlineType gedit_newline_type)
{
- gedit_debug (DEBUG_DOCUMENT);
+ switch (gedit_newline_type)
+ {
+ case GEDIT_DOCUMENT_NEWLINE_TYPE_LF:
+ return GTK_SOURCE_NEWLINE_TYPE_LF;
- if (completed)
+ case GEDIT_DOCUMENT_NEWLINE_TYPE_CR:
+ return GTK_SOURCE_NEWLINE_TYPE_CR;
+
+ case GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF:
+ return GTK_SOURCE_NEWLINE_TYPE_CR_LF;
+ }
+
+ g_return_val_if_reached (GTK_SOURCE_NEWLINE_TYPE_LF);
+}
+
+static GtkSourceCompressionType
+convert_compression_type (GeditDocumentCompressionType gedit_compression_type)
+{
+ switch (gedit_compression_type)
{
- /* save was successful */
- if (error == NULL)
- {
- GFile *location;
- const gchar *content_type = NULL;
- GTimeVal mtime = {0, 0};
- GFileInfo *info;
+ case GEDIT_DOCUMENT_COMPRESSION_TYPE_NONE:
+ return GTK_SOURCE_COMPRESSION_TYPE_NONE;
- location = gedit_document_saver_get_location (saver);
- set_location (doc, location);
- g_object_unref (location);
+ case GEDIT_DOCUMENT_COMPRESSION_TYPE_GZIP:
+ return GTK_SOURCE_COMPRESSION_TYPE_GZIP;
+ }
- info = gedit_document_saver_get_info (saver);
+ g_return_val_if_reached (GTK_SOURCE_COMPRESSION_TYPE_NONE);
+}
- if (info != NULL)
- {
- if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE))
- content_type = g_file_info_get_attribute_string (info,
-
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
+static GtkSourceFileSaveFlags
+convert_save_flags (GeditDocumentSaveFlags gedit_flags)
+{
+ GtkSourceFileSaveFlags source_flags = 0;
- if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_TIME_MODIFIED))
- g_file_info_get_modification_time (info, &mtime);
- }
+ if (gedit_flags & GEDIT_DOCUMENT_SAVE_IGNORE_MTIME)
+ {
+ source_flags |= GTK_SOURCE_FILE_SAVE_IGNORE_MTIME;
+ }
- set_content_type (doc, content_type);
- doc->priv->mtime = mtime;
+ if (gedit_flags & GEDIT_DOCUMENT_SAVE_IGNORE_INVALID_CHARS)
+ {
+ source_flags |= GTK_SOURCE_FILE_SAVE_IGNORE_INVALID_CHARS;
+ }
+
+ if ((gedit_flags & GEDIT_DOCUMENT_SAVE_PRESERVE_BACKUP) == 0 &&
+ (gedit_flags & GEDIT_DOCUMENT_SAVE_IGNORE_BACKUP) == 0)
+ {
+ source_flags |= GTK_SOURCE_FILE_SAVE_CREATE_BACKUP;
+ }
+}
+
+static void
+save_progress_cb (goffset current_position,
+ goffset total_size,
+ GeditDocument *doc)
+{
+ g_signal_emit (doc,
+ document_signals[SAVING],
+ 0,
+ current_position,
+ total_size);
+}
+
+static void
+saved_cb (GtkSourceFile *source_file,
+ GAsyncResult *result,
+ GeditDocument *doc)
+{
+ GError *error = NULL;
- g_get_current_time (&doc->priv->time_of_last_save_or_load);
+ gtk_source_file_save_finish (source_file, result, &error);
- doc->priv->externally_modified = FALSE;
- doc->priv->deleted = FALSE;
+ /* save was successful */
+ if (error == NULL)
+ {
+ GFile *location;
+ const gchar *content_type = NULL;
+ GTimeVal mtime = {0, 0};
+ GFileInfo *info;
+
+ location = gedit_document_saver_get_location (saver);
+ set_location (doc, location);
+ g_object_unref (location);
- _gedit_document_set_readonly (doc, FALSE);
+ info = gedit_document_saver_get_info (saver);
- gtk_text_buffer_set_modified (GTK_TEXT_BUFFER (doc),
- FALSE);
+ if (info != NULL)
+ {
+ if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE))
+ content_type = g_file_info_get_attribute_string (info,
+
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
- set_encoding (doc,
- doc->priv->requested_encoding,
- TRUE);
+ if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_TIME_MODIFIED))
+ g_file_info_get_modification_time (info, &mtime);
}
- g_signal_emit (doc,
- document_signals[SAVED],
- 0,
- error);
+ set_content_type (doc, content_type);
+ doc->priv->mtime = mtime;
- /* the saver has been used, throw it away */
- g_object_unref (doc->priv->saver);
- doc->priv->saver = NULL;
- }
- else
- {
- goffset size = 0;
- goffset written = 0;
+ g_get_current_time (&doc->priv->time_of_last_save_or_load);
- size = gedit_document_saver_get_file_size (saver);
- written = gedit_document_saver_get_bytes_written (saver);
+ doc->priv->externally_modified = FALSE;
+ doc->priv->deleted = FALSE;
- gedit_debug_message (DEBUG_DOCUMENT, "save progress: %" G_GINT64_FORMAT " of %"
G_GINT64_FORMAT, written, size);
+ _gedit_document_set_readonly (doc, FALSE);
- g_signal_emit (doc,
- document_signals[SAVING],
- 0,
- written,
- size);
+ gtk_text_buffer_set_modified (GTK_TEXT_BUFFER (doc),
+ FALSE);
+
+ set_encoding (doc,
+ doc->priv->requested_encoding,
+ TRUE);
}
+
+ g_signal_emit (doc,
+ document_signals[SAVED],
+ 0,
+ error);
+
+ /* the saver has been used, throw it away */
+ g_object_unref (doc->priv->saver);
+ doc->priv->saver = NULL;
}
static void
@@ -1805,7 +1847,9 @@ gedit_document_save_real (GeditDocument *doc,
GeditDocumentCompressionType compression_type,
GeditDocumentSaveFlags flags)
{
- g_return_if_fail (doc->priv->saver == NULL);
+ gboolean ensure_trailing_newline;
+
+ g_return_if_fail (doc->priv->source_file == NULL);
if (!(flags & GEDIT_DOCUMENT_SAVE_IGNORE_INVALID_CHARS) && has_invalid_chars (doc))
{
@@ -1822,29 +1866,51 @@ gedit_document_save_real (GeditDocument *doc,
error);
g_error_free (error);
+ return;
}
- else
+
+ /* Do not make backups for remote files so they do not clutter
+ * remote systems. */
+ if (!gedit_document_is_local (doc) ||
+ !g_settings_get_boolean (doc->priv->editor_settings,
+ GEDIT_SETTINGS_CREATE_BACKUP_COPY))
{
- /* create a saver, it will be destroyed once saving is complete */
- doc->priv->saver = gedit_document_saver_new (doc,
- location,
- encoding,
- newline_type,
- compression_type,
- flags);
+ flags |= GEDIT_DOCUMENT_SAVE_IGNORE_BACKUP;
+ }
- g_signal_connect (doc->priv->saver,
- "saving",
- G_CALLBACK (document_saver_saving),
- doc);
+ doc->priv->requested_encoding = encoding;
+ doc->priv->newline_type = newline_type;
+ doc->priv->compression_type = compression_type;
- doc->priv->requested_encoding = encoding;
- doc->priv->newline_type = newline_type;
- doc->priv->compression_type = compression_type;
+ /* Create source file, it will be destroyed when the saving is finished. */
+ doc->priv->source_file = gtk_source_file_new (location, GTK_SOURCE_BUFFER (doc));
- gedit_document_saver_save (doc->priv->saver,
- &doc->priv->mtime);
- }
+ gtk_source_file_set_encoding (doc->priv->source_file,
+ (const GtkSourceEncoding *)encoding);
+
+ gtk_source_file_set_newline_type (doc->priv->source_file,
+ convert_newline_type (newline_type));
+
+ gtk_source_file_set_compression_type (doc->priv->source_file,
+ convert_compression_type (compression_type));
+
+ ensure_trailing_newline = g_settings_get_boolean (doc->priv->editor_settings,
+ GEDIT_SETTINGS_ENSURE_TRAILING_NEWLINE);
+
+ gtk_source_file_set_ensure_trailing_newline (doc->priv->source_file, ensure_trailing_newline);
+
+ gtk_source_file_set_mount_operation_factory (doc->priv->source_file,
+ doc->priv->mount_operation_factory,
+ doc->priv->mount_operation_userdata);
+
+ gtk_source_file_save_async (doc->priv->source_file,
+ convert_save_flags (flags),
+ G_PRIORITY_HIGH,
+ NULL,
+ (GFileProgressCallback) save_progress_cb,
+ doc,
+ (GAsyncReadyCallback) saved_cb,
+ doc);
}
/**
@@ -1891,20 +1957,10 @@ gedit_document_save_as (GeditDocument *doc,
GeditDocumentCompressionType compression_type,
GeditDocumentSaveFlags flags)
{
- GError *error = NULL;
-
g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
g_return_if_fail (G_IS_FILE (location));
g_return_if_fail (encoding != NULL);
- if (has_invalid_chars (doc))
- {
- g_set_error_literal (&error,
- GEDIT_DOCUMENT_ERROR,
- GEDIT_DOCUMENT_ERROR_CONVERSION_FALLBACK,
- "The document contains invalid chars");
- }
-
/* priv->mtime refers to the the old location (if any). Thus, it should be
* ignored when saving as. */
g_signal_emit (doc,
@@ -1914,13 +1970,7 @@ gedit_document_save_as (GeditDocument *doc,
encoding,
newline_type,
compression_type,
- flags | GEDIT_DOCUMENT_SAVE_IGNORE_MTIME,
- error);
-
- if (error != NULL)
- {
- g_error_free (error);
- }
+ flags | GEDIT_DOCUMENT_SAVE_IGNORE_MTIME);
}
gboolean
@@ -2851,8 +2901,7 @@ _gedit_document_create_mount_operation (GeditDocument *doc)
}
else
{
- return doc->priv->mount_operation_factory (doc,
- doc->priv->mount_operation_userdata);
+ return doc->priv->mount_operation_factory (doc->priv->mount_operation_userdata);
}
}
diff --git a/gedit/gedit-settings.h b/gedit/gedit-settings.h
index 3b2224c..83bd843 100644
--- a/gedit/gedit-settings.h
+++ b/gedit/gedit-settings.h
@@ -108,6 +108,7 @@ void gedit_settings_set_list (GSettings
*settings,
#define GEDIT_SETTINGS_ENCODING_AUTO_DETECTED "auto-detected"
#define GEDIT_SETTINGS_ENCODING_SHOWN_IN_MENU "shown-in-menu"
#define GEDIT_SETTINGS_ACTIVE_PLUGINS "active-plugins"
+#define GEDIT_SETTINGS_ENSURE_TRAILING_NEWLINE "ensure-trailing-newline"
/* window state keys */
#define GEDIT_SETTINGS_WINDOW_STATE "state"
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 7989a66..5c93719 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -13,7 +13,6 @@ gedit/gedit-commands-help.c
gedit/gedit-commands-search.c
gedit/gedit-debug.c
gedit/gedit-document.c
-gedit/gedit-document-saver.c
gedit/gedit-documents-panel.c
gedit/gedit-encodings.c
gedit/gedit-encodings-combo-box.c
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 7d03798..cd9ec02 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -6,11 +6,7 @@ AM_CPPFLAGS = \
noinst_PROGRAMS = $(TEST_PROGS) $(TEST_GTK_PROGS)
progs_ldadd = $(top_builddir)/gedit/libgedit.la
-TEST_PROGS = document-input-stream
-document_input_stream_SOURCES = document-input-stream.c
-document_input_stream_LDADD = $(progs_ldadd)
-
-TEST_PROGS += document-output-stream
+TEST_PROGS = document-output-stream
document_output_stream_SOURCES = document-output-stream.c
document_output_stream_LDADD = $(progs_ldadd)
@@ -18,12 +14,6 @@ TEST_PROGS += document-loader
document_loader_SOURCES = document-loader.c
document_loader_LDADD = $(progs_ldadd)
-TEST_PROGS += document-saver
-document_saver_SOURCES = document-saver.c
-document_saver_LDADD = $(progs_ldadd)
-
TESTS = $(TEST_PROGS)
-EXTRA_DIST = setup-document-saver.sh
-
-include $(top_srcdir)/git.mk
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]