aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorBill Meier <wmeier@newsguy.com>2009-05-05 13:19:46 +0000
committerBill Meier <wmeier@newsguy.com>2009-05-05 13:19:46 +0000
commitf7f397581ede979d4811bcacdbf5a016beaf574c (patch)
tree8411f6547d742a1cffd0adca013b95a8ed3773c7 /gtk
parent7e0b58eb0e884de50270d00d1f80a4b1186a6bee (diff)
prefs_dlg: Cancel always reverts to "Last Saved" [Part 1]
svn path=/trunk/; revision=28276
Diffstat (limited to 'gtk')
-rw-r--r--gtk/prefs_dlg.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/gtk/prefs_dlg.c b/gtk/prefs_dlg.c
index 2c3c31ddea..9b9ef9c022 100644
--- a/gtk/prefs_dlg.c
+++ b/gtk/prefs_dlg.c
@@ -1337,6 +1337,61 @@ prefs_main_destroy_all(GtkWidget *dlg)
}
+static guint
+pref_copy(pref_t *pref, gpointer user_data _U_)
+{
+ switch (pref->type) {
+
+ case PREF_UINT:
+ pref->saved_val.uint = *pref->varp.uint;
+ break;
+
+ case PREF_BOOL:
+ pref->saved_val.boolval = *pref->varp.boolp;
+ break;
+
+ case PREF_ENUM:
+ pref->saved_val.enumval = *pref->varp.enump;
+ break;
+
+ case PREF_STRING:
+ g_free(pref->saved_val.string);
+ pref->saved_val.string = g_strdup(*pref->varp.string);
+ break;
+
+ case PREF_RANGE:
+ g_free(pref->saved_val.range);
+ pref->saved_val.range = range_copy(*pref->varp.range);
+ break;
+
+ case PREF_STATIC_TEXT:
+ case PREF_UAT:
+ break;
+
+ case PREF_OBSOLETE:
+ g_assert_not_reached();
+ break;
+ }
+ return 0;
+}
+
+static guint
+module_prefs_copy(module_t *module, gpointer user_data _U_)
+{
+ /* For all preferences in this module, (re)save current value */
+ prefs_pref_foreach(module, pref_copy, NULL);
+ return 0; /* continue making copies */
+}
+
+/* Copy prefs to saved values so we can revert to these values */
+/* if the user selects Cancel. */
+static void prefs_copy() {
+ free_prefs(&saved_prefs);
+ copy_prefs(&saved_prefs, &prefs);
+ prefs_modules_foreach(module_prefs_copy, NULL);
+}
+
+
void
prefs_main_write(void)
{
@@ -1415,6 +1470,7 @@ prefs_main_apply_cb(GtkWidget *apply_bt _U_, gpointer parent_w)
/* if we don't have a Save button, just save the settings now */
if (!prefs.gui_use_pref_save) {
prefs_main_write();
+ prefs_copy(); /* save prefs for reverting if Cancel */
}
prefs_main_apply_all(parent_w, must_redissect);
@@ -1441,6 +1497,7 @@ prefs_main_save_cb(GtkWidget *save_bt _U_, gpointer parent_w)
return; /* Errors in some preference setting - already reported */
prefs_main_write();
+ prefs_copy(); /* save prefs for reverting if Cancel */
/* Now apply those preferences.
XXX - should we do this? The user didn't click "OK" or "Apply".