diff --git a/Makefile.common b/Makefile.common index a9d470edc6..63e5b726af 100644 --- a/Makefile.common +++ b/Makefile.common @@ -155,6 +155,7 @@ OBJ += frontend/frontend.o \ libretro-common/lists/string_list.o \ libretro-common/string/stdstring.o \ libretro-common/memmap/memalign.o \ + setting_list.o \ list_special.o \ libretro-common/file/nbio/nbio_stdio.o \ libretro-common/file/file_path.o \ diff --git a/griffin/griffin.c b/griffin/griffin.c index 36021d3388..9a42beae95 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -685,6 +685,7 @@ FILE #include "../libretro-common/lists/dir_list.c" #include "../libretro-common/lists/string_list.c" #include "../libretro-common/lists/file_list.c" +#include "../setting_list.c" #include "../libretro-common/file/retro_dirent.c" #include "../libretro-common/streams/file_stream.c" #include "../libretro-common/streams/interface_stream.c" diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index b5edeafa01..8ae664ade7 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -263,7 +263,7 @@ static int action_left_shader_filter_default(unsigned type, const char *label, if (!setting) return menu_cbs_exit(); return menu_action_handle_setting(setting, - menu_setting_get_type(setting), MENU_ACTION_LEFT, wraparound); + setting_get_type(setting), MENU_ACTION_LEFT, wraparound); #else return 0; #endif @@ -407,7 +407,7 @@ static int menu_cbs_init_bind_left_compare_label(menu_file_list_cbs_t *cbs, const char *parent_group = menu_setting_get_parent_group(cbs->setting); if (string_is_equal(parent_group, msg_hash_to_str(MENU_ENUM_LABEL_MAIN_MENU)) - && (menu_setting_get_type(cbs->setting) == ST_GROUP)) + && (setting_get_type(cbs->setting) == ST_GROUP)) { BIND_ACTION_LEFT(cbs, action_left_mainmenu); return 0; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 298e7ef9e8..28fff181b8 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1343,7 +1343,7 @@ static int generic_action_ok(const char *path, if (setting) { - menu_setting_set_with_string_representation( + setting_set_with_string_representation( setting, action_path); ret = menu_setting_generic(setting, false); } @@ -1496,7 +1496,7 @@ static void menu_input_st_string_cb_save_preset(void *userdata, if (setting) { - menu_setting_set_with_string_representation(setting, str); + setting_set_with_string_representation(setting, str); menu_setting_generic(setting, false); } else if (!string_is_empty(label)) @@ -1626,7 +1626,7 @@ static void menu_input_st_string_cb_cheat_file_save_as( if (setting) { - menu_setting_set_with_string_representation(setting, str); + setting_set_with_string_representation(setting, str); menu_setting_generic(setting, false); } else if (!string_is_empty(label)) @@ -1870,7 +1870,7 @@ static int action_ok_file_load(const char *path, setting = menu_setting_find(menu_label); - if (menu_setting_get_type(setting) == ST_PATH) + if (setting_get_type(setting) == ST_PATH) return action_ok_set_path(path, label, type, idx, entry_idx); strlcpy(menu_path_new, menu_path, sizeof(menu_path_new)); diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index feee6ba436..de64d0a140 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -277,7 +277,7 @@ static int action_right_shader_filter_default(unsigned type, const char *label, rarch_setting_t *setting = menu_setting_find_enum(MENU_ENUM_LABEL_VIDEO_SMOOTH); if (!setting) return menu_cbs_exit(); - return menu_action_handle_setting(setting, menu_setting_get_type(setting), MENU_ACTION_RIGHT, + return menu_action_handle_setting(setting, setting_get_type(setting), MENU_ACTION_RIGHT, wraparound); #else return 0; @@ -516,7 +516,7 @@ static int menu_cbs_init_bind_right_compare_label(menu_file_list_cbs_t *cbs, const char *parent_group = menu_setting_get_parent_group(cbs->setting); if (string_is_equal(parent_group, msg_hash_to_str(MENU_ENUM_LABEL_MAIN_MENU)) - && (menu_setting_get_type(cbs->setting) == ST_GROUP)) + && (setting_get_type(cbs->setting) == ST_GROUP)) { BIND_ACTION_RIGHT(cbs, action_right_scroll); return 0; diff --git a/menu/cbs/menu_cbs_select.c b/menu/cbs/menu_cbs_select.c index b096297ad8..a79038f0dc 100644 --- a/menu/cbs/menu_cbs_select.c +++ b/menu/cbs/menu_cbs_select.c @@ -44,7 +44,7 @@ static int action_select_default(const char *path, const char *label, unsigned t if (!cbs) return -1; - switch (menu_setting_get_type(cbs->setting)) + switch (setting_get_type(cbs->setting)) { case ST_BOOL: case ST_INT: @@ -194,7 +194,7 @@ int menu_cbs_init_bind_select(menu_file_list_cbs_t *cbs, if (cbs->setting) { - uint64_t flags = menu_setting_get_flags(cbs->setting); + uint64_t flags = setting_get_flags(cbs->setting); if (flags & SD_FLAG_IS_DRIVER) { diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index b9ed35d340..059ab202a7 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -873,7 +873,7 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, const char *parent_group = menu_setting_get_parent_group(cbs->setting); if (string_is_equal(parent_group, msg_hash_to_str(MENU_ENUM_LABEL_MAIN_MENU)) - && menu_setting_get_type(cbs->setting) == ST_GROUP) + && setting_get_type(cbs->setting) == ST_GROUP) { BIND_ACTION_GET_TITLE(cbs, action_get_title_group_settings); return 0; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 45859d26d5..f52f655404 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2181,7 +2181,7 @@ static int menu_displaylist_parse_settings_internal(void *data, enum setting_type precond; size_t count = 0; settings_t *settings = config_get_ptr(); - uint64_t flags = menu_setting_get_flags(setting); + uint64_t flags = setting_get_flags(setting); if (!setting) return -1; @@ -2237,7 +2237,7 @@ static int menu_displaylist_parse_settings_internal(void *data, const char *short_description = menu_setting_get_short_description(setting); const char *name = menu_setting_get_name(setting); - enum setting_type type = menu_setting_get_type(setting); + enum setting_type type = setting_get_type(setting); switch (parse_type) { @@ -2322,7 +2322,7 @@ loop: case PARSE_GROUP: case PARSE_ONLY_GROUP: case PARSE_SUB_GROUP: - if (menu_setting_get_type(setting) == precond) + if (setting_get_type(setting) == precond) time_to_exit = true; break; case PARSE_ONLY_BIND: @@ -2366,7 +2366,7 @@ static int menu_displaylist_parse_settings_internal_enum(void *data, enum setting_type precond; size_t count = 0; settings_t *settings = config_get_ptr(); - uint64_t flags = menu_setting_get_flags(setting); + uint64_t flags = setting_get_flags(setting); if (!setting) return -1; @@ -2422,7 +2422,7 @@ static int menu_displaylist_parse_settings_internal_enum(void *data, const char *short_description = menu_setting_get_short_description(setting); const char *name = menu_setting_get_name(setting); - enum setting_type type = menu_setting_get_type(setting); + enum setting_type type = setting_get_type(setting); switch (parse_type) { @@ -2507,7 +2507,7 @@ loop: case PARSE_GROUP: case PARSE_ONLY_GROUP: case PARSE_SUB_GROUP: - if (menu_setting_get_type(setting) == precond) + if (setting_get_type(setting) == precond) time_to_exit = true; break; case PARSE_ONLY_BIND: diff --git a/menu/menu_entry.c b/menu/menu_entry.c index 2b7a942c61..10909da6be 100644 --- a/menu/menu_entry.c +++ b/menu/menu_entry.c @@ -22,6 +22,8 @@ #include "menu_display.h" #include "menu_navigation.h" +#include "../setting_list.h" + /* This file provides an abstraction of the currently displayed * menu. * @@ -44,8 +46,7 @@ enum menu_entry_type menu_entry_get_type(uint32_t i) if (setting) { - enum setting_type setting_type = - menu_setting_get_type(setting); + enum setting_type setting_type = setting_get_type(setting); switch (setting_type) { @@ -143,13 +144,13 @@ struct string_list *menu_entry_enum_values(uint32_t i) void menu_entry_enum_set_value_with_string(uint32_t i, const char *s) { rarch_setting_t *setting = menu_entries_get_setting(i); - menu_setting_set_with_string_representation(setting, s); + setting_set_with_string_representation(setting, s); } int32_t menu_entry_bind_index(uint32_t i) { rarch_setting_t *setting = menu_entries_get_setting(i); - uint32_t index = menu_setting_get_index(setting); + uint32_t index = setting_get_index(setting); if (index) return index - 1; @@ -194,7 +195,7 @@ void menu_entry_pathdir_selected(uint32_t i) bool menu_entry_pathdir_allow_empty(uint32_t i) { rarch_setting_t *setting = menu_entries_get_setting(i); - uint64_t flags = menu_setting_get_flags(setting); + uint64_t flags = setting_get_flags(setting); return flags & SD_FLAG_ALLOW_EMPTY; } @@ -202,7 +203,7 @@ bool menu_entry_pathdir_allow_empty(uint32_t i) uint32_t menu_entry_pathdir_for_directory(uint32_t i) { rarch_setting_t *setting = menu_entries_get_setting(i); - uint64_t flags = menu_setting_get_flags(setting); + uint64_t flags = setting_get_flags(setting); return flags & SD_FLAG_PATH_DIR; } @@ -243,13 +244,13 @@ void menu_entry_get_value(uint32_t i, char *s, size_t len) void menu_entry_set_value(uint32_t i, const char *s) { rarch_setting_t *setting = menu_entries_get_setting(i); - menu_setting_set_with_string_representation(setting, s); + setting_set_with_string_representation(setting, s); } uint32_t menu_entry_num_has_range(uint32_t i) { rarch_setting_t *setting = menu_entries_get_setting(i); - uint64_t flags = menu_setting_get_flags(setting); + uint64_t flags = setting_get_flags(setting); return (flags & SD_FLAG_HAS_RANGE); } @@ -257,14 +258,14 @@ uint32_t menu_entry_num_has_range(uint32_t i) float menu_entry_num_min(uint32_t i) { rarch_setting_t *setting = menu_entries_get_setting(i); - double min = menu_setting_get_min(setting); + double min = setting_get_min(setting); return (float)min; } float menu_entry_num_max(uint32_t i) { rarch_setting_t *setting = menu_entries_get_setting(i); - double max = menu_setting_get_max(setting); + double max = setting_get_max(setting); return (float)max; } diff --git a/menu/menu_input.c b/menu/menu_input.c index 23626b648f..46943c8717 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -173,7 +173,7 @@ void menu_input_st_uint_cb(void *userdata, const char *str) menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_LABEL_SETTING, &label); setting = menu_setting_find(label); - menu_setting_set_with_string_representation(setting, str); + setting_set_with_string_representation(setting, str); } menu_input_key_end_line(); @@ -255,7 +255,7 @@ static int menu_input_key_bind_set_mode_common( if (!setting) return -1; - index_offset = menu_setting_get_index_offset(setting); + index_offset = setting_get_index_offset(setting); menu_stack = menu_entries_get_menu_stack_ptr(0); menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection); @@ -270,7 +270,7 @@ static int menu_input_key_bind_set_mode_common( if (!keybind) return -1; - bind_type = menu_setting_get_bind_type(setting); + bind_type = setting_get_bind_type(setting); menu_input->binds.begin = bind_type; menu_input->binds.last = bind_type; @@ -416,7 +416,7 @@ static bool menu_input_key_bind_set_mode( if (menu_input_key_bind_set_mode_common(state, setting) == -1) return false; - index_offset = menu_setting_get_index_offset(setting); + index_offset = setting_get_index_offset(setting); bind_port = settings->input.joypad_map[index_offset]; menu_input_key_bind_poll_bind_get_rested_axes( diff --git a/menu/menu_setting.c b/menu/menu_setting.c index fe1b3bd361..23ff01603f 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -61,6 +61,7 @@ #include "../config.def.h" #include "../ui/ui_companion_driver.h" #include "../performance_counters.h" +#include "../setting_list.h" #include "../lakka.h" #include "../retroarch.h" @@ -71,741 +72,18 @@ #include "config.h" #endif -struct rarch_setting_info -{ - int index; - int size; -}; - -struct rarch_setting_group_info -{ - const char *name; -}; - -struct rarch_setting -{ - enum msg_hash_enums enum_idx; - enum setting_type type; - - uint32_t size; - - const char *name; - uint32_t name_hash; - const char *short_description; - const char *group; - const char *subgroup; - const char *parent_group; - const char *values; - - uint32_t index; - unsigned index_offset; - - double min; - double max; - - uint64_t flags; - uint64_t free_flags; - - change_handler_t change_handler; - change_handler_t read_handler; - action_start_handler_t action_start; - action_left_handler_t action_left; - action_right_handler_t action_right; - action_up_handler_t action_up; - action_down_handler_t action_down; - action_cancel_handler_t action_cancel; - action_ok_handler_t action_ok; - action_select_handler_t action_select; - get_string_representation_t get_string_representation; - - union - { - bool boolean; - int integer; - unsigned int unsigned_integer; - float fraction; - const char *string; - const struct retro_keybind *keybind; - } default_value; - - struct - { - union - { - bool *boolean; - int *integer; - unsigned int *unsigned_integer; - float *fraction; - char *string; - struct retro_keybind *keybind; - } target; - } value; - - union - { - bool boolean; - int integer; - unsigned int unsigned_integer; - float fraction; - } original_value; - - struct - { - const char *empty_path; - } dir; - - struct - { - enum event_command idx; - bool triggered; - } cmd_trigger; - - struct - { - const char *off_label; - const char *on_label; - } boolean; - - unsigned bind_type; - enum setting_type browser_selection_type; - float step; - const char *rounding_fraction; - bool enforce_minrange; - bool enforce_maxrange; -}; - -/* forward decls */ -static void setting_get_string_representation_default(void *data, - char *s, size_t len); -static int setting_action_action_ok(void *data, bool wraparound); -static int setting_generic_action_start_default(void *data); -static int setting_fraction_action_left_default( - void *data, bool wraparound); -static int setting_fraction_action_right_default( - void *data, bool wraparound); -static int setting_generic_action_ok_default(void *data, bool wraparound); -static void setting_get_string_representation_st_float(void *data, - char *s, size_t len); -static int setting_uint_action_left_default(void *data, bool wraparound); -static int setting_uint_action_right_default(void *data, bool wraparound); -static void setting_get_string_representation_uint(void *data, - char *s, size_t len); -static void setting_get_string_representation_hex(void *data, - char *s, size_t len); -static int setting_bind_action_start(void *data); -static void setting_get_string_representation_st_bind(void *data, - char *s, size_t len); -static int setting_bind_action_ok(void *data, bool wraparound); -static void setting_get_string_representation_st_string(void *data, - char *s, size_t len); -static int setting_string_action_start_generic(void *data); -static void setting_get_string_representation_st_dir(void *data, - char *s, size_t len); -static void setting_get_string_representation_st_path(void *data, - char *s, size_t len); - -/** - * setting_action_setting: - * @name : Name of setting. - * @short_description : Short description of setting. - * @group : Group that the setting belongs to. - * @subgroup : Subgroup that the setting belongs to. - * - * Initializes a setting of type ST_ACTION. - * - * Returns: setting of type ST_ACTION. - **/ -static rarch_setting_t setting_action_setting(const char* name, - const char* short_description, - const char *group, const char *subgroup, - const char *parent_group) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = ST_ACTION; - - result.size = 0; - - result.name = name; - result.name_hash = 0; - result.short_description = short_description; - result.group = group; - result.subgroup = subgroup; - result.parent_group = parent_group; - result.values = NULL; - - result.index = 0; - result.index_offset = 0; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = NULL; - result.read_handler = NULL; - result.action_start = NULL; - result.action_left = NULL; - result.action_right = NULL; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = setting_action_action_ok; - result.action_select = setting_action_action_ok; - result.get_string_representation = &setting_get_string_representation_default; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = NULL; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - return result; -} - -/** - * setting_group_setting: - * @type : type of settting. - * @name : name of setting. - * - * Initializes a setting of type ST_GROUP. - * - * Returns: setting of type ST_GROUP. - **/ -static rarch_setting_t setting_group_setting(enum setting_type type, const char* name, - const char *parent_group) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = type; - - result.size = 0; - - result.name = name; - result.name_hash = 0; - result.short_description = name; - result.group = NULL; - result.subgroup = NULL; - result.parent_group = parent_group; - result.values = NULL; - - result.index = 0; - result.index_offset = 0; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = NULL; - result.read_handler = NULL; - result.action_start = NULL; - result.action_left = NULL; - result.action_right = NULL; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = NULL; - result.action_select = NULL; - result.get_string_representation = &setting_get_string_representation_default; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = NULL; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - - return result; -} - - -/** - * setting_float_setting: - * @name : name of setting. - * @short_description : Short description of setting. - * @target : Target of float setting. - * @default_value : Default value (in float). - * @rounding : Rounding (for float-to-string representation). - * @group : Group that the setting belongs to. - * @subgroup : Subgroup that the setting belongs to. - * @change_handler : Function callback for change handler function pointer. - * @read_handler : Function callback for read handler function pointer. - * - * Initializes a setting of type ST_FLOAT. - * - * Returns: setting of type ST_FLOAT. - **/ -static rarch_setting_t setting_float_setting(const char* name, - const char* short_description, float* target, float default_value, - const char *rounding, const char *group, const char *subgroup, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = ST_FLOAT; - - result.size = sizeof(float); - - result.name = name; - result.name_hash = 0; - result.short_description = short_description; - result.group = group; - result.subgroup = subgroup; - result.parent_group = parent_group; - result.values = NULL; - - result.index = 0; - result.index_offset = 0; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = change_handler; - result.read_handler = read_handler; - result.action_start = setting_generic_action_start_default; - result.action_left = setting_fraction_action_left_default; - result.action_right = setting_fraction_action_right_default; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = setting_generic_action_ok_default; - result.action_select = setting_generic_action_ok_default; - result.get_string_representation = &setting_get_string_representation_st_float; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = rounding; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - result.value.target.fraction = target; - result.original_value.fraction = *target; - result.default_value.fraction = default_value; - - return result; -} - - - -/** - * setting_uint_setting: - * @name : name of setting. - * @short_description : Short description of setting. - * @target : Target of unsigned integer setting. - * @default_value : Default value (in unsigned integer format). - * @group : Group that the setting belongs to. - * @subgroup : Subgroup that the setting belongs to. - * @change_handler : Function callback for change handler function pointer. - * @read_handler : Function callback for read handler function pointer. - * - * Initializes a setting of type ST_UINT. - * - * Returns: setting of type ST_UINT. - **/ -static rarch_setting_t setting_uint_setting(const char* name, - const char* short_description, unsigned int* target, - unsigned int default_value, - const char *group, const char *subgroup, const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = ST_UINT; - - result.size = sizeof(unsigned int); - - result.name = name; - result.name_hash = 0; - result.short_description = short_description; - result.group = group; - result.subgroup = subgroup; - result.parent_group = parent_group; - result.values = NULL; - - result.index = 0; - result.index_offset = 0; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = change_handler; - result.read_handler = read_handler; - result.action_start = setting_generic_action_start_default; - result.action_left = setting_uint_action_left_default; - result.action_right = setting_uint_action_right_default; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = setting_generic_action_ok_default; - result.action_select = setting_generic_action_ok_default; - result.get_string_representation = &setting_get_string_representation_uint; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = NULL; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - result.value.target.unsigned_integer = target; - result.original_value.unsigned_integer = *target; - result.default_value.unsigned_integer = default_value; - - return result; -} - -static rarch_setting_t menu_setting_terminator_setting(void) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = ST_NONE; - - result.size = 0; - - result.name = NULL; - result.name_hash = 0; - result.short_description = NULL; - result.group = NULL; - result.subgroup = NULL; - result.parent_group = NULL; - result.values = NULL; - - result.index = 0; - result.index_offset = 0; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = NULL; - result.read_handler = NULL; - result.action_start = NULL; - result.action_left = NULL; - result.action_right = NULL; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = NULL; - result.action_select = NULL; - result.get_string_representation = NULL; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = NULL; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - return result; -} - -/** - * setting_hex_setting: - * @name : name of setting. - * @short_description : Short description of setting. - * @target : Target of unsigned integer setting. - * @default_value : Default value (in unsigned integer format). - * @group : Group that the setting belongs to. - * @subgroup : Subgroup that the setting belongs to. - * @change_handler : Function callback for change handler function pointer. - * @read_handler : Function callback for read handler function pointer. - * - * Initializes a setting of type ST_HEX. - * - * Returns: setting of type ST_HEX. - **/ -static rarch_setting_t setting_hex_setting(const char* name, - const char* short_description, unsigned int* target, - unsigned int default_value, - const char *group, const char *subgroup, const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = ST_HEX; - - result.size = sizeof(unsigned int); - - result.name = name; - result.name_hash = 0; - result.short_description = short_description; - result.group = group; - result.subgroup = subgroup; - result.parent_group = parent_group; - result.values = NULL; - - result.index = 0; - result.index_offset = 0; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = change_handler; - result.read_handler = read_handler; - result.action_start = setting_generic_action_start_default; - result.action_left = NULL; - result.action_right = NULL; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = setting_generic_action_ok_default; - result.action_select = setting_generic_action_ok_default; - result.get_string_representation = &setting_get_string_representation_hex; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = NULL; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - result.value.target.unsigned_integer = target; - result.original_value.unsigned_integer = *target; - result.default_value.unsigned_integer = default_value; - - return result; -} - -/** - * setting_bind_setting: - * @name : name of setting. - * @short_description : Short description of setting. - * @target : Target of bind setting. - * @idx : Index of bind setting. - * @idx_offset : Index offset of bind setting. - * @default_value : Default value (in bind format). - * @group : Group that the setting belongs to. - * @subgroup : Subgroup that the setting belongs to. - * - * Initializes a setting of type ST_BIND. - * - * Returns: setting of type ST_BIND. - **/ -static rarch_setting_t setting_bind_setting(const char* name, - const char* short_description, struct retro_keybind* target, - uint32_t idx, uint32_t idx_offset, - const struct retro_keybind* default_value, - const char *group, const char *subgroup, const char *parent_group) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = ST_BIND; - - result.size = 0; - - result.name = name; - result.name_hash = 0; - result.short_description = short_description; - result.group = group; - result.subgroup = subgroup; - result.parent_group = parent_group; - result.values = NULL; - - result.index = idx; - result.index_offset = idx_offset; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = NULL; - result.read_handler = NULL; - result.action_start = setting_bind_action_start; - result.action_left = NULL; - result.action_right = NULL; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = setting_bind_action_ok; - result.action_select = setting_bind_action_ok; - result.get_string_representation = &setting_get_string_representation_st_bind; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = NULL; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - result.value.target.keybind = target; - result.default_value.keybind = default_value; - - return result; -} - -/** - * setting_string_setting: - * @type : type of setting. - * @name : name of setting. - * @short_description : Short description of setting. - * @target : Target of string setting. - * @size : Size of string setting. - * @default_value : Default value (in string format). - * @empty : TODO/FIXME: ??? - * @group : Group that the setting belongs to. - * @subgroup : Subgroup that the setting belongs to. - * @change_handler : Function callback for change handler function pointer. - * @read_handler : Function callback for read handler function pointer. - * - * Initializes a string setting (of type @type). - * - * Returns: String setting of type @type. - **/ -static rarch_setting_t setting_string_setting(enum setting_type type, - const char* name, const char* short_description, char* target, - unsigned size, const char* default_value, const char *empty, - const char *group, const char *subgroup, const char *parent_group, - change_handler_t change_handler, - change_handler_t read_handler) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = type; - - result.size = size; - - result.name = name; - result.name_hash = 0; - result.short_description = short_description; - result.group = group; - result.subgroup = subgroup; - result.parent_group = parent_group; - result.values = NULL; - - result.index = 0; - result.index_offset = 0; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = change_handler; - result.read_handler = read_handler; - result.action_start = NULL; - result.action_left = NULL; - result.action_right = NULL; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = NULL; - result.action_select = NULL; - result.get_string_representation = &setting_get_string_representation_st_string; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = NULL; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - result.dir.empty_path = empty; - result.value.target.string = target; - result.default_value.string = default_value; - - switch (type) - { - case ST_DIR: - result.action_start = setting_string_action_start_generic; - result.browser_selection_type = ST_DIR; - result.get_string_representation = &setting_get_string_representation_st_dir; - break; - case ST_PATH: - result.action_start = setting_string_action_start_generic; - result.browser_selection_type = ST_PATH; - result.get_string_representation = &setting_get_string_representation_st_path; - break; - default: - break; - } - - return result; -} - -/** - * setting_string_setting_options: - * @type : type of settting. - * @name : name of setting. - * @short_description : Short description of setting. - * @target : Target of bind setting. - * @size : Size of string setting. - * @default_value : Default value. - * @empty : N/A. - * @values : Values, separated by a delimiter. - * @group : Group that the setting belongs to. - * @subgroup : Subgroup that the setting belongs to. - * @change_handler : Function callback for change handler function pointer. - * @read_handler : Function callback for read handler function pointer. - * - * Initializes a string options list setting. - * - * Returns: string option list setting. - **/ -static rarch_setting_t setting_string_setting_options(enum setting_type type, - const char* name, const char* short_description, char* target, - unsigned size, const char* default_value, - const char *empty, const char *values, - const char *group, const char *subgroup, const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t result = setting_string_setting(type, name, - short_description, target, size, default_value, empty, group, - subgroup, parent_group, change_handler, read_handler); - - result.parent_group = parent_group; - result.values = values; - return result; -} - -static int setting_int_action_left_default(void *data, bool wraparound) +static void setting_get_string_representation_uint_video_monitor_index(void *data, + char *s, size_t len) { rarch_setting_t *setting = (rarch_setting_t*)data; - double min = menu_setting_get_min(setting); - if (!setting) - return -1; + return; - if (*setting->value.target.integer != min) - *setting->value.target.integer = - *setting->value.target.integer - setting->step; - - if (setting->enforce_minrange) - { - if (*setting->value.target.integer < min) - *setting->value.target.integer = min; - } - - - return 0; + if (*setting->value.target.unsigned_integer) + snprintf(s, len, "%u", + *setting->value.target.unsigned_integer); + else + strlcpy(s, "0 (Auto)", len); } static int setting_uint_action_left_custom_viewport_width(void *data, bool wraparound) @@ -912,84 +190,6 @@ static int setting_uint_action_right_custom_viewport_height(void *data, bool wra return 0; } -static int setting_uint_action_left_default(void *data, bool wraparound) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - double min = menu_setting_get_min(setting); - - if (!setting) - return -1; - - if (*setting->value.target.unsigned_integer != min) - *setting->value.target.unsigned_integer = - *setting->value.target.unsigned_integer - setting->step; - - if (setting->enforce_minrange) - { - if (*setting->value.target.unsigned_integer < min) - *setting->value.target.unsigned_integer = min; - } - - - return 0; -} - -static int setting_uint_action_right_default(void *data, bool wraparound) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - double min = menu_setting_get_min(setting); - double max = menu_setting_get_max(setting); - - if (!setting) - return -1; - - *setting->value.target.unsigned_integer = - *setting->value.target.unsigned_integer + setting->step; - - if (setting->enforce_maxrange) - { - if (*setting->value.target.unsigned_integer > max) - { - settings_t *settings = config_get_ptr(); - - if (settings && settings->menu.navigation.wraparound.setting_enable) - *setting->value.target.unsigned_integer = min; - else - *setting->value.target.unsigned_integer = max; - } - } - - return 0; -} - -static int setting_int_action_right_default(void *data, bool wraparound) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - double min = menu_setting_get_min(setting); - double max = menu_setting_get_max(setting); - - if (!setting) - return -1; - - *setting->value.target.integer = - *setting->value.target.integer + setting->step; - - if (setting->enforce_maxrange) - { - if (*setting->value.target.integer > max) - { - settings_t *settings = config_get_ptr(); - - if (settings && settings->menu.navigation.wraparound.setting_enable) - *setting->value.target.integer = min; - else - *setting->value.target.integer = max; - } - } - - return 0; -} - #if !defined(RARCH_CONSOLE) static int setting_string_action_left_audio_device(void *data, bool wraparound) { @@ -1042,56 +242,6 @@ static int setting_string_action_right_audio_device(void *data, bool wraparound) } #endif -static int setting_fraction_action_left_default( - void *data, bool wraparound) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - double min = menu_setting_get_min(setting); - - if (!setting) - return -1; - - *setting->value.target.fraction = - *setting->value.target.fraction - setting->step; - - if (setting->enforce_minrange) - { - if (*setting->value.target.fraction < min) - *setting->value.target.fraction = min; - } - - return 0; -} - -static int setting_fraction_action_right_default( - void *data, bool wraparound) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - double min = menu_setting_get_min(setting); - double max = menu_setting_get_max(setting); - - if (!setting) - return -1; - - *setting->value.target.fraction = - *setting->value.target.fraction + setting->step; - - if (setting->enforce_maxrange) - { - if (*setting->value.target.fraction > max) - { - settings_t *settings = config_get_ptr(); - - if (settings && settings->menu.navigation.wraparound.setting_enable) - *setting->value.target.fraction = min; - else - *setting->value.target.fraction = max; - } - } - - return 0; -} - static int setting_string_action_left_driver(void *data, bool wraparound) { @@ -1146,137 +296,6 @@ static int setting_string_action_right_driver(void *data, return 0; } -/** - * setting_get_string_representation_st_bool: - * @setting : pointer to setting - * @s : string for the type to be represented on-screen as - * a label. - * @len : size of @s - * - * Set a settings' label value. The setting is of type ST_BOOL. - **/ -static void setting_get_string_representation_st_bool(void *data, - char *s, size_t len) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (setting) - strlcpy(s, *setting->value.target.boolean ? setting->boolean.on_label : - setting->boolean.off_label, len); -} - - -/** - * setting_get_string_representation_st_float: - * @setting : pointer to setting - * @s : string for the type to be represented on-screen as - * a label. - * @len : size of @s - * - * Set a settings' label value. The setting is of type ST_FLOAT. - **/ -static void setting_get_string_representation_st_float(void *data, - char *s, size_t len) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (setting) - snprintf(s, len, setting->rounding_fraction, - *setting->value.target.fraction); -} - -static void setting_get_string_representation_st_float_video_refresh_rate_auto(void *data, - char *s, size_t len) -{ - double video_refresh_rate = 0.0; - double deviation = 0.0; - unsigned sample_points = 0; - rarch_setting_t *setting = (rarch_setting_t*)data; - if (!setting) - return; - - if (video_monitor_fps_statistics(&video_refresh_rate, &deviation, &sample_points)) - { - snprintf(s, len, "%.3f Hz (%.1f%% dev, %u samples)", - video_refresh_rate, 100.0 * deviation, sample_points); - menu_animation_ctl(MENU_ANIMATION_CTL_SET_ACTIVE, NULL); - } - else - strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), len); -} - -static void setting_get_string_representation_st_dir(void *data, - char *s, size_t len) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (setting) - strlcpy(s, - *setting->value.target.string ? - setting->value.target.string : setting->dir.empty_path, - len); -} - -static void setting_get_string_representation_st_path(void *data, - char *s, size_t len) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (setting) - fill_short_pathname_representation(s, setting->value.target.string, len); -} - -static void setting_get_string_representation_st_string(void *data, - char *s, size_t len) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (setting) - strlcpy(s, setting->value.target.string, len); -} - -static void setting_get_string_representation_st_bind(void *data, - char *s, size_t len) -{ - unsigned index_offset; - rarch_setting_t *setting = (rarch_setting_t*)data; - const struct retro_keybind* keybind = NULL; - const struct retro_keybind* auto_bind = NULL; - - if (!setting) - return; - - index_offset = menu_setting_get_index_offset(setting); - keybind = (const struct retro_keybind*)setting->value.target.keybind; - auto_bind = (const struct retro_keybind*) - input_get_auto_bind(index_offset, keybind->id); - - input_config_get_bind_string(s, keybind, auto_bind, len); -} - -static void setting_get_string_representation_int(void *data, - char *s, size_t len) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (setting) - snprintf(s, len, "%d", *setting->value.target.integer); -} - -static void setting_get_string_representation_uint_video_monitor_index(void *data, - char *s, size_t len) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - if (!setting) - return; - - if (*setting->value.target.unsigned_integer) - snprintf(s, len, "%u", - *setting->value.target.unsigned_integer); - else - strlcpy(s, "0 (Auto)", len); -} - static void setting_get_string_representation_uint_video_rotation(void *data, char *s, size_t len) { @@ -1309,7 +328,7 @@ static void setting_get_string_representation_uint_libretro_device(void *data, if (!setting) return; - index_offset = menu_setting_get_index_offset(setting); + index_offset = setting_get_index_offset(setting); if (runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system) && system) @@ -1362,7 +381,7 @@ static void setting_get_string_representation_uint_analog_dpad_mode(void *data, if (setting) { - unsigned index_offset = menu_setting_get_index_offset(setting); + unsigned index_offset = setting_get_index_offset(setting); strlcpy(s, modes[settings->input.analog_dpad_mode [index_offset] % ANALOG_DPAD_LAST], len); } @@ -1429,80 +448,6 @@ static void setting_get_string_representation_uint_libretro_log_level(void *data } } -static void setting_get_string_representation_uint(void *data, - char *s, size_t len) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - if (setting) - snprintf(s, len, "%u", - *setting->value.target.unsigned_integer); -} - -static void setting_get_string_representation_hex(void *data, - char *s, size_t len) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - if (setting) - snprintf(s, len, "%08x", - *setting->value.target.unsigned_integer); -} - -/** - * setting_reset_setting: - * @setting : pointer to setting - * - * Reset a setting's value to its defaults. - **/ -static void setting_reset_setting(rarch_setting_t* setting) -{ - if (!setting) - return; - - switch (menu_setting_get_type(setting)) - { - case ST_BOOL: - *setting->value.target.boolean = setting->default_value.boolean; - break; - case ST_INT: - *setting->value.target.integer = setting->default_value.integer; - break; - case ST_UINT: - *setting->value.target.unsigned_integer = setting->default_value.unsigned_integer; - break; - case ST_FLOAT: - *setting->value.target.fraction = setting->default_value.fraction; - break; - case ST_BIND: - *setting->value.target.keybind = *setting->default_value.keybind; - break; - case ST_STRING: - case ST_STRING_OPTIONS: - case ST_PATH: - case ST_DIR: - if (setting->default_value.string) - { - if (menu_setting_get_type(setting) == ST_STRING) - menu_setting_set_with_string_representation(setting, setting->default_value.string); - else - fill_pathname_expand_special(setting->value.target.string, - setting->default_value.string, setting->size); - } - break; - default: - break; - } - - if (setting->change_handler) - setting->change_handler(setting); -} - -enum setting_type menu_setting_get_type(rarch_setting_t *setting) -{ - if (!setting) - return ST_NONE; - return setting->type; -} - enum setting_type menu_setting_get_browser_selection_type(rarch_setting_t *setting) { if (!setting) @@ -1524,600 +469,6 @@ void menu_settings_list_increment(rarch_setting_t **list) *list = *list + 1; } -static void setting_get_string_representation_default(void *data, - char *s, size_t len) -{ - (void)data; - strlcpy(s, "...", len); -} - -static int setting_generic_action_start_default(void *data) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (!setting) - return -1; - - setting_reset_setting(setting); - - return 0; -} - -static int setting_bool_action_ok_default(void *data, bool wraparound) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (!setting) - return -1; - - menu_setting_set_with_string_representation(setting, - *setting->value.target.boolean ? "false" : "true"); - - return 0; -} - -static int setting_bool_action_toggle_default(void *data, bool wraparound) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (!setting) - return -1; - - menu_setting_set_with_string_representation(setting, - *setting->value.target.boolean ? "false" : "true"); - - return 0; -} - -static int setting_generic_action_ok_default(void *data, bool wraparound) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (!setting) - return -1; - - (void)wraparound; - - if (setting->cmd_trigger.idx != CMD_EVENT_NONE) - setting->cmd_trigger.triggered = true; - - return 0; -} - -/** - * setting_subgroup_setting: - * @type : type of settting. - * @name : name of setting. - * @parent_name : group that the subgroup setting belongs to. - * - * Initializes a setting of type ST_SUBGROUP. - * - * Returns: setting of type ST_SUBGROUP. - **/ -static rarch_setting_t setting_subgroup_setting(enum setting_type type, - const char* name, const char *parent_name, const char *parent_group) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = type; - - result.size = 0; - - result.name = name; - result.name_hash = 0; - result.short_description = name; - result.group = parent_name; - result.parent_group = parent_group; - result.values = NULL; - result.subgroup = NULL; - - result.index = 0; - result.index_offset = 0; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = NULL; - result.read_handler = NULL; - result.action_start = NULL; - result.action_left = NULL; - result.action_right = NULL; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = NULL; - result.action_select = NULL; - result.get_string_representation = &setting_get_string_representation_default; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = NULL; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - return result; -} - -static bool menu_settings_list_append(rarch_setting_t **list, - rarch_setting_info_t *list_info) -{ - if (!list || !*list || !list_info) - return false; - - if (list_info->index == list_info->size) - { - list_info->size *= 2; - *list = (rarch_setting_t*) - realloc(*list, sizeof(rarch_setting_t) * list_info->size); - if (!*list) - return false; - } - - return true; -} - -bool START_GROUP(rarch_setting_t **list, rarch_setting_info_t *list_info, - rarch_setting_group_info_t *group_info, - const char *name, const char *parent_group) -{ - rarch_setting_t value = setting_group_setting (ST_GROUP, name, parent_group); - group_info->name = name; - if (!(menu_settings_list_append(list, list_info))) - return false; - - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - return true; -} - -bool END_GROUP(rarch_setting_t **list, rarch_setting_info_t *list_info, - const char *parent_group) -{ - rarch_setting_t value = setting_group_setting (ST_END_GROUP, 0, parent_group); - if (!(menu_settings_list_append(list, list_info))) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - return true; -} - -bool START_SUB_GROUP(rarch_setting_t **list, - rarch_setting_info_t *list_info, const char *name, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group) -{ - rarch_setting_t value = setting_subgroup_setting (ST_SUB_GROUP, name, group_info->name, parent_group); - - subgroup_info->name = name; - - if (!(menu_settings_list_append(list, list_info))) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - return true; -} - -bool END_SUB_GROUP( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - const char *parent_group) -{ - rarch_setting_t value = setting_group_setting (ST_END_SUB_GROUP, 0, parent_group); - if (!(menu_settings_list_append(list, list_info))) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - return true; -} -bool CONFIG_ACTION( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - const char *name, const char *SHORT, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group) -{ - rarch_setting_t value = setting_action_setting(name, SHORT, - group_info->name, subgroup_info->name, parent_group); - - if (!menu_settings_list_append(list, list_info)) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - return true; -} - -/** - * setting_bool_setting: - * @name : name of setting. - * @short_description : Short description of setting. - * @target : Target of bool setting. - * @default_value : Default value (in bool format). - * @off : String value for "Off" label. - * @on : String value for "On" label. - * @group : Group that the setting belongs to. - * @subgroup : Subgroup that the setting belongs to. - * @change_handler : Function callback for change handler function pointer. - * @read_handler : Function callback for read handler function pointer. - * - * Initializes a setting of type ST_BOOL. - * - * Returns: setting of type ST_BOOL. - **/ -static rarch_setting_t setting_bool_setting(const char* name, - const char* short_description, bool* target, bool default_value, - const char *off, const char *on, - const char *group, const char *subgroup, const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = ST_BOOL; - - result.size = sizeof(bool); - - result.name = name; - result.name_hash = name ? msg_hash_calculate(name) : 0; - result.short_description = short_description; - result.group = group; - result.subgroup = subgroup; - result.parent_group = parent_group; - result.values = NULL; - - result.index = 0; - result.index_offset = 0; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = change_handler; - result.read_handler = read_handler; - result.action_start = setting_generic_action_start_default; - result.action_left = setting_bool_action_toggle_default; - result.action_right = setting_bool_action_toggle_default; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = setting_bool_action_ok_default; - result.action_select = setting_generic_action_ok_default; - result.get_string_representation = &setting_get_string_representation_st_bool; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = NULL; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - result.value.target.boolean = target; - result.original_value.boolean = *target; - result.default_value.boolean = default_value; - result.boolean.off_label = off; - result.boolean.on_label = on; - - return result; -} - -/** - * setting_int_setting: - * @name : name of setting. - * @short_description : Short description of setting. - * @target : Target of signed integer setting. - * @default_value : Default value (in signed integer format). - * @group : Group that the setting belongs to. - * @subgroup : Subgroup that the setting belongs to. - * @change_handler : Function callback for change handler function pointer. - * @read_handler : Function callback for read handler function pointer. - * - * Initializes a setting of type ST_INT. - * - * Returns: setting of type ST_INT. - **/ -static rarch_setting_t setting_int_setting(const char* name, - const char* short_description, int* target, - int default_value, - const char *group, const char *subgroup, const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t result; - - result.enum_idx = MSG_UNKNOWN; - result.type = ST_INT; - - result.size = sizeof(int); - - result.name = name; - result.name_hash = name ? msg_hash_calculate(name) : 0; - result.short_description = short_description; - result.group = group; - result.subgroup = subgroup; - result.parent_group = parent_group; - result.values = NULL; - - result.index = 0; - result.index_offset = 0; - - result.min = 0.0; - result.max = 0.0; - - result.flags = 0; - result.free_flags = 0; - - result.change_handler = change_handler; - result.read_handler = read_handler; - result.action_start = setting_generic_action_start_default; - result.action_left = setting_int_action_left_default; - result.action_right = setting_int_action_right_default; - result.action_up = NULL; - result.action_down = NULL; - result.action_cancel = NULL; - result.action_ok = setting_generic_action_ok_default; - result.action_select = setting_generic_action_ok_default; - result.get_string_representation = &setting_get_string_representation_int; - - result.bind_type = 0; - result.browser_selection_type = ST_NONE; - result.step = 0.0f; - result.rounding_fraction = NULL; - result.enforce_minrange = false; - result.enforce_maxrange = false; - - result.value.target.integer = target; - result.original_value.integer = *target; - result.default_value.integer = default_value; - - return result; -} - -bool CONFIG_BOOL( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - bool *target, - const char *name, const char *SHORT, - bool default_value, - const char *off, const char *on, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, - change_handler_t read_handler, - uint32_t flags) -{ - rarch_setting_t value = setting_bool_setting (name, SHORT, target, - default_value, off, on, - group_info->name, subgroup_info->name, parent_group, - change_handler, read_handler); - - if (!menu_settings_list_append(list, list_info)) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - if (flags != SD_FLAG_NONE) - settings_data_list_current_add_flags(list, list_info, flags); - return true; -} - -bool CONFIG_INT( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - int *target, - const char *name, const char *SHORT, - int default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t value = setting_int_setting (name, SHORT, target, default_value, - group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); - if (!(menu_settings_list_append(list, list_info))) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - return true; -} - -bool CONFIG_UINT( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - unsigned int *target, - const char *name, const char *SHORT, - unsigned int default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t value = setting_uint_setting (name, SHORT, target, default_value, - group_info->name, - subgroup_info->name, parent_group, change_handler, read_handler); - if (!(menu_settings_list_append(list, list_info))) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - return true; -} - -bool CONFIG_FLOAT( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - float *target, - const char *name, const char *SHORT, - float default_value, const char *rounding, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t value = setting_float_setting (name, SHORT, target, default_value, rounding, - group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); - if (!(menu_settings_list_append(list, list_info))) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - return true; -} - -bool CONFIG_PATH( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - char *target, size_t len, - const char *name, const char *SHORT, - const char *default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t value = setting_string_setting(ST_PATH, name, SHORT, target, len, default_value, "", - group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); - if (!(menu_settings_list_append(list, list_info))) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_EMPTY); - return true; -} - -bool CONFIG_DIR( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - char *target, size_t len, - const char *name, const char *SHORT, - const char *default_value, const char *empty, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t value = setting_string_setting(ST_DIR, name, SHORT, target, len, default_value, empty, - group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); - if (!(menu_settings_list_append(list, list_info))) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - settings_data_list_current_add_flags( - list, - list_info, - SD_FLAG_ALLOW_EMPTY | SD_FLAG_PATH_DIR | SD_FLAG_BROWSER_ACTION); - return true; -} - -bool CONFIG_STRING( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - char *target, size_t len, - const char *name, const char *SHORT, - const char *default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t value = setting_string_setting(ST_STRING, name, SHORT, target, len, default_value, "", - group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); - if (!(menu_settings_list_append(list, list_info))) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - return true; -} - -bool CONFIG_STRING_OPTIONS( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - char *target, size_t len, - const char *name, const char *SHORT, - const char *default_value, const char *values, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t value = setting_string_setting_options(ST_STRING_OPTIONS, name, SHORT, target, len, default_value, "", values, - group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); - if (!(menu_settings_list_append(list, list_info))) - return false; - - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - /* Request values to be freed later */ - settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_VALUES); - - return true; -} - -bool CONFIG_HEX( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - unsigned int *target, - const char *name, const char *SHORT, - unsigned int default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler) -{ - rarch_setting_t value = setting_hex_setting(name, SHORT, target, default_value, - group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); - if (!(menu_settings_list_append(list, list_info))) - return false; - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - return true; -} - -/* Please strdup() NAME and SHORT */ -bool CONFIG_BIND( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - struct retro_keybind *target, - uint32_t player, uint32_t player_offset, - const char *name, const char *SHORT, - const struct retro_keybind *default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group) -{ - rarch_setting_t value = setting_bind_setting(name, SHORT, target, player, player_offset, default_value, - group_info->name, subgroup_info->name, parent_group); - if (!(menu_settings_list_append(list, list_info))) - return false; - - if (value.name) - value.name_hash = msg_hash_calculate(value.name); - (*list)[list_info->index++] = value; - /* Request name and short description to be freed later */ - settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT); - - return true; -} - - void menu_settings_list_current_add_range( rarch_setting_t **list, rarch_setting_info_t *list_info, @@ -2165,7 +516,7 @@ void menu_settings_list_current_add_enum_idx( int menu_setting_generic(rarch_setting_t *setting, bool wraparound) { - uint64_t flags = menu_setting_get_flags(setting); + uint64_t flags = setting_get_flags(setting); if (setting_generic_action_ok_default(setting, wraparound) != 0) return -1; @@ -2236,7 +587,7 @@ int menu_action_handle_setting(rarch_setting_t *setting, name = menu_setting_get_name(setting); - switch (menu_setting_get_type(setting)) + switch (setting_get_type(setting)) { case ST_PATH: if (action == MENU_ACTION_OK) @@ -2313,42 +664,14 @@ const char *menu_setting_get_short_description(rarch_setting_t *setting) return setting->short_description; } -uint64_t menu_setting_get_flags(rarch_setting_t *setting) -{ - if (!setting) - return 0; - return setting->flags; -} - -double menu_setting_get_min(rarch_setting_t *setting) -{ - if (!setting) - return 0.0f; - return setting->min; -} - -double menu_setting_get_max(rarch_setting_t *setting) -{ - if (!setting) - return 0.0f; - return setting->max; -} - -uint32_t menu_setting_get_index(rarch_setting_t *setting) -{ - if (!setting) - return 0; - return setting->index; -} - static rarch_setting_t *menu_setting_find_internal(rarch_setting_t *setting, const char *label) { uint32_t needle = msg_hash_calculate(label); - for (; menu_setting_get_type(setting) != ST_NONE; menu_settings_list_increment(&setting)) + for (; setting_get_type(setting) != ST_NONE; menu_settings_list_increment(&setting)) { - if (needle == setting->name_hash && menu_setting_get_type(setting) <= ST_GROUP) + if (needle == setting->name_hash && setting_get_type(setting) <= ST_GROUP) { const char *name = menu_setting_get_name(setting); const char *short_description = menu_setting_get_short_description(setting); @@ -2372,9 +695,9 @@ static rarch_setting_t *menu_setting_find_internal(rarch_setting_t *setting, static rarch_setting_t *menu_setting_find_internal_enum(rarch_setting_t *setting, enum msg_hash_enums enum_idx) { - for (; menu_setting_get_type(setting) != ST_NONE; menu_settings_list_increment(&setting)) + for (; setting_get_type(setting) != ST_NONE; menu_settings_list_increment(&setting)) { - if (setting->enum_idx == enum_idx && menu_setting_get_type(setting) <= ST_GROUP) + if (setting->enum_idx == enum_idx && setting_get_type(setting) <= ST_GROUP) { const char *short_description = menu_setting_get_short_description(setting); if (string_is_empty(short_description)) @@ -2428,7 +751,7 @@ int menu_setting_set_flags(rarch_setting_t *setting) if (!setting) return 0; - switch (menu_setting_get_type(setting)) + switch (setting_get_type(setting)) { case ST_STRING_OPTIONS: return MENU_SETTING_STRING_OPTIONS; @@ -2476,7 +799,7 @@ void *setting_get_ptr(rarch_setting_t *setting) if (!setting) return NULL; - switch (menu_setting_get_type(setting)) + switch (setting_get_type(setting)) { case ST_BOOL: return setting->value.target.boolean; @@ -2500,106 +823,6 @@ void *setting_get_ptr(rarch_setting_t *setting) return NULL; } - - -/** - * menu_setting_set_with_string_representation: - * @setting : pointer to setting - * @value : value for the setting (string) - * - * Set a settings' value with a string. It is assumed - * that the string has been properly formatted. - **/ -int menu_setting_set_with_string_representation(rarch_setting_t* setting, - const char* value) -{ - double min, max; - uint64_t flags; - if (!setting || !value) - return -1; - - min = menu_setting_get_min(setting); - max = menu_setting_get_max(setting); - - switch (menu_setting_get_type(setting)) - { - case ST_INT: - flags = menu_setting_get_flags(setting); - sscanf(value, "%d", setting->value.target.integer); - if (flags & SD_FLAG_HAS_RANGE) - { - if (setting->enforce_minrange && *setting->value.target.integer < min) - *setting->value.target.integer = min; - if (setting->enforce_maxrange && *setting->value.target.integer > max) - { - settings_t *settings = config_get_ptr(); - - if (settings && settings->menu.navigation.wraparound.setting_enable) - *setting->value.target.integer = min; - else - *setting->value.target.integer = max; - } - } - break; - case ST_UINT: - flags = menu_setting_get_flags(setting); - sscanf(value, "%u", setting->value.target.unsigned_integer); - if (flags & SD_FLAG_HAS_RANGE) - { - if (setting->enforce_minrange && *setting->value.target.unsigned_integer < min) - *setting->value.target.unsigned_integer = min; - if (setting->enforce_maxrange && *setting->value.target.unsigned_integer > max) - { - settings_t *settings = config_get_ptr(); - - if (settings && settings->menu.navigation.wraparound.setting_enable) - *setting->value.target.unsigned_integer = min; - else - *setting->value.target.unsigned_integer = max; - } - } - break; - case ST_FLOAT: - flags = menu_setting_get_flags(setting); - sscanf(value, "%f", setting->value.target.fraction); - if (flags & SD_FLAG_HAS_RANGE) - { - if (setting->enforce_minrange && *setting->value.target.fraction < min) - *setting->value.target.fraction = min; - if (setting->enforce_maxrange && *setting->value.target.fraction > max) - { - settings_t *settings = config_get_ptr(); - - if (settings && settings->menu.navigation.wraparound.setting_enable) - *setting->value.target.fraction = min; - else - *setting->value.target.fraction = max; - } - } - break; - case ST_PATH: - case ST_DIR: - case ST_STRING: - case ST_STRING_OPTIONS: - case ST_ACTION: - strlcpy(setting->value.target.string, value, setting->size); - break; - case ST_BOOL: - if (string_is_equal(value, "true")) - *setting->value.target.boolean = true; - else if (string_is_equal(value, "false")) - *setting->value.target.boolean = false; - break; - default: - break; - } - - if (setting->change_handler) - setting->change_handler(setting); - - return 0; -} - /** * setting_get_string_representation: * @setting : pointer to setting @@ -2618,12 +841,6 @@ void setting_get_string_representation(void *data, char *s, size_t len) setting->get_string_representation(setting, s, len); } -unsigned menu_setting_get_index_offset(rarch_setting_t *setting) -{ - if (!setting) - return 0; - return setting->index_offset; -} /** * setting_action_start_savestates: @@ -2643,7 +860,7 @@ static int setting_action_start_bind_device(void *data) if (!setting || !settings) return -1; - index_offset = menu_setting_get_index_offset(setting); + index_offset = setting_get_index_offset(setting); settings->input.joypad_map[index_offset] = index_offset; return 0; @@ -2729,7 +946,7 @@ static int setting_action_start_libretro_device_type(void *data) if (setting_generic_action_start_default(setting) != 0) return -1; - index_offset = menu_setting_get_index_offset(setting); + index_offset = setting_get_index_offset(setting); port = index_offset; devices[types++] = RETRO_DEVICE_NONE; @@ -2779,51 +996,6 @@ static int setting_action_start_video_refresh_rate_auto( return 0; } -static int setting_string_action_start_generic(void *data) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (!setting) - return -1; - - setting->value.target.string[0] = '\0'; - - return 0; -} - -unsigned menu_setting_get_bind_type(rarch_setting_t *setting) -{ - if (!setting) - return 0; - return setting->bind_type; -} - -static int setting_bind_action_start(void *data) -{ - unsigned bind_type; - struct retro_keybind *keybind = NULL; - rarch_setting_t *setting = (rarch_setting_t*)data; - struct retro_keybind *def_binds = (struct retro_keybind *)retro_keybinds_1; - - if (!setting) - return -1; - - keybind = (struct retro_keybind*)setting->value.target.keybind; - if (!keybind) - return -1; - - keybind->joykey = NO_BTN; - keybind->joyaxis = AXIS_NONE; - - if (setting->index_offset) - def_binds = (struct retro_keybind*)retro_keybinds_rest; - - bind_type = menu_setting_get_bind_type(setting); - keybind->key = def_binds[bind_type - MENU_SETTINGS_BIND_BEGIN].key; - - return 0; -} - /** ******* ACTION TOGGLE CALLBACK FUNCTIONS ******* **/ @@ -3009,7 +1181,7 @@ static int setting_action_left_bind_device(void *data, bool wraparound) if (!setting) return -1; - index_offset = menu_setting_get_index_offset(setting); + index_offset = setting_get_index_offset(setting); p = &settings->input.joypad_map[index_offset]; @@ -3031,7 +1203,7 @@ static int setting_action_right_bind_device(void *data, bool wraparound) if (!setting) return -1; - index_offset = menu_setting_get_index_offset(setting); + index_offset = setting_get_index_offset(setting); p = &settings->input.joypad_map[index_offset]; @@ -3066,7 +1238,7 @@ static int setting_action_ok_bind_all_save_autoconfig(void *data, bool wraparoun if (!settings || !setting) return -1; - index_offset = menu_setting_get_index_offset(setting); + index_offset = setting_get_index_offset(setting); if(config_save_autoconf_profile( settings->input.device_names[index_offset], index_offset)) @@ -3117,6 +1289,26 @@ static int setting_action_ok_bind_defaults(void *data, bool wraparound) return 0; } +static void setting_get_string_representation_st_float_video_refresh_rate_auto(void *data, + char *s, size_t len) +{ + double video_refresh_rate = 0.0; + double deviation = 0.0; + unsigned sample_points = 0; + rarch_setting_t *setting = (rarch_setting_t*)data; + if (!setting) + return; + + if (video_monitor_fps_statistics(&video_refresh_rate, &deviation, &sample_points)) + { + snprintf(s, len, "%.3f Hz (%.1f%% dev, %u samples)", + video_refresh_rate, 100.0 * deviation, sample_points); + menu_animation_ctl(MENU_ANIMATION_CTL_SET_ACTIVE, NULL); + } + else + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), len); +} + static int setting_action_ok_video_refresh_rate_auto(void *data, bool wraparound) { double video_refresh_rate = 0.0; @@ -3139,7 +1331,6 @@ static int setting_action_ok_video_refresh_rate_auto(void *data, bool wraparound if (setting_generic_action_ok_default(setting, wraparound) != 0) return -1; - return 0; } @@ -3157,7 +1348,7 @@ static void menu_input_st_string_cb(void *userdata, const char *str) if (setting) { - menu_setting_set_with_string_representation(setting, str); + setting_set_with_string_representation(setting, str); menu_setting_generic(setting, false); } } @@ -3177,7 +1368,7 @@ static int setting_generic_action_ok_linefeed(void *data, bool wraparound) (void)wraparound; - switch (menu_setting_get_type(setting)) + switch (setting_get_type(setting)) { case ST_UINT: cb = menu_input_st_uint_cb; @@ -3205,29 +1396,6 @@ static int setting_generic_action_ok_linefeed(void *data, bool wraparound) return 0; } -static int setting_action_action_ok(void *data, bool wraparound) -{ - rarch_setting_t *setting = (rarch_setting_t*)data; - - if (!setting) - return -1; - - (void)wraparound; - - if (setting->cmd_trigger.idx != CMD_EVENT_NONE) - command_event(setting->cmd_trigger.idx, NULL); - - return 0; -} - -static int setting_bind_action_ok(void *data, bool wraparound) -{ - (void)wraparound; - if (!menu_input_ctl(MENU_INPUT_CTL_BIND_SINGLE, data)) - return -1; - return 0; -} - static void get_string_representation_bind_device(void * data, char *s, size_t len) { @@ -3238,7 +1406,7 @@ static void get_string_representation_bind_device(void * data, char *s, if (!setting) return; - index_offset = menu_setting_get_index_offset(setting); + index_offset = setting_get_index_offset(setting); map = settings->input.joypad_map[index_offset]; if (map < settings->input.max_users) @@ -3358,7 +1526,7 @@ void general_write_handler(void *data) if (setting->cmd_trigger.idx != CMD_EVENT_NONE) { - uint64_t flags = menu_setting_get_flags(setting); + uint64_t flags = setting_get_flags(setting); if (flags & SD_FLAG_EXIT) { @@ -3416,7 +1584,7 @@ void general_write_handler(void *data) if (menu_displaylist_ctl(DISPLAYLIST_GENERIC, &info)) menu_displaylist_ctl(DISPLAYLIST_PROCESS, &info); - menu_setting_set_with_string_representation(setting, "false"); + setting_set_with_string_representation(setting, "false"); } break; case MENU_ENUM_LABEL_AUDIO_MAX_TIMING_SKEW: @@ -3497,7 +1665,7 @@ void general_write_handler(void *data) if (*setting->value.target.boolean && global->console.screen.pal_enable) rarch_cmd = CMD_EVENT_REINIT; else - menu_setting_set_with_string_representation(setting, "false"); + setting_set_with_string_representation(setting, "false"); break; case MENU_ENUM_LABEL_SYSTEM_BGM_ENABLE: if (*setting->value.target.boolean) @@ -8535,7 +6703,7 @@ bool menu_setting_free(void *data) return false; /* Free data which was previously tagged */ - for (; menu_setting_get_type(setting) != ST_NONE; menu_settings_list_increment(&setting)) + for (; setting_get_type(setting) != ST_NONE; menu_settings_list_increment(&setting)) for (values = setting->free_flags, n = 0; values != 0; values >>= 1, n++) if (values & 1) switch (1 << n) @@ -8597,7 +6765,7 @@ static rarch_setting_t *menu_setting_new_internal(rarch_setting_info_t *list_inf SETTINGS_LIST_DIRECTORY, SETTINGS_LIST_PRIVACY }; - rarch_setting_t terminator = menu_setting_terminator_setting(); + rarch_setting_t terminator = setting_terminator_setting(); const char *root = msg_hash_to_str(MENU_ENUM_LABEL_MAIN_MENU); rarch_setting_t *list = (rarch_setting_t*)calloc( list_info->size, sizeof(*list)); @@ -8611,7 +6779,7 @@ static rarch_setting_t *menu_setting_new_internal(rarch_setting_info_t *list_inf goto error; } - if (!(menu_settings_list_append(&list, list_info))) + if (!(settings_list_append(&list, list_info))) goto error; if (terminator.name) terminator.name_hash = msg_hash_calculate(terminator.name); @@ -8675,9 +6843,9 @@ bool menu_setting_ctl(enum menu_setting_ctl_state state, void *data) if (!setting) return false; - flags = menu_setting_get_flags(setting); + flags = setting_get_flags(setting); - if (menu_setting_get_type(setting) != ST_ACTION) + if (setting_get_type(setting) != ST_ACTION) return false; if (!setting->change_handler) diff --git a/menu/menu_setting.h b/menu/menu_setting.h index bdf84116bd..d2995bd3d3 100644 --- a/menu/menu_setting.h +++ b/menu/menu_setting.h @@ -25,53 +25,12 @@ #include "../command.h" #include "../input/input_driver.h" +#include "../setting_list.h" #include "../msg_hash.h" RETRO_BEGIN_DECLS -enum setting_type -{ - ST_NONE = 0, - ST_ACTION, - ST_BOOL, - ST_INT, - ST_UINT, - ST_FLOAT, - ST_PATH, - ST_DIR, - ST_STRING, - ST_STRING_OPTIONS, - ST_HEX, - ST_BIND, - ST_GROUP, - ST_SUB_GROUP, - ST_END_GROUP, - ST_END_SUB_GROUP -}; - -enum setting_flags -{ - SD_FLAG_NONE = 0, - SD_FLAG_PATH_DIR = (1 << 0), - SD_FLAG_PATH_FILE = (1 << 1), - SD_FLAG_ALLOW_EMPTY = (1 << 2), - SD_FLAG_HAS_RANGE = (1 << 3), - SD_FLAG_ALLOW_INPUT = (1 << 4), - SD_FLAG_IS_DRIVER = (1 << 5), - SD_FLAG_EXIT = (1 << 6), - SD_FLAG_CMD_APPLY_AUTO = (1 << 7), - SD_FLAG_BROWSER_ACTION = (1 << 8), - SD_FLAG_ADVANCED = (1 << 9) -}; - -enum settings_free_flags -{ - SD_FREE_FLAG_VALUES = (1 << 0), - SD_FREE_FLAG_NAME = (1 << 1), - SD_FREE_FLAG_SHORT = (1 << 2) -}; - enum menu_setting_ctl_state { MENU_SETTING_CTL_NONE = 0, @@ -115,164 +74,8 @@ enum setting_list_flags SL_FLAG_SETTINGS_ALL = (1 << 30) }; -typedef struct rarch_setting_group_info rarch_setting_group_info_t; -typedef struct rarch_setting rarch_setting_t; -typedef struct rarch_setting_info rarch_setting_info_t; - -typedef void (*change_handler_t )(void *data); -typedef int (*action_left_handler_t )(void *data, bool wraparound); -typedef int (*action_right_handler_t )(void *data, bool wraparound); -typedef int (*action_up_handler_t )(void *data); -typedef int (*action_down_handler_t )(void *data); -typedef int (*action_start_handler_t )(void *data); -typedef int (*action_cancel_handler_t )(void *data); -typedef int (*action_ok_handler_t )(void *data, bool wraparound); -typedef int (*action_select_handler_t )(void *data, bool wraparound); -typedef void (*get_string_representation_t )(void *data, char *s, size_t len); - #define SL_FLAG_SETTINGS_GROUP_ALL (SL_FLAG_SETTINGS_ALL - SL_FLAG_MAIN_MENU) -bool START_GROUP(rarch_setting_t **list, rarch_setting_info_t *list_info, - rarch_setting_group_info_t *group_info, - const char *name, const char *parent_group); - -bool END_GROUP(rarch_setting_t **list, rarch_setting_info_t *list_info, - const char *parent_group); - -bool START_SUB_GROUP(rarch_setting_t **list, - rarch_setting_info_t *list_info, const char *name, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group); - -bool END_SUB_GROUP( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - const char *parent_group); - -bool CONFIG_ACTION( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - const char *name, const char *SHORT, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group); - -bool CONFIG_BOOL( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - bool *target, - const char *name, const char *SHORT, - bool default_value, - const char *off, const char *on, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, - change_handler_t read_handler, - uint32_t flags - ); - -bool CONFIG_INT( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - int *target, - const char *name, const char *SHORT, - int default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler); - -bool CONFIG_UINT( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - unsigned int *target, - const char *name, const char *SHORT, - unsigned int default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler); - -bool CONFIG_FLOAT( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - float *target, - const char *name, const char *SHORT, - float default_value, const char *rounding, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler); - -bool CONFIG_PATH( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - char *target, size_t len, - const char *name, const char *SHORT, - const char *default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler); - -bool CONFIG_DIR( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - char *target, size_t len, - const char *name, const char *SHORT, - const char *default_value, const char *empty, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler); - -bool CONFIG_STRING( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - char *target, size_t len, - const char *name, const char *SHORT, - const char *default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler); - -bool CONFIG_STRING_OPTIONS( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - char *target, size_t len, - const char *name, const char *SHORT, - const char *default_value, const char *values, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler); - -bool CONFIG_HEX( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - unsigned int *target, - const char *name, const char *SHORT, - unsigned int default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group, - change_handler_t change_handler, change_handler_t read_handler); - -/* Please strdup() NAME and SHORT */ -bool CONFIG_BIND( - rarch_setting_t **list, - rarch_setting_info_t *list_info, - struct retro_keybind *target, - uint32_t player, uint32_t player_offset, - const char *name, const char *SHORT, - const struct retro_keybind *default_value, - rarch_setting_group_info_t *group_info, - rarch_setting_group_info_t *subgroup_info, - const char *parent_group); - int menu_setting_generic(rarch_setting_t *setting, bool wraparound); int menu_setting_set_flags(rarch_setting_t *setting); @@ -292,17 +95,6 @@ rarch_setting_t *menu_setting_find(const char *label); rarch_setting_t *menu_setting_find_enum(enum msg_hash_enums enum_idx); -/** - * setting_set_with_string_representation: - * @setting : pointer to setting - * @value : value for the setting (string) - * - * Set a settings' value with a string. It is assumed - * that the string has been properly formatted. - **/ -int menu_setting_set_with_string_representation( - rarch_setting_t* setting, const char *value); - /** * setting_get_string_representation: * @setting : pointer to setting @@ -335,8 +127,6 @@ void menu_setting_get_label(void *data, char *s, int menu_action_handle_setting(rarch_setting_t *setting, unsigned type, unsigned action, bool wraparound); -enum setting_type menu_setting_get_type(rarch_setting_t *setting); - enum setting_type menu_setting_get_browser_selection_type(rarch_setting_t *setting); enum msg_hash_enums menu_setting_get_enum_idx(rarch_setting_t *setting); @@ -347,20 +137,10 @@ const char *menu_setting_get_name(rarch_setting_t *setting); const char *menu_setting_get_short_description(rarch_setting_t *setting); -uint64_t menu_setting_get_flags(rarch_setting_t *setting); - const char *menu_setting_get_parent_group(rarch_setting_t *setting); -double menu_setting_get_min(rarch_setting_t *setting); - -double menu_setting_get_max(rarch_setting_t *setting); - -unsigned menu_setting_get_bind_type(rarch_setting_t *setting); - uint32_t menu_setting_get_index(rarch_setting_t *setting); -unsigned menu_setting_get_index_offset(rarch_setting_t *setting); - void *setting_get_ptr(rarch_setting_t *setting); void menu_settings_list_increment(rarch_setting_t **list); @@ -397,6 +177,9 @@ void menu_settings_list_current_add_enum_idx( bool menu_setting_free(void *data); +bool settings_list_append(rarch_setting_t **list, + rarch_setting_info_t *list_info); + bool menu_setting_ctl(enum menu_setting_ctl_state state, void *data); RETRO_END_DECLS diff --git a/setting_list.c b/setting_list.c new file mode 100644 index 0000000000..4d33f63b39 --- /dev/null +++ b/setting_list.c @@ -0,0 +1,1732 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2011-2016 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "configuration.h" +#include "config.def.h" +#include "input/input_config.h" +#include "input/input_autodetect.h" +#include "setting_list.h" + +#ifdef HAVE_MENU +#include "menu/menu_driver.h" +#endif + +rarch_setting_t setting_terminator_setting(void) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = ST_NONE; + + result.size = 0; + + result.name = NULL; + result.name_hash = 0; + result.short_description = NULL; + result.group = NULL; + result.subgroup = NULL; + result.parent_group = NULL; + result.values = NULL; + + result.index = 0; + result.index_offset = 0; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = NULL; + result.read_handler = NULL; + result.action_start = NULL; + result.action_left = NULL; + result.action_right = NULL; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = NULL; + result.action_select = NULL; + result.get_string_representation = NULL; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = NULL; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + return result; +} + +bool settings_list_append(rarch_setting_t **list, + rarch_setting_info_t *list_info) +{ + if (!list || !*list || !list_info) + return false; + + if (list_info->index == list_info->size) + { + list_info->size *= 2; + *list = (rarch_setting_t*) + realloc(*list, sizeof(rarch_setting_t) * list_info->size); + if (!*list) + return false; + } + + return true; +} + +uint64_t setting_get_flags(rarch_setting_t *setting) +{ + if (!setting) + return 0; + return setting->flags; +} + +uint32_t setting_get_index(rarch_setting_t *setting) +{ + if (!setting) + return 0; + return setting->index; +} + +enum setting_type setting_get_type(rarch_setting_t *setting) +{ + if (!setting) + return ST_NONE; + return setting->type; +} + +unsigned setting_get_index_offset(rarch_setting_t *setting) +{ + if (!setting) + return 0; + return setting->index_offset; +} + +unsigned setting_get_bind_type(rarch_setting_t *setting) +{ + if (!setting) + return 0; + return setting->bind_type; +} + +static int setting_bind_action_ok(void *data, bool wraparound) +{ + (void)wraparound; +#ifdef HAVE_MENU + /* TODO - get rid of menu dependency */ + if (!menu_input_ctl(MENU_INPUT_CTL_BIND_SINGLE, data)) + return -1; +#endif + return 0; +} + +static int setting_int_action_right_default(void *data, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + double min = setting_get_min(setting); + double max = setting_get_max(setting); + + if (!setting) + return -1; + + *setting->value.target.integer = + *setting->value.target.integer + setting->step; + + if (setting->enforce_maxrange) + { + if (*setting->value.target.integer > max) + { + settings_t *settings = config_get_ptr(); + + if (settings && settings->menu.navigation.wraparound.setting_enable) + *setting->value.target.integer = min; + else + *setting->value.target.integer = max; + } + } + + return 0; +} + +static int setting_bind_action_start(void *data) +{ + unsigned bind_type; + struct retro_keybind *keybind = NULL; + rarch_setting_t *setting = (rarch_setting_t*)data; + struct retro_keybind *def_binds = (struct retro_keybind *)retro_keybinds_1; + + if (!setting) + return -1; + + keybind = (struct retro_keybind*)setting->value.target.keybind; + if (!keybind) + return -1; + + keybind->joykey = NO_BTN; + keybind->joyaxis = AXIS_NONE; + + if (setting->index_offset) + def_binds = (struct retro_keybind*)retro_keybinds_rest; + + bind_type = setting_get_bind_type(setting); + keybind->key = def_binds[bind_type - MENU_SETTINGS_BIND_BEGIN].key; + + return 0; +} + +static void setting_get_string_representation_hex(void *data, + char *s, size_t len) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + if (setting) + snprintf(s, len, "%08x", + *setting->value.target.unsigned_integer); +} + +static void setting_get_string_representation_uint(void *data, + char *s, size_t len) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + if (setting) + snprintf(s, len, "%u", + *setting->value.target.unsigned_integer); +} + +static int setting_uint_action_left_default(void *data, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + double min = setting_get_min(setting); + + if (!setting) + return -1; + + if (*setting->value.target.unsigned_integer != min) + *setting->value.target.unsigned_integer = + *setting->value.target.unsigned_integer - setting->step; + + if (setting->enforce_minrange) + { + if (*setting->value.target.unsigned_integer < min) + *setting->value.target.unsigned_integer = min; + } + + + return 0; +} + +static int setting_uint_action_right_default(void *data, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + double min = setting_get_min(setting); + double max = setting_get_max(setting); + + if (!setting) + return -1; + + *setting->value.target.unsigned_integer = + *setting->value.target.unsigned_integer + setting->step; + + if (setting->enforce_maxrange) + { + if (*setting->value.target.unsigned_integer > max) + { + settings_t *settings = config_get_ptr(); + + if (settings && settings->menu.navigation.wraparound.setting_enable) + *setting->value.target.unsigned_integer = min; + else + *setting->value.target.unsigned_integer = max; + } + } + + return 0; +} + +int setting_generic_action_ok_default(void *data, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + (void)wraparound; + + if (setting->cmd_trigger.idx != CMD_EVENT_NONE) + setting->cmd_trigger.triggered = true; + + return 0; +} + +static void setting_get_string_representation_int(void *data, + char *s, size_t len) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (setting) + snprintf(s, len, "%d", *setting->value.target.integer); +} + +double setting_get_min(rarch_setting_t *setting) +{ + if (!setting) + return 0.0f; + return setting->min; +} + +double setting_get_max(rarch_setting_t *setting) +{ + if (!setting) + return 0.0f; + return setting->max; +} + +/** + * setting_set_with_string_representation: + * @setting : pointer to setting + * @value : value for the setting (string) + * + * Set a settings' value with a string. It is assumed + * that the string has been properly formatted. + **/ +int setting_set_with_string_representation(rarch_setting_t* setting, + const char* value) +{ + double min, max; + uint64_t flags; + if (!setting || !value) + return -1; + + min = setting_get_min(setting); + max = setting_get_max(setting); + + switch (setting_get_type(setting)) + { + case ST_INT: + flags = setting_get_flags(setting); + sscanf(value, "%d", setting->value.target.integer); + if (flags & SD_FLAG_HAS_RANGE) + { + if (setting->enforce_minrange && *setting->value.target.integer < min) + *setting->value.target.integer = min; + if (setting->enforce_maxrange && *setting->value.target.integer > max) + { + settings_t *settings = config_get_ptr(); + + if (settings && settings->menu.navigation.wraparound.setting_enable) + *setting->value.target.integer = min; + else + *setting->value.target.integer = max; + } + } + break; + case ST_UINT: + flags = setting_get_flags(setting); + sscanf(value, "%u", setting->value.target.unsigned_integer); + if (flags & SD_FLAG_HAS_RANGE) + { + if (setting->enforce_minrange && *setting->value.target.unsigned_integer < min) + *setting->value.target.unsigned_integer = min; + if (setting->enforce_maxrange && *setting->value.target.unsigned_integer > max) + { + settings_t *settings = config_get_ptr(); + + if (settings && settings->menu.navigation.wraparound.setting_enable) + *setting->value.target.unsigned_integer = min; + else + *setting->value.target.unsigned_integer = max; + } + } + break; + case ST_FLOAT: + flags = setting_get_flags(setting); + sscanf(value, "%f", setting->value.target.fraction); + if (flags & SD_FLAG_HAS_RANGE) + { + if (setting->enforce_minrange && *setting->value.target.fraction < min) + *setting->value.target.fraction = min; + if (setting->enforce_maxrange && *setting->value.target.fraction > max) + { + settings_t *settings = config_get_ptr(); + + if (settings && settings->menu.navigation.wraparound.setting_enable) + *setting->value.target.fraction = min; + else + *setting->value.target.fraction = max; + } + } + break; + case ST_PATH: + case ST_DIR: + case ST_STRING: + case ST_STRING_OPTIONS: + case ST_ACTION: + strlcpy(setting->value.target.string, value, setting->size); + break; + case ST_BOOL: + if (string_is_equal(value, "true")) + *setting->value.target.boolean = true; + else if (string_is_equal(value, "false")) + *setting->value.target.boolean = false; + break; + default: + break; + } + + if (setting->change_handler) + setting->change_handler(setting); + + return 0; +} + +static int setting_fraction_action_left_default( + void *data, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + double min = setting_get_min(setting); + + if (!setting) + return -1; + + *setting->value.target.fraction = + *setting->value.target.fraction - setting->step; + + if (setting->enforce_minrange) + { + if (*setting->value.target.fraction < min) + *setting->value.target.fraction = min; + } + + return 0; +} + +static int setting_fraction_action_right_default( + void *data, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + double min = setting_get_min(setting); + double max = setting_get_max(setting); + + if (!setting) + return -1; + + *setting->value.target.fraction = + *setting->value.target.fraction + setting->step; + + if (setting->enforce_maxrange) + { + if (*setting->value.target.fraction > max) + { + settings_t *settings = config_get_ptr(); + + if (settings && settings->menu.navigation.wraparound.setting_enable) + *setting->value.target.fraction = min; + else + *setting->value.target.fraction = max; + } + } + + return 0; +} + +/** + * setting_reset_setting: + * @setting : pointer to setting + * + * Reset a setting's value to its defaults. + **/ +static void setting_reset_setting(rarch_setting_t* setting) +{ + if (!setting) + return; + + switch (setting_get_type(setting)) + { + case ST_BOOL: + *setting->value.target.boolean = setting->default_value.boolean; + break; + case ST_INT: + *setting->value.target.integer = setting->default_value.integer; + break; + case ST_UINT: + *setting->value.target.unsigned_integer = setting->default_value.unsigned_integer; + break; + case ST_FLOAT: + *setting->value.target.fraction = setting->default_value.fraction; + break; + case ST_BIND: + *setting->value.target.keybind = *setting->default_value.keybind; + break; + case ST_STRING: + case ST_STRING_OPTIONS: + case ST_PATH: + case ST_DIR: + if (setting->default_value.string) + { + if (setting_get_type(setting) == ST_STRING) + setting_set_with_string_representation(setting, setting->default_value.string); + else + fill_pathname_expand_special(setting->value.target.string, + setting->default_value.string, setting->size); + } + break; + default: + break; + } + + if (setting->change_handler) + setting->change_handler(setting); +} + +int setting_generic_action_start_default(void *data) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + setting_reset_setting(setting); + + return 0; +} + +static void setting_get_string_representation_default(void *data, + char *s, size_t len) +{ + (void)data; + strlcpy(s, "...", len); +} + +/** + * setting_get_string_representation_st_bool: + * @setting : pointer to setting + * @s : string for the type to be represented on-screen as + * a label. + * @len : size of @s + * + * Set a settings' label value. The setting is of type ST_BOOL. + **/ +static void setting_get_string_representation_st_bool(void *data, + char *s, size_t len) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (setting) + strlcpy(s, *setting->value.target.boolean ? setting->boolean.on_label : + setting->boolean.off_label, len); +} + + +/** + * setting_get_string_representation_st_float: + * @setting : pointer to setting + * @s : string for the type to be represented on-screen as + * a label. + * @len : size of @s + * + * Set a settings' label value. The setting is of type ST_FLOAT. + **/ +static void setting_get_string_representation_st_float(void *data, + char *s, size_t len) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (setting) + snprintf(s, len, setting->rounding_fraction, + *setting->value.target.fraction); +} + +static void setting_get_string_representation_st_dir(void *data, + char *s, size_t len) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (setting) + strlcpy(s, + *setting->value.target.string ? + setting->value.target.string : setting->dir.empty_path, + len); +} + +static void setting_get_string_representation_st_path(void *data, + char *s, size_t len) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (setting) + fill_short_pathname_representation(s, setting->value.target.string, len); +} + +static void setting_get_string_representation_st_string(void *data, + char *s, size_t len) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (setting) + strlcpy(s, setting->value.target.string, len); +} + +static void setting_get_string_representation_st_bind(void *data, + char *s, size_t len) +{ + unsigned index_offset; + rarch_setting_t *setting = (rarch_setting_t*)data; + const struct retro_keybind* keybind = NULL; + const struct retro_keybind* auto_bind = NULL; + + if (!setting) + return; + + index_offset = setting_get_index_offset(setting); + keybind = (const struct retro_keybind*)setting->value.target.keybind; + auto_bind = (const struct retro_keybind*) + input_get_auto_bind(index_offset, keybind->id); + + input_config_get_bind_string(s, keybind, auto_bind, len); +} + +static int setting_action_action_ok(void *data, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + (void)wraparound; + + if (setting->cmd_trigger.idx != CMD_EVENT_NONE) + command_event(setting->cmd_trigger.idx, NULL); + + return 0; +} + + +/** + * setting_action_setting: + * @name : Name of setting. + * @short_description : Short description of setting. + * @group : Group that the setting belongs to. + * @subgroup : Subgroup that the setting belongs to. + * + * Initializes a setting of type ST_ACTION. + * + * Returns: setting of type ST_ACTION. + **/ +static rarch_setting_t setting_action_setting(const char* name, + const char* short_description, + const char *group, const char *subgroup, + const char *parent_group) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = ST_ACTION; + + result.size = 0; + + result.name = name; + result.name_hash = 0; + result.short_description = short_description; + result.group = group; + result.subgroup = subgroup; + result.parent_group = parent_group; + result.values = NULL; + + result.index = 0; + result.index_offset = 0; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = NULL; + result.read_handler = NULL; + result.action_start = NULL; + result.action_left = NULL; + result.action_right = NULL; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = setting_action_action_ok; + result.action_select = setting_action_action_ok; + result.get_string_representation = &setting_get_string_representation_default; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = NULL; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + return result; +} + +/** + * setting_group_setting: + * @type : type of settting. + * @name : name of setting. + * + * Initializes a setting of type ST_GROUP. + * + * Returns: setting of type ST_GROUP. + **/ +static rarch_setting_t setting_group_setting(enum setting_type type, const char* name, + const char *parent_group) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = type; + + result.size = 0; + + result.name = name; + result.name_hash = 0; + result.short_description = name; + result.group = NULL; + result.subgroup = NULL; + result.parent_group = parent_group; + result.values = NULL; + + result.index = 0; + result.index_offset = 0; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = NULL; + result.read_handler = NULL; + result.action_start = NULL; + result.action_left = NULL; + result.action_right = NULL; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = NULL; + result.action_select = NULL; + result.get_string_representation = &setting_get_string_representation_default; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = NULL; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + + return result; +} + +/** + * setting_float_setting: + * @name : name of setting. + * @short_description : Short description of setting. + * @target : Target of float setting. + * @default_value : Default value (in float). + * @rounding : Rounding (for float-to-string representation). + * @group : Group that the setting belongs to. + * @subgroup : Subgroup that the setting belongs to. + * @change_handler : Function callback for change handler function pointer. + * @read_handler : Function callback for read handler function pointer. + * + * Initializes a setting of type ST_FLOAT. + * + * Returns: setting of type ST_FLOAT. + **/ +static rarch_setting_t setting_float_setting(const char* name, + const char* short_description, float* target, float default_value, + const char *rounding, const char *group, const char *subgroup, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = ST_FLOAT; + + result.size = sizeof(float); + + result.name = name; + result.name_hash = 0; + result.short_description = short_description; + result.group = group; + result.subgroup = subgroup; + result.parent_group = parent_group; + result.values = NULL; + + result.index = 0; + result.index_offset = 0; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = change_handler; + result.read_handler = read_handler; + result.action_start = setting_generic_action_start_default; + result.action_left = setting_fraction_action_left_default; + result.action_right = setting_fraction_action_right_default; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = setting_generic_action_ok_default; + result.action_select = setting_generic_action_ok_default; + result.get_string_representation = &setting_get_string_representation_st_float; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = rounding; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + result.value.target.fraction = target; + result.original_value.fraction = *target; + result.default_value.fraction = default_value; + + return result; +} + +/** + * setting_uint_setting: + * @name : name of setting. + * @short_description : Short description of setting. + * @target : Target of unsigned integer setting. + * @default_value : Default value (in unsigned integer format). + * @group : Group that the setting belongs to. + * @subgroup : Subgroup that the setting belongs to. + * @change_handler : Function callback for change handler function pointer. + * @read_handler : Function callback for read handler function pointer. + * + * Initializes a setting of type ST_UINT. + * + * Returns: setting of type ST_UINT. + **/ +static rarch_setting_t setting_uint_setting(const char* name, + const char* short_description, unsigned int* target, + unsigned int default_value, + const char *group, const char *subgroup, const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = ST_UINT; + + result.size = sizeof(unsigned int); + + result.name = name; + result.name_hash = 0; + result.short_description = short_description; + result.group = group; + result.subgroup = subgroup; + result.parent_group = parent_group; + result.values = NULL; + + result.index = 0; + result.index_offset = 0; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = change_handler; + result.read_handler = read_handler; + result.action_start = setting_generic_action_start_default; + result.action_left = setting_uint_action_left_default; + result.action_right = setting_uint_action_right_default; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = setting_generic_action_ok_default; + result.action_select = setting_generic_action_ok_default; + result.get_string_representation = &setting_get_string_representation_uint; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = NULL; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + result.value.target.unsigned_integer = target; + result.original_value.unsigned_integer = *target; + result.default_value.unsigned_integer = default_value; + + return result; +} + +/** + * setting_hex_setting: + * @name : name of setting. + * @short_description : Short description of setting. + * @target : Target of unsigned integer setting. + * @default_value : Default value (in unsigned integer format). + * @group : Group that the setting belongs to. + * @subgroup : Subgroup that the setting belongs to. + * @change_handler : Function callback for change handler function pointer. + * @read_handler : Function callback for read handler function pointer. + * + * Initializes a setting of type ST_HEX. + * + * Returns: setting of type ST_HEX. + **/ +static rarch_setting_t setting_hex_setting(const char* name, + const char* short_description, unsigned int* target, + unsigned int default_value, + const char *group, const char *subgroup, const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = ST_HEX; + + result.size = sizeof(unsigned int); + + result.name = name; + result.name_hash = 0; + result.short_description = short_description; + result.group = group; + result.subgroup = subgroup; + result.parent_group = parent_group; + result.values = NULL; + + result.index = 0; + result.index_offset = 0; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = change_handler; + result.read_handler = read_handler; + result.action_start = setting_generic_action_start_default; + result.action_left = NULL; + result.action_right = NULL; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = setting_generic_action_ok_default; + result.action_select = setting_generic_action_ok_default; + result.get_string_representation = &setting_get_string_representation_hex; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = NULL; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + result.value.target.unsigned_integer = target; + result.original_value.unsigned_integer = *target; + result.default_value.unsigned_integer = default_value; + + return result; +} + +/** + * setting_bind_setting: + * @name : name of setting. + * @short_description : Short description of setting. + * @target : Target of bind setting. + * @idx : Index of bind setting. + * @idx_offset : Index offset of bind setting. + * @default_value : Default value (in bind format). + * @group : Group that the setting belongs to. + * @subgroup : Subgroup that the setting belongs to. + * + * Initializes a setting of type ST_BIND. + * + * Returns: setting of type ST_BIND. + **/ +static rarch_setting_t setting_bind_setting(const char* name, + const char* short_description, struct retro_keybind* target, + uint32_t idx, uint32_t idx_offset, + const struct retro_keybind* default_value, + const char *group, const char *subgroup, const char *parent_group) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = ST_BIND; + + result.size = 0; + + result.name = name; + result.name_hash = 0; + result.short_description = short_description; + result.group = group; + result.subgroup = subgroup; + result.parent_group = parent_group; + result.values = NULL; + + result.index = idx; + result.index_offset = idx_offset; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = NULL; + result.read_handler = NULL; + result.action_start = setting_bind_action_start; + result.action_left = NULL; + result.action_right = NULL; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = setting_bind_action_ok; + result.action_select = setting_bind_action_ok; + result.get_string_representation = &setting_get_string_representation_st_bind; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = NULL; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + result.value.target.keybind = target; + result.default_value.keybind = default_value; + + return result; +} + +static int setting_int_action_left_default(void *data, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + double min = setting_get_min(setting); + + if (!setting) + return -1; + + if (*setting->value.target.integer != min) + *setting->value.target.integer = + *setting->value.target.integer - setting->step; + + if (setting->enforce_minrange) + { + if (*setting->value.target.integer < min) + *setting->value.target.integer = min; + } + + + return 0; +} + +static int setting_bool_action_ok_default(void *data, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + setting_set_with_string_representation(setting, + *setting->value.target.boolean ? "false" : "true"); + + return 0; +} + +static int setting_bool_action_toggle_default(void *data, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + setting_set_with_string_representation(setting, + *setting->value.target.boolean ? "false" : "true"); + + return 0; +} + +int setting_string_action_start_generic(void *data) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + setting->value.target.string[0] = '\0'; + + return 0; +} + +/** + * setting_string_setting: + * @type : type of setting. + * @name : name of setting. + * @short_description : Short description of setting. + * @target : Target of string setting. + * @size : Size of string setting. + * @default_value : Default value (in string format). + * @empty : TODO/FIXME: ??? + * @group : Group that the setting belongs to. + * @subgroup : Subgroup that the setting belongs to. + * @change_handler : Function callback for change handler function pointer. + * @read_handler : Function callback for read handler function pointer. + * + * Initializes a string setting (of type @type). + * + * Returns: String setting of type @type. + **/ +static rarch_setting_t setting_string_setting(enum setting_type type, + const char* name, const char* short_description, char* target, + unsigned size, const char* default_value, const char *empty, + const char *group, const char *subgroup, const char *parent_group, + change_handler_t change_handler, + change_handler_t read_handler) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = type; + + result.size = size; + + result.name = name; + result.name_hash = 0; + result.short_description = short_description; + result.group = group; + result.subgroup = subgroup; + result.parent_group = parent_group; + result.values = NULL; + + result.index = 0; + result.index_offset = 0; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = change_handler; + result.read_handler = read_handler; + result.action_start = NULL; + result.action_left = NULL; + result.action_right = NULL; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = NULL; + result.action_select = NULL; + result.get_string_representation = &setting_get_string_representation_st_string; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = NULL; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + result.dir.empty_path = empty; + result.value.target.string = target; + result.default_value.string = default_value; + + switch (type) + { + case ST_DIR: + result.action_start = setting_string_action_start_generic; + result.browser_selection_type = ST_DIR; + result.get_string_representation = &setting_get_string_representation_st_dir; + break; + case ST_PATH: + result.action_start = setting_string_action_start_generic; + result.browser_selection_type = ST_PATH; + result.get_string_representation = &setting_get_string_representation_st_path; + break; + default: + break; + } + + return result; +} + +/** + * setting_string_setting_options: + * @type : type of settting. + * @name : name of setting. + * @short_description : Short description of setting. + * @target : Target of bind setting. + * @size : Size of string setting. + * @default_value : Default value. + * @empty : N/A. + * @values : Values, separated by a delimiter. + * @group : Group that the setting belongs to. + * @subgroup : Subgroup that the setting belongs to. + * @change_handler : Function callback for change handler function pointer. + * @read_handler : Function callback for read handler function pointer. + * + * Initializes a string options list setting. + * + * Returns: string option list setting. + **/ +static rarch_setting_t setting_string_setting_options(enum setting_type type, + const char* name, const char* short_description, char* target, + unsigned size, const char* default_value, + const char *empty, const char *values, + const char *group, const char *subgroup, const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t result = setting_string_setting(type, name, + short_description, target, size, default_value, empty, group, + subgroup, parent_group, change_handler, read_handler); + + result.parent_group = parent_group; + result.values = values; + return result; +} + +/** + * setting_subgroup_setting: + * @type : type of settting. + * @name : name of setting. + * @parent_name : group that the subgroup setting belongs to. + * + * Initializes a setting of type ST_SUBGROUP. + * + * Returns: setting of type ST_SUBGROUP. + **/ +static rarch_setting_t setting_subgroup_setting(enum setting_type type, + const char* name, const char *parent_name, const char *parent_group) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = type; + + result.size = 0; + + result.name = name; + result.name_hash = 0; + result.short_description = name; + result.group = parent_name; + result.parent_group = parent_group; + result.values = NULL; + result.subgroup = NULL; + + result.index = 0; + result.index_offset = 0; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = NULL; + result.read_handler = NULL; + result.action_start = NULL; + result.action_left = NULL; + result.action_right = NULL; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = NULL; + result.action_select = NULL; + result.get_string_representation = &setting_get_string_representation_default; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = NULL; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + return result; +} + +/** + * setting_bool_setting: + * @name : name of setting. + * @short_description : Short description of setting. + * @target : Target of bool setting. + * @default_value : Default value (in bool format). + * @off : String value for "Off" label. + * @on : String value for "On" label. + * @group : Group that the setting belongs to. + * @subgroup : Subgroup that the setting belongs to. + * @change_handler : Function callback for change handler function pointer. + * @read_handler : Function callback for read handler function pointer. + * + * Initializes a setting of type ST_BOOL. + * + * Returns: setting of type ST_BOOL. + **/ +static rarch_setting_t setting_bool_setting(const char* name, + const char* short_description, bool* target, bool default_value, + const char *off, const char *on, + const char *group, const char *subgroup, const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = ST_BOOL; + + result.size = sizeof(bool); + + result.name = name; + result.name_hash = name ? msg_hash_calculate(name) : 0; + result.short_description = short_description; + result.group = group; + result.subgroup = subgroup; + result.parent_group = parent_group; + result.values = NULL; + + result.index = 0; + result.index_offset = 0; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = change_handler; + result.read_handler = read_handler; + result.action_start = setting_generic_action_start_default; + result.action_left = setting_bool_action_toggle_default; + result.action_right = setting_bool_action_toggle_default; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = setting_bool_action_ok_default; + result.action_select = setting_generic_action_ok_default; + result.get_string_representation = &setting_get_string_representation_st_bool; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = NULL; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + result.value.target.boolean = target; + result.original_value.boolean = *target; + result.default_value.boolean = default_value; + result.boolean.off_label = off; + result.boolean.on_label = on; + + return result; +} + +/** + * setting_int_setting: + * @name : name of setting. + * @short_description : Short description of setting. + * @target : Target of signed integer setting. + * @default_value : Default value (in signed integer format). + * @group : Group that the setting belongs to. + * @subgroup : Subgroup that the setting belongs to. + * @change_handler : Function callback for change handler function pointer. + * @read_handler : Function callback for read handler function pointer. + * + * Initializes a setting of type ST_INT. + * + * Returns: setting of type ST_INT. + **/ +static rarch_setting_t setting_int_setting(const char* name, + const char* short_description, int* target, + int default_value, + const char *group, const char *subgroup, const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t result; + + result.enum_idx = MSG_UNKNOWN; + result.type = ST_INT; + + result.size = sizeof(int); + + result.name = name; + result.name_hash = name ? msg_hash_calculate(name) : 0; + result.short_description = short_description; + result.group = group; + result.subgroup = subgroup; + result.parent_group = parent_group; + result.values = NULL; + + result.index = 0; + result.index_offset = 0; + + result.min = 0.0; + result.max = 0.0; + + result.flags = 0; + result.free_flags = 0; + + result.change_handler = change_handler; + result.read_handler = read_handler; + result.action_start = setting_generic_action_start_default; + result.action_left = setting_int_action_left_default; + result.action_right = setting_int_action_right_default; + result.action_up = NULL; + result.action_down = NULL; + result.action_cancel = NULL; + result.action_ok = setting_generic_action_ok_default; + result.action_select = setting_generic_action_ok_default; + result.get_string_representation = &setting_get_string_representation_int; + + result.bind_type = 0; + result.browser_selection_type = ST_NONE; + result.step = 0.0f; + result.rounding_fraction = NULL; + result.enforce_minrange = false; + result.enforce_maxrange = false; + + result.value.target.integer = target; + result.original_value.integer = *target; + result.default_value.integer = default_value; + + return result; +} + +bool CONFIG_BOOL( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + bool *target, + const char *name, const char *SHORT, + bool default_value, + const char *off, const char *on, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, + change_handler_t read_handler, + uint32_t flags) +{ + rarch_setting_t value = setting_bool_setting (name, SHORT, target, + default_value, off, on, + group_info->name, subgroup_info->name, parent_group, + change_handler, read_handler); + + if (!settings_list_append(list, list_info)) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + if (flags != SD_FLAG_NONE) + settings_data_list_current_add_flags(list, list_info, flags); + return true; +} + +bool CONFIG_INT( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + int *target, + const char *name, const char *SHORT, + int default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t value = setting_int_setting (name, SHORT, target, default_value, + group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); + if (!(settings_list_append(list, list_info))) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + return true; +} + +bool CONFIG_UINT( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + unsigned int *target, + const char *name, const char *SHORT, + unsigned int default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t value = setting_uint_setting (name, SHORT, target, default_value, + group_info->name, + subgroup_info->name, parent_group, change_handler, read_handler); + if (!(settings_list_append(list, list_info))) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + return true; +} + +bool CONFIG_FLOAT( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + float *target, + const char *name, const char *SHORT, + float default_value, const char *rounding, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t value = setting_float_setting (name, SHORT, target, default_value, rounding, + group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); + if (!(settings_list_append(list, list_info))) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + return true; +} + +bool CONFIG_PATH( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + char *target, size_t len, + const char *name, const char *SHORT, + const char *default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t value = setting_string_setting(ST_PATH, name, SHORT, target, len, default_value, "", + group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); + if (!(settings_list_append(list, list_info))) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_EMPTY); + return true; +} + +bool CONFIG_DIR( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + char *target, size_t len, + const char *name, const char *SHORT, + const char *default_value, const char *empty, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t value = setting_string_setting(ST_DIR, name, SHORT, target, len, default_value, empty, + group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); + if (!(settings_list_append(list, list_info))) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + settings_data_list_current_add_flags( + list, + list_info, + SD_FLAG_ALLOW_EMPTY | SD_FLAG_PATH_DIR | SD_FLAG_BROWSER_ACTION); + return true; +} + +bool CONFIG_STRING( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + char *target, size_t len, + const char *name, const char *SHORT, + const char *default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t value = setting_string_setting(ST_STRING, name, SHORT, target, len, default_value, "", + group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); + if (!(settings_list_append(list, list_info))) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + return true; +} + +bool CONFIG_STRING_OPTIONS( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + char *target, size_t len, + const char *name, const char *SHORT, + const char *default_value, const char *values, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t value = setting_string_setting_options(ST_STRING_OPTIONS, name, SHORT, target, len, default_value, "", values, + group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); + if (!(settings_list_append(list, list_info))) + return false; + + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + /* Request values to be freed later */ + settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_VALUES); + + return true; +} + +bool CONFIG_HEX( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + unsigned int *target, + const char *name, const char *SHORT, + unsigned int default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + rarch_setting_t value = setting_hex_setting(name, SHORT, target, default_value, + group_info->name, subgroup_info->name, parent_group, change_handler, read_handler); + if (!(settings_list_append(list, list_info))) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + return true; +} + +/* Please strdup() NAME and SHORT */ +bool CONFIG_BIND( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + struct retro_keybind *target, + uint32_t player, uint32_t player_offset, + const char *name, const char *SHORT, + const struct retro_keybind *default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group) +{ + rarch_setting_t value = setting_bind_setting(name, SHORT, target, player, player_offset, default_value, + group_info->name, subgroup_info->name, parent_group); + if (!(settings_list_append(list, list_info))) + return false; + + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + /* Request name and short description to be freed later */ + settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT); + + return true; +} + +bool CONFIG_ACTION( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + const char *name, const char *SHORT, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group) +{ + rarch_setting_t value = setting_action_setting(name, SHORT, + group_info->name, subgroup_info->name, parent_group); + + if (!settings_list_append(list, list_info)) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + return true; +} + +bool START_GROUP(rarch_setting_t **list, rarch_setting_info_t *list_info, + rarch_setting_group_info_t *group_info, + const char *name, const char *parent_group) +{ + rarch_setting_t value = setting_group_setting (ST_GROUP, name, parent_group); + group_info->name = name; + if (!(settings_list_append(list, list_info))) + return false; + + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + return true; +} + +bool END_GROUP(rarch_setting_t **list, rarch_setting_info_t *list_info, + const char *parent_group) +{ + rarch_setting_t value = setting_group_setting (ST_END_GROUP, 0, parent_group); + if (!(settings_list_append(list, list_info))) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + return true; +} + +bool START_SUB_GROUP(rarch_setting_t **list, + rarch_setting_info_t *list_info, const char *name, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group) +{ + rarch_setting_t value = setting_subgroup_setting (ST_SUB_GROUP, name, group_info->name, parent_group); + + subgroup_info->name = name; + + if (!(settings_list_append(list, list_info))) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + return true; +} + +bool END_SUB_GROUP( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + const char *parent_group) +{ + rarch_setting_t value = setting_group_setting (ST_END_SUB_GROUP, 0, parent_group); + if (!(settings_list_append(list, list_info))) + return false; + if (value.name) + value.name_hash = msg_hash_calculate(value.name); + (*list)[list_info->index++] = value; + return true; +} diff --git a/setting_list.h b/setting_list.h new file mode 100644 index 0000000000..b33596e49d --- /dev/null +++ b/setting_list.h @@ -0,0 +1,365 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2011-2016 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#ifndef __SETTING_LIST_H +#define __SETTING_LIST_H + +#include + +#include +#include + +#include "command.h" +#include "msg_hash.h" + +RETRO_BEGIN_DECLS + +enum setting_type +{ + ST_NONE = 0, + ST_ACTION, + ST_BOOL, + ST_INT, + ST_UINT, + ST_FLOAT, + ST_PATH, + ST_DIR, + ST_STRING, + ST_STRING_OPTIONS, + ST_HEX, + ST_BIND, + ST_GROUP, + ST_SUB_GROUP, + ST_END_GROUP, + ST_END_SUB_GROUP +}; + +enum setting_flags +{ + SD_FLAG_NONE = 0, + SD_FLAG_PATH_DIR = (1 << 0), + SD_FLAG_PATH_FILE = (1 << 1), + SD_FLAG_ALLOW_EMPTY = (1 << 2), + SD_FLAG_HAS_RANGE = (1 << 3), + SD_FLAG_ALLOW_INPUT = (1 << 4), + SD_FLAG_IS_DRIVER = (1 << 5), + SD_FLAG_EXIT = (1 << 6), + SD_FLAG_CMD_APPLY_AUTO = (1 << 7), + SD_FLAG_BROWSER_ACTION = (1 << 8), + SD_FLAG_ADVANCED = (1 << 9) +}; + +enum settings_free_flags +{ + SD_FREE_FLAG_VALUES = (1 << 0), + SD_FREE_FLAG_NAME = (1 << 1), + SD_FREE_FLAG_SHORT = (1 << 2) +}; + +typedef struct rarch_setting rarch_setting_t; +typedef struct rarch_setting_info rarch_setting_info_t; +typedef struct rarch_setting_group_info rarch_setting_group_info_t; + +typedef void (*change_handler_t )(void *data); +typedef int (*action_left_handler_t )(void *data, bool wraparound); +typedef int (*action_right_handler_t )(void *data, bool wraparound); +typedef int (*action_up_handler_t )(void *data); +typedef int (*action_down_handler_t )(void *data); +typedef int (*action_start_handler_t )(void *data); +typedef int (*action_cancel_handler_t )(void *data); +typedef int (*action_ok_handler_t )(void *data, bool wraparound); +typedef int (*action_select_handler_t )(void *data, bool wraparound); +typedef void (*get_string_representation_t )(void *data, char *s, size_t len); + +struct rarch_setting_group_info +{ + const char *name; +}; + +struct rarch_setting +{ + enum msg_hash_enums enum_idx; + enum setting_type type; + + uint32_t size; + + const char *name; + uint32_t name_hash; + const char *short_description; + const char *group; + const char *subgroup; + const char *parent_group; + const char *values; + + uint32_t index; + unsigned index_offset; + + double min; + double max; + + uint64_t flags; + uint64_t free_flags; + + change_handler_t change_handler; + change_handler_t read_handler; + action_start_handler_t action_start; + action_left_handler_t action_left; + action_right_handler_t action_right; + action_up_handler_t action_up; + action_down_handler_t action_down; + action_cancel_handler_t action_cancel; + action_ok_handler_t action_ok; + action_select_handler_t action_select; + get_string_representation_t get_string_representation; + + union + { + bool boolean; + int integer; + unsigned int unsigned_integer; + float fraction; + const char *string; + const struct retro_keybind *keybind; + } default_value; + + struct + { + union + { + bool *boolean; + int *integer; + unsigned int *unsigned_integer; + float *fraction; + char *string; + struct retro_keybind *keybind; + } target; + } value; + + union + { + bool boolean; + int integer; + unsigned int unsigned_integer; + float fraction; + } original_value; + + struct + { + const char *empty_path; + } dir; + + struct + { + enum event_command idx; + bool triggered; + } cmd_trigger; + + struct + { + const char *off_label; + const char *on_label; + } boolean; + + unsigned bind_type; + enum setting_type browser_selection_type; + float step; + const char *rounding_fraction; + bool enforce_minrange; + bool enforce_maxrange; +}; + +struct rarch_setting_info +{ + int index; + int size; +}; + +bool START_GROUP(rarch_setting_t **list, rarch_setting_info_t *list_info, + rarch_setting_group_info_t *group_info, + const char *name, const char *parent_group); + +bool END_GROUP(rarch_setting_t **list, rarch_setting_info_t *list_info, + const char *parent_group); + +bool START_SUB_GROUP(rarch_setting_t **list, + rarch_setting_info_t *list_info, const char *name, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group); + +bool END_SUB_GROUP( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + const char *parent_group); + +bool CONFIG_ACTION( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + const char *name, const char *SHORT, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group); + +bool CONFIG_BOOL( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + bool *target, + const char *name, const char *SHORT, + bool default_value, + const char *off, const char *on, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, + change_handler_t read_handler, + uint32_t flags + ); + +bool CONFIG_INT( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + int *target, + const char *name, const char *SHORT, + int default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler); + +bool CONFIG_UINT( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + unsigned int *target, + const char *name, const char *SHORT, + unsigned int default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler); + +bool CONFIG_FLOAT( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + float *target, + const char *name, const char *SHORT, + float default_value, const char *rounding, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler); + +bool CONFIG_PATH( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + char *target, size_t len, + const char *name, const char *SHORT, + const char *default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler); + +bool CONFIG_DIR( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + char *target, size_t len, + const char *name, const char *SHORT, + const char *default_value, const char *empty, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler); + +bool CONFIG_STRING( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + char *target, size_t len, + const char *name, const char *SHORT, + const char *default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler); + +bool CONFIG_STRING_OPTIONS( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + char *target, size_t len, + const char *name, const char *SHORT, + const char *default_value, const char *values, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler); + +bool CONFIG_HEX( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + unsigned int *target, + const char *name, const char *SHORT, + unsigned int default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler); + +/* Please strdup() NAME and SHORT */ +bool CONFIG_BIND( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + struct retro_keybind *target, + uint32_t player, uint32_t player_offset, + const char *name, const char *SHORT, + const struct retro_keybind *default_value, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group); + +/** + * setting_set_with_string_representation: + * @setting : pointer to setting + * @value : value for the setting (string) + * + * Set a settings' value with a string. It is assumed + * that the string has been properly formatted. + **/ +int setting_set_with_string_representation( + rarch_setting_t* setting, const char *value); + +unsigned setting_get_index_offset(rarch_setting_t *setting); + +uint32_t setting_get_index(rarch_setting_t *setting); + +uint64_t setting_get_flags(rarch_setting_t *setting); + +double setting_get_min(rarch_setting_t *setting); + +double setting_get_max(rarch_setting_t *setting); + +unsigned setting_get_bind_type(rarch_setting_t *setting); + +enum setting_type setting_get_type(rarch_setting_t *setting); + +int setting_string_action_start_generic(void *data); + +int setting_generic_action_ok_default(void *data, bool wraparound); + +int setting_generic_action_start_default(void *data); + +rarch_setting_t setting_terminator_setting(void); + +RETRO_END_DECLS + +#endif