when saving config.cfg, only save settings which are not the same as 
default, hopefully will give a small boost to saving and loading times.
Doing a manual save from "manage settings" > "write config" will save 
every 
setting.
Adds an option to save a cfg file from only the settings needed in a 
theme .cfg (I may have missed some so let me know).


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12172 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index e9c9f4c..83cbe0e 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -10473,3 +10473,17 @@
     *: "Play Next"
   </voice>
 </phrase>
+<phrase>
+  id: LANG_SAVE_THEME
+  desc: save a theme file
+  user:
+  <source>
+    *: "Save Theme Settings"
+  </source>
+  <dest>
+    *: "Save Theme Settings"
+  </dest>
+  <voice>
+    *: "Save Theme Settings"
+  </voice>
+</phrase>
diff --git a/apps/settings.c b/apps/settings.c
index faf1f92..f0833a6 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -402,8 +402,41 @@
     }
     return true;
 }
+static bool is_changed(int setting_id)
+{
+	const struct settings_list *setting = &settings[setting_id];
+	switch (setting->flags&F_T_MASK)
+	{
+		case F_T_INT:
+		case F_T_UINT:
+			if (setting->flags&F_DEF_ISFUNC)
+			{
+				if (*(int*)setting->setting == setting->default_val.func())
+					return false;
+			}
+			else if (setting->flags&F_T_SOUND)
+			{
+				if (*(int*)setting->setting ==
+					sound_default(setting->sound_setting->setting))
+					return false;
+			}
+			else if (*(int*)setting->setting == setting->default_val.int_)
+				return false;
+			break;
+		case F_T_BOOL:
+			if (*(bool*)setting->setting == setting->default_val.bool_)
+				return false;
+			break;
+		case F_T_CHARPTR:
+		case F_T_UCHARPTR:
+			if (!strcmp((char*)setting->setting, setting->default_val.charptr))
+				return false;
+			break;
+	}
+	return true;
+}
 
-bool settings_write_config(char* filename)
+static bool settings_write_config(char* filename, int options)
 {
     int i;
     int fd;
@@ -418,6 +451,14 @@
         if (settings[i].cfg_name == NULL)
             continue;
         value[0] = '\0';
+		
+		if ((options == SETTINGS_SAVE_CHANGED) &&
+			!is_changed(i))
+			continue;
+		else if ((options == SETTINGS_SAVE_THEME) &&
+			((settings[i].flags&F_THEMESETTING) == 0))
+			continue;
+		
         switch (settings[i].flags&F_T_MASK)
         {
             case F_T_INT:
@@ -477,7 +518,7 @@
 {
     bool r1, r2;
     r1 = write_nvram_data(nvram_buffer,NVRAM_BLOCK_SIZE);
-    r2 = settings_write_config(CONFIGFILE);
+    r2 = settings_write_config(CONFIGFILE, SETTINGS_SAVE_CHANGED);
     return r1 || r2;
 }
 
@@ -536,7 +577,7 @@
     }
     return 0;
 }
-bool settings_save_config(void)
+bool settings_save_config(int options)
 {
     char filename[MAX_PATH];
 
@@ -554,7 +595,7 @@
         }
     }
 
-    if (settings_write_config(filename))
+    if (settings_write_config(filename, options))
         gui_syncsplash(HZ, true, str(LANG_SETTINGS_SAVED));
     else gui_syncsplash(HZ, true, str(LANG_FAILED));
     return true;
diff --git a/apps/settings.h b/apps/settings.h
index e8db328..ea3df8e 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -206,7 +206,11 @@
 
 void status_save( void );
 int settings_save(void);
-bool settings_save_config(void);
+/* defines for the options paramater */
+#define SETTINGS_SAVE_CHANGED 0
+#define SETTINGS_SAVE_ALL 1
+#define SETTINGS_SAVE_THEME 2
+bool settings_save_config(int options);
 
 void settings_reset(void);
 void sound_settings_apply(void);
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 6243607..f9ef383 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -155,7 +155,7 @@
     /* display */
     OFFON_SETTING(0,invert_cursor, LANG_INVERT_CURSOR,
         true,"invert cursor", NULL),
-    OFFON_SETTING(0,statusbar, LANG_STATUS_BAR, true,"statusbar", NULL),
+    OFFON_SETTING(F_THEMESETTING,statusbar, LANG_STATUS_BAR, true,"statusbar", NULL),
     OFFON_SETTING(0,scrollbar, LANG_SCROLL_BAR, true,"scrollbar", NULL),
 #if CONFIG_KEYPAD == RECORDER_PAD
     OFFON_SETTING(0,buttonbar, LANG_BUTTON_BAR ,true,"buttonbar", NULL),
@@ -287,9 +287,9 @@
     OFFON_SETTING(0,scroll_paginated,LANG_SCROLL_PAGINATED,
         false,"scroll paginated",NULL),
 #ifdef HAVE_LCD_COLOR
-    {F_T_INT|F_RGB,GS(fg_color),-1,INT(LCD_DEFAULT_FG),
+    {F_T_INT|F_RGB|F_THEMESETTING ,GS(fg_color),-1,INT(LCD_DEFAULT_FG),
         "foreground color",NULL,UNUSED},
-    {F_T_INT|F_RGB,GS(bg_color),-1,INT(LCD_DEFAULT_BG),
+    {F_T_INT|F_RGB|F_THEMESETTING ,GS(bg_color),-1,INT(LCD_DEFAULT_BG),
         "background color",NULL,UNUSED},
 #endif
     /* more playback */
@@ -676,16 +676,21 @@
 
     /** settings not in the old config blocks **/
 #ifdef CONFIG_TUNER
-    FILENAME_SETTING(0,fmr_file,"fmr","",FMPRESET_PATH "/",".fmr",MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING, fmr_file, "fmr",
+		"", FMPRESET_PATH "/", ".fmr", MAX_FILENAME+1),
 #endif
-    FILENAME_SETTING(0,font_file,"font","",FONT_DIR "/",".fnt",MAX_FILENAME+1),
-    FILENAME_SETTING(0,wps_file, "wps","",WPS_DIR "/",".wps",MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING, font_file, "font",
+		"", FONT_DIR "/", ".fnt", MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING,wps_file, "wps",
+		"", WPS_DIR "/", ".wps", MAX_FILENAME+1),
     FILENAME_SETTING(0,lang_file,"lang","",LANG_DIR "/",".lng",MAX_FILENAME+1),
 #ifdef HAVE_REMOTE_LCD
-    FILENAME_SETTING(0,rwps_file,"rwps","",WPS_DIR "/",".rwps",MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING,rwps_file,"rwps",
+		"", WPS_DIR "/", ".rwps", MAX_FILENAME+1),
 #endif
 #if LCD_DEPTH > 1
-    FILENAME_SETTING(0,backdrop_file,"backdrop","",BACKDROP_DIR "/",".bmp",MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING,backdrop_file,"backdrop",
+		"", BACKDROP_DIR "/", ".bmp", MAX_FILENAME+1),
 #endif
 #ifdef HAVE_LCD_BITMAP
     FILENAME_SETTING(0,kbd_file,"kbd","",ROCKBOX_DIR "/",".kbd",MAX_FILENAME+1),
diff --git a/apps/settings_list.h b/apps/settings_list.h
index 9e50b85..195703b 100644
--- a/apps/settings_list.h
+++ b/apps/settings_list.h
@@ -83,10 +83,10 @@
 - number of bytes for a NVRAM setting is changed
 - a NVRAM setting is removed
 */
-
+#define F_THEMESETTING	0x800000
 
 struct settings_list {
-    uint32_t             flags;   /* ____ ____ _FFF ____ ____ NNN_ IFRB STTT */
+    uint32_t             flags;   /* ____ ____ TFFF ____ ____ NNN_ IFRB STTT */
     void                *setting;
     int                  lang_id; /* -1 for none */
     union storage_type   default_val;
diff --git a/apps/settings_menu.c b/apps/settings_menu.c
index b1204e2..8e6fbd0 100644
--- a/apps/settings_menu.c
+++ b/apps/settings_menu.c
@@ -2161,6 +2161,14 @@
     return result;
 }
 #endif
+static bool manage_settings_write_config(void)
+{
+	return settings_save_config(SETTINGS_SAVE_ALL);
+}
+static bool manage_settings_write_theme(void)
+{
+	return settings_save_config(SETTINGS_SAVE_THEME);
+}
 
 bool manage_settings_menu(void)
 {
@@ -2170,7 +2178,8 @@
     static const struct menu_item items[] = {
         { ID2P(LANG_CUSTOM_CFG),      custom_cfg_browse },
         { ID2P(LANG_RESET),           reset_settings },
-        { ID2P(LANG_SAVE_SETTINGS),   settings_save_config },
+        { ID2P(LANG_SAVE_SETTINGS),   manage_settings_write_config},
+        { ID2P(LANG_SAVE_THEME),      manage_settings_write_theme},
     };
 
     m=menu_init( items, sizeof(items) / sizeof(*items), NULL,