This commit is contained in:
twinaphex 2019-05-18 21:07:04 +02:00
parent 59c502d0f4
commit ba3ee2192a
4 changed files with 130 additions and 91 deletions

View File

@ -47,15 +47,6 @@ struct menu_list
#define menu_entries_need_refresh() ((!menu_entries_nonblocking_refresh) && menu_entries_need_refresh) #define menu_entries_need_refresh() ((!menu_entries_nonblocking_refresh) && menu_entries_need_refresh)
static rarch_setting_t *menu_entries_get_setting(uint32_t i)
{
file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
return (cbs) ? cbs->setting : NULL;
}
/* This file provides an abstraction of the currently displayed /* This file provides an abstraction of the currently displayed
* menu. * menu.
* *
@ -70,12 +61,19 @@ static rarch_setting_t *menu_entries_get_setting(uint32_t i)
enum menu_entry_type menu_entry_get_type(uint32_t i) enum menu_entry_type menu_entry_get_type(uint32_t i)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = NULL;
rarch_setting_t *setting = NULL;
/* XXX Really a special kind of ST_ACTION, but this should be changed */ /* FIXME/TODO - XXX Really a special kind of ST_ACTION,
* but this should be changed */
if (menu_setting_ctl(MENU_SETTING_CTL_IS_OF_PATH_TYPE, (void*)setting)) if (menu_setting_ctl(MENU_SETTING_CTL_IS_OF_PATH_TYPE, (void*)setting))
return MENU_ENTRY_PATH; return MENU_ENTRY_PATH;
cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
setting = cbs ? cbs->setting : NULL;
if (setting) if (setting)
{ {
switch (setting_get_type(setting)) switch (setting_get_type(setting))
@ -207,8 +205,11 @@ unsigned menu_entry_get_type_new(menu_entry_t *entry)
uint32_t menu_entry_get_bool_value(uint32_t i) uint32_t menu_entry_get_bool_value(uint32_t i)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
bool *ptr = (bool*)setting_get_ptr(setting); menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
bool *ptr = setting ? (bool*)setting->value.target.boolean : NULL;
if (!ptr) if (!ptr)
return 0; return 0;
return *ptr; return *ptr;
@ -216,7 +217,10 @@ uint32_t menu_entry_get_bool_value(uint32_t i)
struct string_list *menu_entry_enum_values(uint32_t i) struct string_list *menu_entry_enum_values(uint32_t i)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
const char *values = setting->values; const char *values = setting->values;
if (!values) if (!values)
@ -226,13 +230,19 @@ struct string_list *menu_entry_enum_values(uint32_t i)
void menu_entry_enum_set_value_with_string(uint32_t i, const char *s) void menu_entry_enum_set_value_with_string(uint32_t i, const char *s)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
setting_set_with_string_representation(setting, s); setting_set_with_string_representation(setting, s);
} }
int32_t menu_entry_bind_index(uint32_t i) int32_t menu_entry_bind_index(uint32_t i)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
if (setting) if (setting)
return setting->index - 1; return setting->index - 1;
@ -241,34 +251,43 @@ int32_t menu_entry_bind_index(uint32_t i)
void menu_entry_bind_key_set(uint32_t i, int32_t value) void menu_entry_bind_key_set(uint32_t i, int32_t value)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
struct retro_keybind *keybind = (struct retro_keybind*) menu_file_list_cbs_t *cbs = selection_buf ?
setting_get_ptr(setting); (menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
struct retro_keybind *keybind = setting ? (struct retro_keybind*)setting->value.target.keybind : NULL;
if (keybind) if (keybind)
keybind->key = (enum retro_key)value; keybind->key = (enum retro_key)value;
} }
void menu_entry_bind_joykey_set(uint32_t i, int32_t value) void menu_entry_bind_joykey_set(uint32_t i, int32_t value)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
struct retro_keybind *keybind = (struct retro_keybind*) menu_file_list_cbs_t *cbs = selection_buf ?
setting_get_ptr(setting); (menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
struct retro_keybind *keybind = setting ? (struct retro_keybind*)setting->value.target.keybind : NULL;
if (keybind) if (keybind)
keybind->joykey = value; keybind->joykey = value;
} }
void menu_entry_bind_joyaxis_set(uint32_t i, int32_t value) void menu_entry_bind_joyaxis_set(uint32_t i, int32_t value)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
struct retro_keybind *keybind = (struct retro_keybind*) menu_file_list_cbs_t *cbs = selection_buf ?
setting_get_ptr(setting); (menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
struct retro_keybind *keybind = setting ? (struct retro_keybind*)setting->value.target.keybind : NULL;
if (keybind) if (keybind)
keybind->joyaxis = value; keybind->joyaxis = value;
} }
void menu_entry_pathdir_selected(uint32_t i) void menu_entry_pathdir_selected(uint32_t i)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
if (menu_setting_ctl(MENU_SETTING_CTL_IS_OF_PATH_TYPE, (void*)setting)) if (menu_setting_ctl(MENU_SETTING_CTL_IS_OF_PATH_TYPE, (void*)setting))
menu_setting_ctl(MENU_SETTING_CTL_ACTION_RIGHT, setting); menu_setting_ctl(MENU_SETTING_CTL_ACTION_RIGHT, setting);
@ -276,7 +295,10 @@ void menu_entry_pathdir_selected(uint32_t i)
bool menu_entry_pathdir_allow_empty(uint32_t i) bool menu_entry_pathdir_allow_empty(uint32_t i)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
uint64_t flags = setting->flags; uint64_t flags = setting->flags;
return flags & SD_FLAG_ALLOW_EMPTY; return flags & SD_FLAG_ALLOW_EMPTY;
@ -284,7 +306,10 @@ bool menu_entry_pathdir_allow_empty(uint32_t i)
uint32_t menu_entry_pathdir_for_directory(uint32_t i) uint32_t menu_entry_pathdir_for_directory(uint32_t i)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
uint64_t flags = setting->flags; uint64_t flags = setting->flags;
return flags & SD_FLAG_PATH_DIR; return flags & SD_FLAG_PATH_DIR;
@ -292,7 +317,10 @@ uint32_t menu_entry_pathdir_for_directory(uint32_t i)
void menu_entry_pathdir_extensions(uint32_t i, char *s, size_t len) void menu_entry_pathdir_extensions(uint32_t i, char *s, size_t len)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
const char *values = setting->values; const char *values = setting->values;
if (!values) if (!values)
@ -329,7 +357,10 @@ void menu_entry_get_value(menu_entry_t *entry, char *s, size_t len)
void menu_entry_set_value(uint32_t i, const char *s) void menu_entry_set_value(uint32_t i, const char *s)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
setting_set_with_string_representation(setting, s); setting_set_with_string_representation(setting, s);
} }
@ -340,7 +371,10 @@ bool menu_entry_is_password(menu_entry_t *entry)
uint32_t menu_entry_num_has_range(uint32_t i) uint32_t menu_entry_num_has_range(uint32_t i)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
uint64_t flags = setting->flags; uint64_t flags = setting->flags;
return (flags & SD_FLAG_HAS_RANGE); return (flags & SD_FLAG_HAS_RANGE);
@ -348,14 +382,20 @@ uint32_t menu_entry_num_has_range(uint32_t i)
float menu_entry_num_min(uint32_t i) float menu_entry_num_min(uint32_t i)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
double min = setting->min; double min = setting->min;
return (float)min; return (float)min;
} }
float menu_entry_num_max(uint32_t i) float menu_entry_num_max(uint32_t i)
{ {
rarch_setting_t *setting = menu_entries_get_setting(i); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
menu_file_list_cbs_t *cbs = selection_buf ?
(menu_file_list_cbs_t*)selection_buf->list[i].actiondata : NULL;
rarch_setting_t *setting = cbs ? cbs->setting : NULL;
double max = setting->max; double max = setting->max;
return (float)max; return (float)max;
} }

View File

@ -284,6 +284,39 @@ static void menu_input_st_uint_cb(void *userdata, const char *str)
menu_input_dialog_end(); menu_input_dialog_end();
} }
/* TODO/FIXME - get rid of this eventually */
static void *setting_get_ptr(rarch_setting_t *setting)
{
if (!setting)
return NULL;
switch (setting_get_type(setting))
{
case ST_BOOL:
return setting->value.target.boolean;
case ST_INT:
return setting->value.target.integer;
case ST_UINT:
return setting->value.target.unsigned_integer;
case ST_SIZE:
return setting->value.target.sizet;
case ST_FLOAT:
return setting->value.target.fraction;
case ST_BIND:
return setting->value.target.keybind;
case ST_STRING:
case ST_STRING_OPTIONS:
case ST_PATH:
case ST_DIR:
return setting->value.target.string;
default:
break;
}
return NULL;
}
static void menu_input_st_hex_cb(void *userdata, const char *str) static void menu_input_st_hex_cb(void *userdata, const char *str)
{ {
if (str && *str) if (str && *str)
@ -401,28 +434,24 @@ static void setting_add_special_callbacks(
setting_add_special_callbacks(a, b, c); \ setting_add_special_callbacks(a, b, c); \
} }
static bool settings_list_append(rarch_setting_t **list, static bool settings_list_append_internal(
rarch_setting_t **list,
rarch_setting_info_t *list_info) rarch_setting_info_t *list_info)
{ {
if (!list || !*list || !list_info) unsigned new_size = list_info->size * 2;
return false; rarch_setting_t *list_settings = (rarch_setting_t*)
realloc(*list, sizeof(rarch_setting_t) * new_size);
if (list_info->index == list_info->size)
{
rarch_setting_t *list_settings = NULL;
list_info->size *= 2;
list_settings = (rarch_setting_t*)
realloc(*list, sizeof(rarch_setting_t) * list_info->size);
if (!list_settings) if (!list_settings)
return false; return false;
list_info->size = new_size;
*list = list_settings; *list = list_settings;
}
return true; return true;
} }
#define settings_list_append(a, b) ((a && *a && b) ? ((((b)->index == (b)->size)) ? settings_list_append_internal(a, b) : true) : false)
unsigned setting_get_bind_type(rarch_setting_t *setting) unsigned setting_get_bind_type(rarch_setting_t *setting)
{ {
if (!setting) if (!setting)
@ -5203,37 +5232,6 @@ int menu_setting_set(unsigned type, unsigned action, bool wraparound)
return ret; return ret;
} }
void *setting_get_ptr(rarch_setting_t *setting)
{
if (!setting)
return NULL;
switch (setting_get_type(setting))
{
case ST_BOOL:
return setting->value.target.boolean;
case ST_INT:
return setting->value.target.integer;
case ST_UINT:
return setting->value.target.unsigned_integer;
case ST_SIZE:
return setting->value.target.sizet;
case ST_FLOAT:
return setting->value.target.fraction;
case ST_BIND:
return setting->value.target.keybind;
case ST_STRING:
case ST_STRING_OPTIONS:
case ST_PATH:
case ST_DIR:
return setting->value.target.string;
default:
break;
}
return NULL;
}
/** /**
* setting_get_string_representation: * setting_get_string_representation:
* @setting : pointer to setting * @setting : pointer to setting
@ -14701,6 +14699,7 @@ static rarch_setting_t *menu_setting_new_internal(rarch_setting_info_t *list_inf
const char *root = msg_hash_to_str(MENU_ENUM_LABEL_MAIN_MENU); const char *root = msg_hash_to_str(MENU_ENUM_LABEL_MAIN_MENU);
rarch_setting_t *list = (rarch_setting_t*)calloc( rarch_setting_t *list = (rarch_setting_t*)calloc(
list_info->size, sizeof(*list)); list_info->size, sizeof(*list));
rarch_setting_t **list_ptr = NULL;
if (!list) if (!list)
return NULL; return NULL;
@ -14714,7 +14713,9 @@ static rarch_setting_t *menu_setting_new_internal(rarch_setting_info_t *list_inf
} }
} }
if (!settings_list_append(&list, list_info)) list_ptr = &list;
if (!settings_list_append(list_ptr, list_info))
{ {
free(list); free(list);
return NULL; return NULL;

View File

@ -127,8 +127,6 @@ int menu_action_handle_setting(rarch_setting_t *setting,
enum setting_type menu_setting_get_browser_selection_type( enum setting_type menu_setting_get_browser_selection_type(
rarch_setting_t *setting); rarch_setting_t *setting);
void *setting_get_ptr(rarch_setting_t *setting);
void general_write_handler(rarch_setting_t *setting); void general_write_handler(rarch_setting_t *setting);
void general_read_handler(rarch_setting_t *setting); void general_read_handler(rarch_setting_t *setting);

View File

@ -105,7 +105,7 @@ static int menu_input_key_bind_set_mode_common(
switch (state) switch (state)
{ {
case MENU_INPUT_BINDS_CTL_BIND_SINGLE: case MENU_INPUT_BINDS_CTL_BIND_SINGLE:
keybind = (struct retro_keybind*)setting_get_ptr(setting); keybind = (struct retro_keybind*)setting->value.target.keybind;
if (!keybind) if (!keybind)
return -1; return -1;