Index: trunk/apps/gui/option_select.c =================================================================== --- trunk.orig/apps/gui/option_select.c +++ trunk/apps/gui/option_select.c @@ -301,6 +301,61 @@ static void bool_funcwrapper(int value) boolfunction(false); } +static void val_to_selection(struct settings_list *setting, int val, + int *nb_items, int *selected, + void (**function)(int)) +{ + int var_type = setting->flags&F_T_MASK; + if (var_type == F_T_INT || var_type == F_T_UINT) + { + if (setting->flags&F_CHOICE_SETTING) + { + *nb_items = setting->choice_setting->count; + *selected = val; + *function = setting->choice_setting->option_callback; + } + else if (setting->flags&F_T_SOUND) + { + int setting_id = setting->sound_setting->setting; + int steps = sound_steps(setting_id); + int min = sound_min(setting_id); + int max = sound_max(setting_id); + *nb_items = (max-min)/steps + 1; +#ifndef ASCENDING_INT_SETTINGS + *selected = (max - val) / steps; +#else + *selected = (val - min) / steps; +#endif + *function = sound_get_fn(setting_id); + } + else + { + struct int_setting *info = setting->int_setting; + int min, max, step; + max = info->max; + min = info->min; + step = info->step; + *nb_items = (max-min)/step + 1; +#ifndef ASCENDING_INT_SETTINGS + *selected = (max - val) / step; +#else + *selected = (val - min) / step; +#endif + *function = info->option_callback; + } + } + else if (var_type == F_T_BOOL) + { + *selected = val; + *nb_items = 2; + boolfunction = setting->bool_setting->option_callback; + if (boolfunction) + *function = bool_funcwrapper; + else + *function = NULL; + } +} + bool option_screen(struct settings_list *setting, bool use_temp_var, unsigned char* option_title) { @@ -337,52 +392,7 @@ bool option_screen(struct settings_list gui_synclist_set_icon_callback(&lists, NULL); /* set the number of items and current selection */ - if (var_type == F_T_INT || var_type == F_T_UINT) - { - if (setting->flags&F_CHOICE_SETTING) - { - nb_items = setting->choice_setting->count; - selected = oldvalue; - function = setting->choice_setting->option_callback; - } - else if (setting->flags&F_T_SOUND) - { - int setting_id = setting->sound_setting->setting; - int steps = sound_steps(setting_id); - int min = sound_min(setting_id); - int max = sound_max(setting_id); - nb_items = (max-min)/steps + 1; -#ifndef ASCENDING_INT_SETTINGS - selected = (max - oldvalue) / steps; -#else - selected = (oldvalue - min) / steps; -#endif - function = sound_get_fn(setting_id); - } - else - { - struct int_setting *info = setting->int_setting; - int min, max, step; - max = info->max; - min = info->min; - step = info->step; - nb_items = (max-min)/step + 1; -#ifndef ASCENDING_INT_SETTINGS - selected = (max - oldvalue) / step; -#else - selected = (oldvalue - min) / step; -#endif - function = info->option_callback; - } - } - else if (var_type == F_T_BOOL) - { - selected = oldvalue; - nb_items = 2; - boolfunction = setting->bool_setting->option_callback; - if (boolfunction) - function = bool_funcwrapper; - } + val_to_selection(setting, oldvalue, &nb_items, &selected, &function); gui_synclist_set_nb_items(&lists, nb_items); gui_synclist_select_item(&lists, selected); @@ -436,6 +446,17 @@ bool option_screen(struct settings_list gui_syncsplash(HZ/2, str(LANG_CANCEL)); done = true; } + else if (action == ACTION_STD_CONTEXT) + { + reset_setting(setting, variable); + if (var_type == F_T_BOOL && !use_temp_var) + *(bool*)setting->setting = temp_var==1?true:false; + val_to_selection(setting, *variable, &nb_items, + &selected, &function); + gui_synclist_select_item(&lists, selected); + gui_synclist_draw(&lists); + option_talk(setting, *variable); + } else if (action == ACTION_STD_OK) { done = true; Index: trunk/apps/settings.c =================================================================== --- trunk.orig/apps/settings.c +++ trunk/apps/settings.c @@ -897,34 +897,35 @@ void settings_apply(void) /* * reset all settings to their default value */ -void settings_reset(void) { +void reset_setting(const struct settings_list *setting, void *var) +{ + switch (setting->flags&F_T_MASK) + { + case F_T_INT: + case F_T_UINT: + if (setting->flags&F_DEF_ISFUNC) + *(int*)var = setting->default_val.func(); + else if (setting->flags&F_T_SOUND) + *(int*)var = sound_default(setting->sound_setting->setting); + else *(int*)var = setting->default_val.int_; + break; + case F_T_BOOL: + *(bool*)var = setting->default_val.bool_; + break; + case F_T_CHARPTR: + case F_T_UCHARPTR: + strncpy((char*)var, setting->default_val.charptr,MAX_FILENAME); + break; + } +} +void settings_reset(void) +{ int i; DEBUGF( "settings_reset()\n" ); for(i=0; isetting); - else *(int*)settings[i].setting = settings[i].default_val.int_; - break; - case F_T_BOOL: - *(bool*)settings[i].setting = settings[i].default_val.bool_; - break; - case F_T_CHARPTR: - case F_T_UCHARPTR: - strncpy((char*)settings[i].setting, - settings[i].default_val.charptr,MAX_FILENAME); - break; - } - } /* for(...) */ + reset_setting(&settings[i], settings[i].setting); #if defined (HAVE_RECORDING) && CONFIG_CODEC == SWCODEC enc_global_settings_reset(); #endif Index: trunk/apps/settings.h =================================================================== --- trunk.orig/apps/settings.h +++ trunk/apps/settings.h @@ -252,6 +252,8 @@ enum { }; bool settings_save_config(int options); +struct settings_list; +void reset_setting(const struct settings_list *setting, void *var); void settings_reset(void); void sound_settings_apply(void); void settings_apply(void);