]> Pileus Git - grits/blobdiff - src/grits-prefs.c
Add cube GtkGL example
[grits] / src / grits-prefs.c
index 80a1d49f472095f93e3828a555e40f06c46688a5..51e19cd64eb9f5bb011cb6ebb980cc1f71d2d053 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2010 Andy Spencer <andy753421@gmail.com>
+ * Copyright (C) 2009-2011 Andy Spencer <andy753421@gmail.com>
  *
  * 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
@@ -33,6 +33,7 @@
 #include <config.h>
 
 #include <glib.h>
+#include <time.h>
 #include "grits-marshal.h"
 #include "grits-prefs.h"
 
@@ -42,6 +43,35 @@ enum {
 };
 static guint signals[NUM_SIGNALS];
 
+/* Helper functions */
+static void grits_prefs_save(GritsPrefs *prefs)
+{
+       g_debug("GritsPrefs: save");
+       gsize length;
+       gchar *dir = g_path_get_dirname(prefs->key_path);
+       if (!g_file_test(dir, G_FILE_TEST_EXISTS))
+               g_mkdir_with_parents(dir, 0755);
+       gchar *data = g_key_file_to_data(prefs->key_file, &length, NULL);
+       g_file_set_contents(prefs->key_path, data, length, NULL);
+       g_free(dir);
+       g_free(data);
+}
+static gboolean grits_prefs_try_save(GritsPrefs *prefs)
+{
+       const  time_t interval = 1;
+       static time_t lastsave = 0;
+       static guint  source   = 0;
+       if (time(NULL) - lastsave > interval) {
+               grits_prefs_save(prefs);
+               lastsave = time(NULL);
+               source   = 0;
+       } else if (source == 0) {
+               source = g_timeout_add_seconds(interval,
+                       (GSourceFunc)grits_prefs_try_save, prefs);
+       }
+       return FALSE;
+}
+
 /***********
  * Methods *
  ***********/
@@ -118,6 +148,7 @@ void grits_prefs_set_##name##_v(GritsPrefs *prefs,
        gchar *all = g_strconcat(group, "/", key, NULL);                             \
        g_signal_emit(prefs, signals[SIG_PREF_CHANGED], 0,                           \
                        all, g_type, &value);                                        \
+       grits_prefs_try_save(prefs);                                                 \
        g_free(all);                                                                 \
 }                                                                                    \
 void grits_prefs_set_##name(GritsPrefs *prefs, const gchar *key, const c_type value) \
@@ -147,15 +178,9 @@ static void grits_prefs_dispose(GObject *_prefs)
        g_debug("GritsPrefs: dispose");
        GritsPrefs *prefs = GRITS_PREFS(_prefs);
        if (prefs->key_file) {
-               gsize length;
-               gchar *dir = g_path_get_dirname(prefs->key_path);
-               g_mkdir_with_parents(dir, 0755);
-               gchar *data = g_key_file_to_data(prefs->key_file, &length, NULL);
-               g_file_set_contents(prefs->key_path, data, length, NULL);
+               grits_prefs_save(prefs);
                g_key_file_free(prefs->key_file);
                g_free(prefs->key_path);
-               g_free(dir);
-               g_free(data);
                prefs->key_file = NULL;
        }
        G_OBJECT_CLASS(grits_prefs_parent_class)->dispose(_prefs);