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)
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
* 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)
{
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))
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)
{
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)
{
rarch_setting_t *setting = menu_entries_get_setting(i);
bool *ptr = (bool*)setting_get_ptr(setting);
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;
bool *ptr = setting ? (bool*)setting->value.target.boolean : NULL;
if (!ptr)
return 0;
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)
{
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;
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)
{
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);
}
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)
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)
{
rarch_setting_t *setting = menu_entries_get_setting(i);
struct retro_keybind *keybind = (struct retro_keybind*)
setting_get_ptr(setting);
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;
struct retro_keybind *keybind = setting ? (struct retro_keybind*)setting->value.target.keybind : NULL;
if (keybind)
keybind->key = (enum retro_key)value;
}
void menu_entry_bind_joykey_set(uint32_t i, int32_t value)
{
rarch_setting_t *setting = menu_entries_get_setting(i);
struct retro_keybind *keybind = (struct retro_keybind*)
setting_get_ptr(setting);
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;
struct retro_keybind *keybind = setting ? (struct retro_keybind*)setting->value.target.keybind : NULL;
if (keybind)
keybind->joykey = value;
}
void menu_entry_bind_joyaxis_set(uint32_t i, int32_t value)
{
rarch_setting_t *setting = menu_entries_get_setting(i);
struct retro_keybind *keybind = (struct retro_keybind*)
setting_get_ptr(setting);
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;
struct retro_keybind *keybind = setting ? (struct retro_keybind*)setting->value.target.keybind : NULL;
if (keybind)
keybind->joyaxis = value;
}
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))
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)
{
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;
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)
{
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;
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)
{
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;
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)
{
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);
}
@ -340,7 +371,10 @@ bool menu_entry_is_password(menu_entry_t *entry)
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;
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)
{
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;
return (float)min;
}
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;
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();
}
/* 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)
{
if (str && *str)
@ -401,28 +434,24 @@ static void setting_add_special_callbacks(
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)
{
if (!list || !*list || !list_info)
return false;
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);
unsigned new_size = list_info->size * 2;
rarch_setting_t *list_settings = (rarch_setting_t*)
realloc(*list, sizeof(rarch_setting_t) * new_size);
if (!list_settings)
return false;
list_info->size = new_size;
*list = list_settings;
}
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)
{
if (!setting)
@ -5203,37 +5232,6 @@ int menu_setting_set(unsigned type, unsigned action, bool wraparound)
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 : 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);
rarch_setting_t *list = (rarch_setting_t*)calloc(
list_info->size, sizeof(*list));
rarch_setting_t **list_ptr = NULL;
if (!list)
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);
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(
rarch_setting_t *setting);
void *setting_get_ptr(rarch_setting_t *setting);
void general_write_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)
{
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)
return -1;