[gedit/wip/loader-saver] tab: start port to GtkSourceFileSaver
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit/wip/loader-saver] tab: start port to GtkSourceFileSaver
- Date: Thu, 26 Jun 2014 13:41:39 +0000 (UTC)
commit 695b04caae8bcb670a4940288d87bec55c218f65
Author: Sébastien Wilmet <swilmet gnome org>
Date: Thu Jun 26 15:24:56 2014 +0200
tab: start port to GtkSourceFileSaver
gedit/gedit-tab.c | 225 +++++++++++++++++++++++++++++++----------------------
1 files changed, 131 insertions(+), 94 deletions(-)
---
diff --git a/gedit/gedit-tab.c b/gedit/gedit-tab.c
index 8e65f73..cd13008 100644
--- a/gedit/gedit-tab.c
+++ b/gedit/gedit-tab.c
@@ -55,7 +55,8 @@ struct _GeditTabPrivate
GeditPrintJob *print_job;
/* tmp data for saving */
- GFile *tmp_save_location;
+ GtkSourceFileSaver *saver;
+ GFile *tmp_save_location; /* TODO remove */
/* tmp data for loading */
GtkSourceFileLoader *loader;
@@ -67,7 +68,8 @@ struct _GeditTabPrivate
GTimer *timer;
- GeditDocumentSaveFlags save_flags;
+ GeditDocumentSaveFlags save_flags; /* TODO remove */
+ GtkSourceFileSaverFlags new_save_flags;
gint auto_save_interval;
guint auto_save_timeout;
@@ -809,7 +811,7 @@ show_saving_info_bar (GeditTab *tab)
gchar *msg = NULL;
gint len;
- g_return_if_fail (tab->priv->tmp_save_location != NULL);
+ g_return_if_fail (tab->priv->saver != NULL);
if (tab->priv->info_bar != NULL)
{
@@ -829,18 +831,17 @@ show_saving_info_bar (GeditTab *tab)
*/
if (len > MAX_MSG_LENGTH)
{
- from = gedit_utils_str_middle_truncate (short_name,
- MAX_MSG_LENGTH);
+ from = gedit_utils_str_middle_truncate (short_name, MAX_MSG_LENGTH);
g_free (short_name);
}
else
{
gchar *str;
+ GFile *location = gtk_source_file_saver_get_location (tab->priv->saver);
from = short_name;
- to = g_file_get_parse_name (tab->priv->tmp_save_location);
- str = gedit_utils_str_middle_truncate (to,
- MAX (20, MAX_MSG_LENGTH - len));
+ to = g_file_get_parse_name (location);
+ str = gedit_utils_str_middle_truncate (to, MAX (20, MAX_MSG_LENGTH - len));
g_free (to);
to = str;
@@ -854,9 +855,7 @@ show_saving_info_bar (GeditTab *tab)
/* Translators: the first %s is a file name (e.g. test.txt) the second one
is a directory (e.g. ssh://master.gnome.org/home/users/paolo) */
- msg = g_strdup_printf (_("Saving %s to %s"),
- from_markup,
- to_markup);
+ msg = g_strdup_printf (_("Saving %s to %s"), from_markup, to_markup);
g_free (to_markup);
}
else
@@ -864,9 +863,7 @@ show_saving_info_bar (GeditTab *tab)
msg = g_strdup_printf (_("Saving %s"), from_markup);
}
- bar = gedit_progress_info_bar_new ("document-save",
- msg,
- FALSE);
+ bar = gedit_progress_info_bar_new ("document-save", msg, FALSE);
set_info_bar (tab, bar, GTK_RESPONSE_NONE);
@@ -931,39 +928,6 @@ scroll_to_cursor (GeditTab *tab)
}
static void
-document_saving (GeditDocument *document,
- goffset size,
- goffset total_size,
- GeditTab *tab)
-{
- gdouble elapsed_time;
- gdouble total_time;
- gdouble remaining_time;
-
- g_return_if_fail (tab->priv->state == GEDIT_TAB_STATE_SAVING);
-
- if (tab->priv->timer == NULL)
- {
- tab->priv->timer = g_timer_new ();
- }
-
- elapsed_time = g_timer_elapsed (tab->priv->timer, NULL);
-
- /* elapsed_time / total_time = size / total_size */
- total_time = (elapsed_time * total_size) / size;
-
- remaining_time = total_time - elapsed_time;
-
- /* Approximately more than 3 seconds remaining. */
- if (remaining_time > 3.0)
- {
- show_saving_info_bar (tab);
- }
-
- info_bar_set_progress (tab, size, total_size);
-}
-
-static void
end_saving (GeditTab *tab)
{
/* Reset tmp data for saving */
@@ -1448,11 +1412,6 @@ gedit_tab_init (GeditTab *tab)
tab);
g_signal_connect (doc,
- "saving",
- G_CALLBACK (document_saving),
- tab);
-
- g_signal_connect (doc,
"saved",
G_CALLBACK (document_saved),
tab);
@@ -1758,9 +1717,9 @@ gedit_tab_get_from_document (GeditDocument *doc)
}
static void
-progress_cb (goffset size,
- goffset total_size,
- GeditTab *tab)
+loader_progress_cb (goffset size,
+ goffset total_size,
+ GeditTab *tab)
{
gdouble elapsed_time;
gdouble total_time;
@@ -1854,6 +1813,7 @@ load_cb (GtkSourceFileLoader *loader,
if (error != NULL)
{
+ /* TODO remove when no longer needed. */
g_warning ("File loading error: %s", error->message);
}
@@ -2106,7 +2066,7 @@ load (GeditTab *tab,
gtk_source_file_loader_load_async (tab->priv->loader,
G_PRIORITY_DEFAULT,
tab->priv->cancellable,
- (GFileProgressCallback) progress_cb,
+ (GFileProgressCallback) loader_progress_cb,
tab,
NULL,
(GAsyncReadyCallback) load_cb,
@@ -2210,43 +2170,120 @@ _gedit_tab_revert (GeditTab *tab)
load (tab, NULL, 0, 0);
}
+static void
+saver_progress_cb (goffset size,
+ goffset total_size,
+ GeditTab *tab)
+{
+ gdouble elapsed_time;
+ gdouble total_time;
+ gdouble remaining_time;
+
+ g_return_if_fail (tab->priv->state == GEDIT_TAB_STATE_SAVING);
+
+ if (tab->priv->timer == NULL)
+ {
+ tab->priv->timer = g_timer_new ();
+ }
+
+ elapsed_time = g_timer_elapsed (tab->priv->timer, NULL);
+
+ /* elapsed_time / total_time = size / total_size */
+ total_time = (elapsed_time * total_size) / size;
+
+ remaining_time = total_time - elapsed_time;
+
+ /* Approximately more than 3 seconds remaining. */
+ if (remaining_time > 3.0)
+ {
+ show_saving_info_bar (tab);
+ }
+
+ info_bar_set_progress (tab, size, total_size);
+}
+
+static void
+save_cb (GtkSourceFileSaver *saver,
+ GAsyncResult *result,
+ GeditTab *tab)
+{
+ GError *error = NULL;
+
+ gtk_source_file_saver_save_finish (saver, result, &error);
+
+ if (error != NULL)
+ {
+ /* TODO remove when no longer needed. */
+ g_warning ("File saving error: %s", error->message);
+ }
+
+ /* Async operation finished. */
+ g_object_unref (tab);
+
+ if (error != NULL)
+ {
+ g_error_free (error);
+ }
+}
+
+static void
+save (GeditTab *tab)
+{
+ g_return_if_fail (GTK_SOURCE_IS_FILE_SAVER (tab->priv->saver));
+
+ gedit_tab_set_state (tab, GEDIT_TAB_STATE_SAVING);
+
+ /* Keep the tab alive during the async operation. */
+ g_object_ref (tab);
+
+ gtk_source_file_saver_save_async (tab->priv->saver,
+ G_PRIORITY_DEFAULT,
+ NULL, /* TODO add a cancellable */
+ (GFileProgressCallback) saver_progress_cb,
+ tab,
+ NULL,
+ (GAsyncReadyCallback) save_cb,
+ tab);
+}
+
void
_gedit_tab_save (GeditTab *tab)
{
GeditDocument *doc;
- GeditDocumentSaveFlags save_flags;
+ GtkSourceFile *file;
+ GFile *location;
+ GtkSourceFileSaverFlags save_flags = tab->priv->new_save_flags;
g_return_if_fail (GEDIT_IS_TAB (tab));
g_return_if_fail (tab->priv->state == GEDIT_TAB_STATE_NORMAL ||
tab->priv->state == GEDIT_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION ||
tab->priv->state == GEDIT_TAB_STATE_SHOWING_PRINT_PREVIEW);
- g_return_if_fail (tab->priv->tmp_save_location == NULL);
- g_return_if_fail (tab->priv->tmp_encoding == NULL);
doc = gedit_tab_get_document (tab);
g_return_if_fail (!gedit_document_is_untitled (doc));
if (tab->priv->state == GEDIT_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)
{
- /* We already told the user about the external
- * modification: hide the message bar and set
- * the save flag.
+ /* We already told the user about the external modification:
+ * hide the message bar and set the save flag.
*/
set_info_bar (tab, NULL, GTK_RESPONSE_NONE);
- save_flags = tab->priv->save_flags | GEDIT_DOCUMENT_SAVE_IGNORE_MTIME;
+ save_flags |= GTK_SOURCE_FILE_SAVER_FLAGS_IGNORE_MODIFICATION_TIME;
}
- else
+
+ file = gedit_document_get_file (doc);
+ location = gtk_source_file_get_location (file);
+
+ if (tab->priv->saver != NULL)
{
- save_flags = tab->priv->save_flags;
+ g_warning ("GeditTab: file saver already exists.");
+ g_object_unref (tab->priv->saver);
}
- gedit_tab_set_state (tab, GEDIT_TAB_STATE_SAVING);
-
- /* location used in error messages, will be freed in document_saved */
- tab->priv->tmp_save_location = gedit_document_get_location (doc);
- tab->priv->tmp_encoding = gedit_document_get_encoding (doc);
+ tab->priv->saver = gtk_source_file_saver_new (file, location);
+ gtk_source_file_saver_set_flags (tab->priv->saver, save_flags);
- _gedit_document_save (doc, save_flags);
+ save (tab);
}
static gboolean
@@ -2303,6 +2340,7 @@ gedit_tab_auto_save (GeditTab *tab)
return G_SOURCE_REMOVE;
}
+/* TODO port to GtkSourceNewlineType and GtkSourceCompressionType */
void
_gedit_tab_save_as (GeditTab *tab,
GFile *location,
@@ -2311,7 +2349,8 @@ _gedit_tab_save_as (GeditTab *tab,
GeditDocumentCompressionType compression_type)
{
GeditDocument *doc;
- GeditDocumentSaveFlags save_flags;
+ GtkSourceFile *file;
+ GtkSourceFileSaverFlags save_flags;
g_return_if_fail (GEDIT_IS_TAB (tab));
g_return_if_fail (tab->priv->state == GEDIT_TAB_STATE_NORMAL ||
@@ -2320,41 +2359,39 @@ _gedit_tab_save_as (GeditTab *tab,
g_return_if_fail (G_IS_FILE (location));
g_return_if_fail (encoding != NULL);
- g_return_if_fail (tab->priv->tmp_save_location == NULL);
- g_return_if_fail (tab->priv->tmp_encoding == NULL);
-
doc = gedit_tab_get_document (tab);
/* reset the save flags, when saving as */
- tab->priv->save_flags = 0;
+ tab->priv->new_save_flags = GTK_SOURCE_FILE_SAVER_FLAGS_NONE;
+ save_flags = tab->priv->new_save_flags;
if (tab->priv->state == GEDIT_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)
{
- /* We already told the user about the external
- * modification: hide the message bar and set
- * the save flag.
+ /* We already told the user about the external modification:
+ * hide the message bar and set the save flag.
*/
set_info_bar (tab, NULL, GTK_RESPONSE_NONE);
- save_flags = tab->priv->save_flags | GEDIT_DOCUMENT_SAVE_IGNORE_MTIME;
+ save_flags |= GTK_SOURCE_FILE_SAVER_FLAGS_IGNORE_MODIFICATION_TIME;
}
- else
+
+ gedit_tab_set_state (tab, GEDIT_TAB_STATE_SAVING);
+
+ file = gedit_document_get_file (doc);
+
+ if (tab->priv->saver != NULL)
{
- save_flags = tab->priv->save_flags;
+ g_warning ("GeditTab: file saver already exists.");
+ g_object_unref (tab->priv->saver);
}
- gedit_tab_set_state (tab, GEDIT_TAB_STATE_SAVING);
+ tab->priv->saver = gtk_source_file_saver_new (file, location);
+
+ gtk_source_file_saver_set_encoding (tab->priv->saver, encoding);
+ gtk_source_file_saver_set_newline_type (tab->priv->saver, newline_type);
+ gtk_source_file_saver_set_compression_type (tab->priv->saver, compression_type);
+ gtk_source_file_saver_set_flags (tab->priv->saver, save_flags);
- /* location used in error messages... dup because errors are async
- * and the location can go away. Will be freed in document_saved. */
- tab->priv->tmp_save_location = g_file_dup (location);
- tab->priv->tmp_encoding = encoding;
-
- _gedit_document_save_as (doc,
- location,
- encoding,
- newline_type,
- compression_type,
- save_flags);
+ save (tab);
}
#define GEDIT_PAGE_SETUP_KEY "gedit-page-setup-key"
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]