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