diff options
author | Jens Arnold <amiconn@rockbox.org> | 2007-11-25 17:36:21 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2007-11-25 17:36:21 +0000 |
commit | d490f441126542f961da4132b59d843140709b3e (patch) | |
tree | ef1c0e0cf4b5cd453d01101432990a02d8ba88a9 /apps/settings.c | |
parent | 54ecc698a54cf0b30dfda243ff149a1c6858e0f2 (diff) | |
download | rockbox-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.c | 50 |
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 | ||
354 | bool cfg_int_to_string(int setting_id, int val, char* buf, int buf_len) | 364 | bool 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: |