[gnome-latex: 190/205] Autosave files every X minutes



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]