diff options
Diffstat (limited to 'apps/settings.c')
-rw-r--r-- | apps/settings.c | 81 |
1 files changed, 35 insertions, 46 deletions
diff --git a/apps/settings.c b/apps/settings.c index d8e4af1460..256c71267c 100644 --- a/apps/settings.c +++ b/apps/settings.c | |||
@@ -401,17 +401,16 @@ bool settings_load_config(const char* file, bool apply) | |||
401 | 401 | ||
402 | /** Writing to a config file and saving settings **/ | 402 | /** Writing to a config file and saving settings **/ |
403 | 403 | ||
404 | bool cfg_int_to_string(int setting_id, int val, char* buf, int buf_len) | 404 | bool cfg_int_to_string(const struct settings_list *setting, int val, char* buf, int buf_len) |
405 | { | 405 | { |
406 | int flags = settings[setting_id].flags; | 406 | const char* start = setting->cfg_vals; |
407 | const char* start = settings[setting_id].cfg_vals; | ||
408 | char* end = NULL; | 407 | char* end = NULL; |
409 | int count = 0; | 408 | int count = 0; |
410 | 409 | ||
411 | if ((flags&F_T_MASK)==F_T_INT && | 410 | if ((setting->flags & F_T_MASK) == F_T_INT && |
412 | flags&F_TABLE_SETTING) | 411 | (setting->flags & F_TABLE_SETTING)) |
413 | { | 412 | { |
414 | const int *value = settings[setting_id].table_setting->values; | 413 | const int *value = setting->table_setting->values; |
415 | while (start) | 414 | while (start) |
416 | { | 415 | { |
417 | end = strchr(start,','); | 416 | end = strchr(start,','); |
@@ -455,20 +454,19 @@ bool cfg_int_to_string(int setting_id, int val, char* buf, int buf_len) | |||
455 | return true; | 454 | return true; |
456 | } | 455 | } |
457 | 456 | ||
458 | bool cfg_to_string(int i/*setting_id*/, char* buf, int buf_len) | 457 | void cfg_to_string(const struct settings_list *setting, char* buf, int buf_len) |
459 | { | 458 | { |
460 | switch (settings[i].flags&F_T_MASK) | 459 | switch (setting->flags & F_T_MASK) |
461 | { | 460 | { |
462 | case F_T_CUSTOM: | 461 | case F_T_CUSTOM: |
463 | settings[i].custom_setting->write_to_cfg(settings[i].setting, | 462 | setting->custom_setting->write_to_cfg(setting->setting, buf, buf_len); |
464 | buf, buf_len); | ||
465 | break; | 463 | break; |
466 | case F_T_INT: | 464 | case F_T_INT: |
467 | case F_T_UINT: | 465 | case F_T_UINT: |
468 | #ifdef HAVE_LCD_COLOR | 466 | #ifdef HAVE_LCD_COLOR |
469 | if (settings[i].flags&F_RGB) | 467 | if (setting->flags & F_RGB) |
470 | { | 468 | { |
471 | int colour = *(int*)settings[i].setting; | 469 | int colour = *(int*)setting->setting; |
472 | snprintf(buf,buf_len,"%02x%02x%02x", | 470 | snprintf(buf,buf_len,"%02x%02x%02x", |
473 | (int)RGB_UNPACK_RED(colour), | 471 | (int)RGB_UNPACK_RED(colour), |
474 | (int)RGB_UNPACK_GREEN(colour), | 472 | (int)RGB_UNPACK_GREEN(colour), |
@@ -476,57 +474,50 @@ bool cfg_to_string(int i/*setting_id*/, char* buf, int buf_len) | |||
476 | } | 474 | } |
477 | else | 475 | else |
478 | #endif | 476 | #endif |
479 | if (settings[i].cfg_vals == NULL) | 477 | if (setting->cfg_vals == NULL) |
480 | { | 478 | { |
481 | snprintf(buf,buf_len,"%d",*(int*)settings[i].setting); | 479 | snprintf(buf, buf_len, "%d", *(int*)setting->setting); |
482 | } | 480 | } |
483 | else | 481 | else |
484 | { | 482 | { |
485 | if (cfg_int_to_string(i, *(int*)settings[i].setting, | 483 | if (!cfg_int_to_string(setting, *(int*)setting->setting, |
486 | buf, buf_len) == false) | 484 | buf, buf_len)) |
487 | { | 485 | snprintf(buf, buf_len, "%d", *(int*)setting->setting); |
488 | snprintf(buf,buf_len,"%d",*(int*)settings[i].setting); | ||
489 | } | ||
490 | else | ||
491 | return false; | ||
492 | } | 486 | } |
493 | break; | 487 | break; |
494 | case F_T_BOOL: | 488 | case F_T_BOOL: |
495 | cfg_int_to_string(i, | 489 | cfg_int_to_string(setting, *(bool*)setting->setting, buf, buf_len); |
496 | *(bool*)settings[i].setting==false?0:1, buf, buf_len); | ||
497 | break; | 490 | break; |
498 | case F_T_CHARPTR: | 491 | case F_T_CHARPTR: |
499 | case F_T_UCHARPTR: | 492 | case F_T_UCHARPTR: |
500 | if (((char*)settings[i].setting)[0] | 493 | { |
501 | && settings[i].filename_setting->prefix) | 494 | char *value = setting->setting; |
495 | const struct filename_setting *fs = setting->filename_setting; | ||
496 | if (value[0] && fs->prefix) | ||
502 | { | 497 | { |
503 | if (((char*)settings[i].setting)[0] == '-') | 498 | if (value[0] == '-') |
504 | { | 499 | { |
505 | buf[0] = '-'; | 500 | buf[0] = '-'; |
506 | buf[1] = '\0'; | 501 | buf[1] = '\0'; |
507 | } | 502 | } |
508 | else | 503 | else |
509 | { | 504 | { |
510 | snprintf(buf,buf_len,"%s%s%s", | 505 | snprintf(buf, buf_len, "%s%s%s", |
511 | settings[i].filename_setting->prefix, | 506 | fs->prefix, value, fs->suffix); |
512 | (char*)settings[i].setting, | ||
513 | settings[i].filename_setting->suffix); | ||
514 | } | 507 | } |
515 | } | 508 | } |
516 | else | 509 | else |
517 | { | 510 | { |
518 | int len = MIN(buf_len, settings[i].filename_setting->max_len); | 511 | strmemccpy(buf, value, buf_len); |
519 | strmemccpy(buf,(char*)settings[i].setting,len); | ||
520 | } | 512 | } |
521 | break; | 513 | break; |
514 | } | ||
522 | } /* switch () */ | 515 | } /* switch () */ |
523 | return true; | ||
524 | } | 516 | } |
525 | 517 | ||
526 | 518 | ||
527 | static bool is_changed(int setting_id) | 519 | static bool is_changed(const struct settings_list *setting) |
528 | { | 520 | { |
529 | const struct settings_list *setting = &settings[setting_id]; | ||
530 | switch (setting->flags&F_T_MASK) | 521 | switch (setting->flags&F_T_MASK) |
531 | { | 522 | { |
532 | case F_T_CUSTOM: | 523 | case F_T_CUSTOM: |
@@ -574,40 +565,38 @@ static bool settings_write_config(const char* filename, int options) | |||
574 | "http://www.rockbox.org\r\n\r\n", rbversion); | 565 | "http://www.rockbox.org\r\n\r\n", rbversion); |
575 | for(i=0; i<nb_settings; i++) | 566 | for(i=0; i<nb_settings; i++) |
576 | { | 567 | { |
577 | if (settings[i].cfg_name == NULL) | 568 | const struct settings_list *setting = &settings[i]; |
578 | continue; | 569 | if (!setting->cfg_name || (setting->flags & F_DEPRECATED)) |
579 | value[0] = '\0'; | ||
580 | if (settings[i].flags & F_DEPRECATED) | ||
581 | continue; | 570 | continue; |
582 | 571 | ||
583 | switch (options) | 572 | switch (options) |
584 | { | 573 | { |
585 | case SETTINGS_SAVE_CHANGED: | 574 | case SETTINGS_SAVE_CHANGED: |
586 | if (!is_changed(i)) | 575 | if (!is_changed(setting)) |
587 | continue; | 576 | continue; |
588 | break; | 577 | break; |
589 | case SETTINGS_SAVE_SOUND: | 578 | case SETTINGS_SAVE_SOUND: |
590 | if ((settings[i].flags&F_SOUNDSETTING) == 0) | 579 | if (!(setting->flags & F_SOUNDSETTING)) |
591 | continue; | 580 | continue; |
592 | break; | 581 | break; |
593 | case SETTINGS_SAVE_THEME: | 582 | case SETTINGS_SAVE_THEME: |
594 | if ((settings[i].flags&F_THEMESETTING) == 0) | 583 | if (!(setting->flags & F_THEMESETTING)) |
595 | continue; | 584 | continue; |
596 | break; | 585 | break; |
597 | #ifdef HAVE_RECORDING | 586 | #ifdef HAVE_RECORDING |
598 | case SETTINGS_SAVE_RECPRESETS: | 587 | case SETTINGS_SAVE_RECPRESETS: |
599 | if ((settings[i].flags&F_RECSETTING) == 0) | 588 | if (!(setting->flags & F_RECSETTING)) |
600 | continue; | 589 | continue; |
601 | break; | 590 | break; |
602 | #endif | 591 | #endif |
603 | case SETTINGS_SAVE_EQPRESET: | 592 | case SETTINGS_SAVE_EQPRESET: |
604 | if ((settings[i].flags&F_EQSETTING) == 0) | 593 | if (!(setting->flags & F_EQSETTING)) |
605 | continue; | 594 | continue; |
606 | break; | 595 | break; |
607 | } | 596 | } |
608 | 597 | ||
609 | cfg_to_string(i, value, MAX_PATH); | 598 | cfg_to_string(setting, value, MAX_PATH); |
610 | fdprintf(fd,"%s: %s\r\n",settings[i].cfg_name,value); | 599 | fdprintf(fd,"%s: %s\r\n",setting->cfg_name,value); |
611 | } /* for(...) */ | 600 | } /* for(...) */ |
612 | close(fd); | 601 | close(fd); |
613 | return true; | 602 | return true; |