[gnome-latex: 190/205] Autosave files every X minutes
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-latex: 190/205] Autosave files every X minutes
- Date: Fri, 14 Dec 2018 11:02:51 +0000 (UTC)
commit f3c5f13c2be5a2aa7d854ae6149990ad25104433
Author: Sébastien Wilmet <sebastien wilmet gmail com>
Date: Tue Jan 26 23:33:51 2010 +0100
Autosave files every X minutes
We use g_timeout_add_seconds() to create timeouts. There is an option in
the preferences, with a spin button to choose the minutes (between 1 and
100). By default the option is disabled.
TODO | 6 ++--
src/callbacks.c | 40 +++++++++++++++++++++---
src/callbacks.h | 2 ++
src/main.c | 8 +++++
src/main.h | 3 ++
src/prefs.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 150 insertions(+), 6 deletions(-)
---
diff --git a/TODO b/TODO
index b8daab5..6ea2c4a 100644
--- a/TODO
+++ b/TODO
@@ -1,8 +1,10 @@
TODO LaTeXila
- Some various improvements:
- - Autosave files every X minutes
- - Symbols: most recently used
- Create personnal templates: choose an icon
+ - Symbols: most recently used
+ - Syntax highlighting for BibTeX (*.bib)
+ - Choose encoding in "save as" dialog
+ - Choose end of line: unix, dos or mac
- Auto-completion of LaTeX commands
diff --git a/src/callbacks.c b/src/callbacks.c
index 90f4c5f..46d15b6 100644
--- a/src/callbacks.c
+++ b/src/callbacks.c
@@ -868,10 +868,14 @@ cb_documents_save_all (void)
while (current != NULL)
{
document_t *current_doc = current->data;
- document_t *active_doc = latexila.active_doc;
- latexila.active_doc = current_doc;
- cb_save ();
- latexila.active_doc = active_doc;
+
+ if (! current_doc->saved)
+ {
+ document_t *active_doc = latexila.active_doc;
+ latexila.active_doc = current_doc;
+ cb_save ();
+ latexila.active_doc = active_doc;
+ }
current = g_list_next (current);
}
@@ -1061,6 +1065,34 @@ cb_show_edit_toolbar (GtkToggleAction *toggle_action, gpointer user_data)
gtk_widget_hide (latexila.edit_toolbar);
}
+gboolean
+auto_save_files (gpointer data)
+{
+ if (! latexila.prefs.auto_save)
+ {
+ // destroy the timeout
+ return FALSE;
+ }
+
+ GList *current = latexila.all_docs;
+ while (current != NULL)
+ {
+ document_t *current_doc = current->data;
+
+ if (! current_doc->saved && current_doc->path != NULL)
+ {
+ document_t *active_doc = latexila.active_doc;
+ latexila.active_doc = current_doc;
+ cb_save ();
+ latexila.active_doc = active_doc;
+ }
+
+ current = g_list_next (current);
+ }
+
+ return TRUE;
+}
+
void
open_new_document_without_uri (const gchar *filename)
{
diff --git a/src/callbacks.h b/src/callbacks.h
index f8fa7cf..71f50a6 100644
--- a/src/callbacks.h
+++ b/src/callbacks.h
@@ -83,6 +83,8 @@ void cb_recent_item_activated (GtkRecentAction *action, gpointer user_data);
void cb_show_side_pane (GtkToggleAction *toggle_action, gpointer user_data);
void cb_show_edit_toolbar (GtkToggleAction *toggle_action, gpointer user_data);
+gboolean auto_save_files (gpointer data);
+
void open_new_document_without_uri (const gchar *filename);
void open_new_document (const gchar *filename, const gchar *uri);
void change_font_source_view (void);
diff --git a/src/main.c b/src/main.c
index 7ae58a3..e758b07 100644
--- a/src/main.c
+++ b/src/main.c
@@ -523,6 +523,14 @@ main (int argc, char *argv[])
if (option_new_document)
cb_new ();
+ /* timeout for saving files every X minutes */
+ if (latexila.prefs.auto_save)
+ latexila.auto_save_timeout = g_timeout_add_seconds (
+ 60 * latexila.prefs.auto_save_interval,
+ (GSourceFunc) auto_save_files, NULL);
+ else
+ latexila.auto_save_timeout = 0;
+
gtk_main ();
diff --git a/src/main.h b/src/main.h
index b54b16c..8e29be9 100644
--- a/src/main.h
+++ b/src/main.h
@@ -96,6 +96,8 @@ typedef struct
gboolean toolbars_horizontal;
gint side_pane_page;
gboolean make_backup;
+ gboolean auto_save;
+ gint auto_save_interval;
} preferences_t;
// actions from the menu or the toolbars
@@ -155,6 +157,7 @@ typedef struct
GtkPaned *log_hpaned;
GtkWidget *edit_toolbar;
GtkWidget *side_pane;
+ guint auto_save_timeout;
} latexila_t;
// a lot of things are accessible by the "latexila" variable everywhere in the
diff --git a/src/prefs.c b/src/prefs.c
index e45704a..362f59d 100644
--- a/src/prefs.c
+++ b/src/prefs.c
@@ -47,6 +47,10 @@ static void cb_pref_highlight_matching_brackets (GtkToggleButton *toggle_button,
gpointer user_data);
static void cb_pref_make_backup (GtkToggleButton *toggle_button,
gpointer user_data);
+static void cb_pref_auto_save (GtkToggleButton *toggle_button,
+ GtkWidget *spin_button);
+static void cb_pref_auto_save_interval (GtkSpinButton *spin_button,
+ gpointer user_data);
static void cb_pref_font_set (GtkFontButton *font_button, gpointer user_data);
static void cb_pref_command_view (GtkEditable *editable, gpointer user_data);
static void cb_pref_command_latex (GtkEditable *editable, gpointer user_data);
@@ -109,6 +113,8 @@ static gboolean highlight_matching_brackets_ = TRUE;
static gboolean toolbars_horizontal_ = FALSE;
static gint side_pane_page_ = 0;
static gboolean make_backup_ = TRUE;
+static gboolean auto_save_ = FALSE;
+static gint auto_save_interval_ = 10;
void
load_preferences (preferences_t *prefs)
@@ -510,6 +516,26 @@ load_preferences (preferences_t *prefs)
error = NULL;
}
+ prefs->auto_save = g_key_file_get_boolean (key_file,
+ PROGRAM_NAME, "auto_save", &error);
+ if (error != NULL)
+ {
+ print_warning ("%s", error->message);
+ prefs->auto_save = auto_save_;
+ g_error_free (error);
+ error = NULL;
+ }
+
+ prefs->auto_save_interval = g_key_file_get_integer (key_file,
+ PROGRAM_NAME, "auto_save_interval", &error);
+ if (error != NULL)
+ {
+ print_warning ("%s", error->message);
+ prefs->auto_save_interval = auto_save_interval_;
+ g_error_free (error);
+ error = NULL;
+ }
+
g_key_file_free (key_file);
}
@@ -576,6 +602,10 @@ save_preferences (preferences_t *prefs)
prefs->toolbars_horizontal);
g_key_file_set_boolean (key_file, PROGRAM_NAME, "make_backup",
prefs->make_backup);
+ g_key_file_set_boolean (key_file, PROGRAM_NAME, "auto_save",
+ prefs->auto_save);
+ g_key_file_set_integer (key_file, PROGRAM_NAME, "auto_save_interval",
+ prefs->auto_save_interval);
/* set the keys that must be taken from the widgets */
GdkWindowState flag = gdk_window_get_state (gtk_widget_get_window (
@@ -688,6 +718,8 @@ load_default_preferences (preferences_t *prefs)
prefs->toolbars_horizontal = toolbars_horizontal_;
prefs->side_pane_page = side_pane_page_;
prefs->make_backup = make_backup_;
+ prefs->auto_save = auto_save_;
+ prefs->auto_save_interval = auto_save_interval_;
set_current_font_prefs (prefs);
}
@@ -814,6 +846,44 @@ cb_pref_make_backup (GtkToggleButton *toggle_button, gpointer user_data)
latexila.prefs.make_backup = gtk_toggle_button_get_active (toggle_button);
}
+static void
+cb_pref_auto_save (GtkToggleButton *toggle_button, GtkWidget *spin_button)
+{
+ gboolean tmp = gtk_toggle_button_get_active (toggle_button);
+ latexila.prefs.auto_save = tmp;
+ gtk_widget_set_sensitive (spin_button, tmp);
+
+ // initialize the timeout
+ if (tmp)
+ {
+ latexila.auto_save_timeout = g_timeout_add_seconds (
+ 60 * latexila.prefs.auto_save_interval,
+ (GSourceFunc) auto_save_files, NULL);
+ }
+
+ // destroy the timeout
+ else if (latexila.auto_save_timeout > 0)
+ {
+ g_source_remove (latexila.auto_save_timeout);
+ latexila.auto_save_timeout = 0;
+ }
+}
+
+static void
+cb_pref_auto_save_interval (GtkSpinButton *spin_button, gpointer user_data)
+{
+ gint value = gtk_spin_button_get_value_as_int (spin_button);
+ latexila.prefs.auto_save_interval = value;
+
+ // destroy the timeout
+ if (latexila.auto_save_timeout > 0)
+ g_source_remove (latexila.auto_save_timeout);
+
+ // initialize the timeout with the new value
+ latexila.auto_save_timeout = g_timeout_add_seconds (
+ 60 * value, (GSourceFunc) auto_save_files, NULL);
+}
+
static void
cb_pref_font_set (GtkFontButton *font_button, gpointer user_data)
{
@@ -1161,6 +1231,33 @@ create_preferences (void)
gtk_box_pack_start (GTK_BOX (vbox_editor), make_backup, FALSE, FALSE, 0);
}
+ /* auto save files */
+ {
+ GtkWidget *hbox = gtk_hbox_new (FALSE, 6);
+ GtkWidget *check_button = gtk_check_button_new_with_label (
+ _("Autosave files every"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
+ latexila.prefs.auto_save);
+
+ GtkAdjustment *spinner_adj = (GtkAdjustment *) gtk_adjustment_new (
+ (gdouble) latexila.prefs.auto_save_interval,
+ 1.0, 100.0, 1.0, 0.0, 0.0);
+ GtkWidget *spin_button = gtk_spin_button_new (spinner_adj, 1.0, 0);
+ g_signal_connect (G_OBJECT (spin_button), "value-changed",
+ G_CALLBACK (cb_pref_auto_save_interval), NULL);
+ gtk_widget_set_sensitive (spin_button, latexila.prefs.auto_save);
+
+ g_signal_connect (G_OBJECT (check_button), "toggled",
+ G_CALLBACK (cb_pref_auto_save), spin_button);
+
+ GtkWidget *minutes = gtk_label_new (_("minutes"));
+
+ gtk_box_pack_start (GTK_BOX (hbox), check_button, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), spin_button, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), minutes, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox_editor), hbox, FALSE, FALSE, 0);
+ }
+
/* font */
{
GtkWidget *hbox = gtk_hbox_new (FALSE, 5);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]