summaryrefslogtreecommitdiff
path: root/apps/settings.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/settings.c')
-rw-r--r--apps/settings.c57
1 files changed, 49 insertions, 8 deletions
diff --git a/apps/settings.c b/apps/settings.c
index 4d4a96c639..42a66ace8b 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -395,7 +395,7 @@ bool settings_load_config(const char* file, bool apply)
395 395
396/** Writing to a config file and saving settings **/ 396/** Writing to a config file and saving settings **/
397 397
398static bool cfg_int_to_string(int setting_id, int val, char* buf) 398bool cfg_int_to_string(int setting_id, int val, char* buf, int buf_len)
399{ 399{
400 const char* start = settings[setting_id].cfg_vals; 400 const char* start = settings[setting_id].cfg_vals;
401 char* end = NULL; 401 char* end = NULL;
@@ -410,11 +410,12 @@ static bool cfg_int_to_string(int setting_id, int val, char* buf)
410 } 410 }
411 end = strchr(start,','); 411 end = strchr(start,',');
412 if (end == NULL) 412 if (end == NULL)
413 strcpy(buf,start); 413 strncpy(buf, start, buf_len);
414 else 414 else
415 { 415 {
416 strncpy(buf, start, end-start); 416 int len = (buf_len > (end-start))? end-start: buf_len;
417 buf[end-start] = '\0'; 417 strncpy(buf, start, len);
418 buf[len] = '\0';
418 } 419 }
419 return true; 420 return true;
420} 421}
@@ -496,12 +497,13 @@ static bool settings_write_config(char* filename, int options)
496 } 497 }
497 else 498 else
498 { 499 {
499 cfg_int_to_string(i,*(int*)settings[i].setting,value); 500 cfg_int_to_string(i, *(int*)settings[i].setting,
501 value, MAX_PATH);
500 } 502 }
501 break; 503 break;
502 case F_T_BOOL: 504 case F_T_BOOL:
503 cfg_int_to_string(i, 505 cfg_int_to_string(i,
504 *(bool*)settings[i].setting==false?0:1,value); 506 *(bool*)settings[i].setting==false?0:1, value, MAX_PATH);
505 break; 507 break;
506 case F_T_CHARPTR: 508 case F_T_CHARPTR:
507 case F_T_UCHARPTR: 509 case F_T_UCHARPTR:
@@ -923,13 +925,17 @@ void settings_reset(void) {
923} 925}
924 926
925/** Changing setting values **/ 927/** Changing setting values **/
926const struct settings_list* find_setting(void* variable) 928const struct settings_list* find_setting(void* variable, int *id)
927{ 929{
928 int i; 930 int i;
929 for(i=0;i<nb_settings;i++) 931 for(i=0;i<nb_settings;i++)
930 { 932 {
931 if (settings[i].setting == variable) 933 if (settings[i].setting == variable)
934 {
935 if (id)
936 *id = i;
932 return &settings[i]; 937 return &settings[i];
938 }
933 } 939 }
934 return NULL; 940 return NULL;
935} 941}
@@ -939,7 +945,7 @@ void talk_setting(void *global_settings_variable)
939 const struct settings_list *setting; 945 const struct settings_list *setting;
940 if (global_settings.talk_menu == 0) 946 if (global_settings.talk_menu == 0)
941 return; 947 return;
942 setting = find_setting(global_settings_variable); 948 setting = find_setting(global_settings_variable, NULL);
943 if (setting == NULL) 949 if (setting == NULL)
944 return; 950 return;
945 if (setting->lang_id) 951 if (setting->lang_id)
@@ -1173,6 +1179,37 @@ static bool do_set_setting(const unsigned char* string, void *variable,
1173 1179
1174 return false; 1180 return false;
1175} 1181}
1182static const char *unit_strings[] =
1183{
1184 [UNIT_INT]
1185 = "",
1186 [UNIT_MS]
1187 = "ms",
1188 [UNIT_SEC]
1189 = "s",
1190 [UNIT_MIN]
1191 = "min",
1192 [UNIT_HOUR]
1193 = "hr",
1194 [UNIT_KHZ]
1195 = "KHz",
1196 [UNIT_DB]
1197 = "dB",
1198 [UNIT_PERCENT]
1199 = "%",
1200 [UNIT_MAH]
1201 = "mAh",
1202 [UNIT_PIXEL]
1203 = "px",
1204 [UNIT_PER_SEC]
1205 = "per sec",
1206 [UNIT_HERTZ]
1207 = "Hz",
1208 [UNIT_MB]
1209 = "MB",
1210 [UNIT_KBIT]
1211 = "kb/s",
1212};
1176bool set_int(const unsigned char* string, 1213bool set_int(const unsigned char* string,
1177 const char* unit, 1214 const char* unit,
1178 int voice_unit, 1215 int voice_unit,
@@ -1186,12 +1223,16 @@ bool set_int(const unsigned char* string,
1186#if CONFIG_KEYPAD != PLAYER_PAD 1223#if CONFIG_KEYPAD != PLAYER_PAD
1187 struct value_setting_data data = { 1224 struct value_setting_data data = {
1188 INT,max, step, voice_unit,unit,formatter,NULL }; 1225 INT,max, step, voice_unit,unit,formatter,NULL };
1226 if (unit == NULL)
1227 data.unit = unit_strings[voice_unit];
1189 return do_set_setting(string,variable,(max-min)/step + 1, 1228 return do_set_setting(string,variable,(max-min)/step + 1,
1190 (max-*variable)/step, &data,function); 1229 (max-*variable)/step, &data,function);
1191#else 1230#else
1192 int count = (max-min)/step + 1; 1231 int count = (max-min)/step + 1;
1193 struct value_setting_data data = { 1232 struct value_setting_data data = {
1194 INT,min, -step, voice_unit,unit,formatter,NULL }; 1233 INT,min, -step, voice_unit,unit,formatter,NULL };
1234 if (unit == NULL)
1235 data.unit = unit_strings[voice_unit];
1195 return do_set_setting(string,variable,count, 1236 return do_set_setting(string,variable,count,
1196 count - ((max-*variable)/step), &data,function); 1237 count - ((max-*variable)/step), &data,function);
1197#endif 1238#endif