summaryrefslogtreecommitdiff
path: root/apps/settings.c
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2007-11-25 17:36:21 +0000
committerJens Arnold <amiconn@rockbox.org>2007-11-25 17:36:21 +0000
commitd490f441126542f961da4132b59d843140709b3e (patch)
treeef1c0e0cf4b5cd453d01101432990a02d8ba88a9 /apps/settings.c
parent54ecc698a54cf0b30dfda243ff149a1c6858e0f2 (diff)
downloadrockbox-d490f441126542f961da4132b59d843140709b3e.tar.gz
rockbox-d490f441126542f961da4132b59d843140709b3e.zip
New way of handling integer settings with variable steps: table settings (FS #8186, with fixes by me). This allows to get rid of those synchronised tables in firmware/ and apps/, making things more flexible and less error prone. First application: backlight timeouts. * Make some more things 'const'.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15803 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/settings.c')
-rw-r--r--apps/settings.c50
1 files changed, 47 insertions, 3 deletions
diff --git a/apps/settings.c b/apps/settings.c
index 6467a0e4d6..b22c521fd8 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -299,7 +299,17 @@ bool settings_load_config(const char* file, bool apply)
299 } 299 }
300 else 300 else
301 { 301 {
302 cfg_string_to_int(i,(int*)settings[i].setting,value); 302 int temp, *v = (int*)settings[i].setting;
303 bool found = cfg_string_to_int(i, &temp, value);
304 if (found)
305 {
306 if (settings[i].flags&F_TABLE_SETTING)
307 *v = settings[i].table_setting->values[temp];
308 else
309 *v = temp;
310 }
311 else
312 *v = atoi(value);
303 } 313 }
304 break; 314 break;
305 case F_T_BOOL: 315 case F_T_BOOL:
@@ -353,9 +363,40 @@ bool settings_load_config(const char* file, bool apply)
353 363
354bool cfg_int_to_string(int setting_id, int val, char* buf, int buf_len) 364bool cfg_int_to_string(int setting_id, int val, char* buf, int buf_len)
355{ 365{
366 int flags = settings[setting_id].flags;
356 const char* start = settings[setting_id].cfg_vals; 367 const char* start = settings[setting_id].cfg_vals;
357 char* end = NULL; 368 char* end = NULL;
358 int count = 0; 369 int count = 0;
370
371 if ((flags&F_T_MASK)==F_T_INT &&
372 flags&F_TABLE_SETTING)
373 {
374 const int *value = settings[setting_id].table_setting->values;
375 while (start)
376 {
377 end = strchr(start,',');
378 if (value[count] == val)
379 {
380 if (end == NULL)
381 strncpy(buf, start, buf_len);
382 else
383 {
384 int len = (buf_len > (end-start))? end-start: buf_len;
385 strncpy(buf, start, len);
386 buf[len] = '\0';
387 }
388 return true;
389 }
390 count++;
391
392 if (end)
393 start = end+1;
394 else
395 break;
396 }
397 return false;
398 }
399
359 while (count < val) 400 while (count < val)
360 { 401 {
361 start = strchr(start,','); 402 start = strchr(start,',');
@@ -457,8 +498,11 @@ static bool settings_write_config(char* filename, int options)
457 } 498 }
458 else 499 else
459 { 500 {
460 cfg_int_to_string(i, *(int*)settings[i].setting, 501 if (cfg_int_to_string(i, *(int*)settings[i].setting,
461 value, MAX_PATH); 502 value, MAX_PATH) == false)
503 {
504 snprintf(value,MAX_PATH,"%d",*(int*)settings[i].setting);
505 }
462 } 506 }
463 break; 507 break;
464 case F_T_BOOL: 508 case F_T_BOOL: