From dcedc49b21d403bd51d061cb40810773b1dda7d3 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 5 Jun 2015 20:04:19 +0200 Subject: [PATCH] Split up action_toggle into action_left/action_right --- menu/menu_entry.c | 2 +- menu/menu_setting.c | 425 +++++++++++++++++++++++++------------------- menu/menu_setting.h | 6 +- 3 files changed, 243 insertions(+), 190 deletions(-) diff --git a/menu/menu_entry.c b/menu/menu_entry.c index 47a9b7e3fc..6d058c440e 100644 --- a/menu/menu_entry.c +++ b/menu/menu_entry.c @@ -281,7 +281,7 @@ void menu_entry_pathdir_selected(uint32_t i) { rarch_setting_t *setting = menu_entry_get_setting(i); if (menu_setting_is_of_path_type(setting)) - setting->action_toggle( setting, MENU_ACTION_RIGHT, false); + setting->action_right( setting, MENU_ACTION_RIGHT, false); } bool menu_entry_pathdir_allow_empty(uint32_t i) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 3cdcb18bf3..9e32f0cc2d 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -214,9 +214,12 @@ static int setting_handler(rarch_setting_t *setting, unsigned action) return setting->action_down(setting, action); break; case MENU_ACTION_LEFT: + if (setting->action_left) + return setting->action_left(setting, action, true); + break; case MENU_ACTION_RIGHT: - if (setting->action_toggle) - return setting->action_toggle(setting, action, true); + if (setting->action_right) + return setting->action_right(setting, action, true); break; case MENU_ACTION_OK: if (setting->action_ok) @@ -743,18 +746,7 @@ static int setting_bind_action_start(void *data) ******* ACTION TOGGLE CALLBACK FUNCTIONS ******* **/ -/** - * setting_action_toggle_analog_dpad_mode - * @data : pointer to setting - * @action : toggle action value. Can be either one of : - * MENU_ACTION_RIGHT | MENU_ACTION_LEFT - * - * Function callback for 'Analog D-Pad Mode' action's 'Action Toggle' - * function pointer. - * - * Returns: 0 on success, -1 on error. - **/ -static int setting_action_toggle_analog_dpad_mode(void *data, +static int setting_action_left_analog_dpad_mode(void *data, unsigned action, bool wraparound) { unsigned port = 0; @@ -766,35 +758,33 @@ static int setting_action_toggle_analog_dpad_mode(void *data, port = setting->index_offset; - switch (action) - { - case MENU_ACTION_LEFT: - settings->input.analog_dpad_mode[port] = - (settings->input.analog_dpad_mode - [port] + ANALOG_DPAD_LAST - 1) % ANALOG_DPAD_LAST; - break; - case MENU_ACTION_RIGHT: - settings->input.analog_dpad_mode[port] = - (settings->input.analog_dpad_mode[port] + 1) - % ANALOG_DPAD_LAST; - break; - } + settings->input.analog_dpad_mode[port] = + (settings->input.analog_dpad_mode + [port] + ANALOG_DPAD_LAST - 1) % ANALOG_DPAD_LAST; return 0; } -/** - * setting_action_toggle_libretro_device_type - * @data : pointer to setting - * @action : toggle action value. Can be either one of : - * MENU_ACTION_RIGHT | MENU_ACTION_LEFT - * - * Function callback for 'Libretro Device Type' action's 'Action Toggle' - * function pointer. - * - * Returns: 0 on success, -1 on error. - **/ -static int setting_action_toggle_libretro_device_type( +static int setting_action_right_analog_dpad_mode(void *data, + unsigned action, bool wraparound) +{ + unsigned port = 0; + rarch_setting_t *setting = (rarch_setting_t*)data; + settings_t *settings = config_get_ptr(); + + if (!setting) + return -1; + + port = setting->index_offset; + + settings->input.analog_dpad_mode[port] = + (settings->input.analog_dpad_mode[port] + 1) + % ANALOG_DPAD_LAST; + + return 0; +} + +static int setting_action_left_libretro_device_type( void *data, unsigned action, bool wraparound) { unsigned current_device, current_idx, i, devices[128], @@ -843,39 +833,74 @@ static int setting_action_toggle_libretro_device_type( } } - switch (action) - { - case MENU_ACTION_LEFT: - current_device = devices - [(current_idx + types - 1) % types]; + current_device = devices + [(current_idx + types - 1) % types]; - settings->input.libretro_device[port] = current_device; - pretro_set_controller_port_device(port, current_device); - break; - case MENU_ACTION_RIGHT: - current_device = devices - [(current_idx + 1) % types]; - - settings->input.libretro_device[port] = current_device; - pretro_set_controller_port_device(port, current_device); - break; - } + settings->input.libretro_device[port] = current_device; + pretro_set_controller_port_device(port, current_device); return 0; } -/** - * setting_action_toggle_savestates - * @data : pointer to setting - * @action : toggle action value. Can be either one of : - * MENU_ACTION_RIGHT | MENU_ACTION_LEFT - * - * Function callback for 'SaveStates' action's 'Action Toggle' - * function pointer. - * - * Returns: 0 on success, -1 on error. - **/ -static int setting_action_toggle_savestates( +static int setting_action_right_libretro_device_type( + void *data, unsigned action, bool wraparound) +{ + unsigned current_device, current_idx, i, devices[128], + types = 0, port = 0; + const struct retro_controller_info *desc = NULL; + rarch_setting_t *setting = (rarch_setting_t*)data; + settings_t *settings = config_get_ptr(); + global_t *global = global_get_ptr(); + + if (!setting) + return -1; + + port = setting->index_offset; + + devices[types++] = RETRO_DEVICE_NONE; + devices[types++] = RETRO_DEVICE_JOYPAD; + + /* Only push RETRO_DEVICE_ANALOG as default if we use an + * older core which doesn't use SET_CONTROLLER_INFO. */ + if (!global->system.num_ports) + devices[types++] = RETRO_DEVICE_ANALOG; + + if (port < global->system.num_ports) + desc = &global->system.ports[port]; + + if (desc) + { + for (i = 0; i < desc->num_types; i++) + { + unsigned id = desc->types[i].id; + if (types < ARRAY_SIZE(devices) && + id != RETRO_DEVICE_NONE && + id != RETRO_DEVICE_JOYPAD) + devices[types++] = id; + } + } + + current_device = settings->input.libretro_device[port]; + current_idx = 0; + for (i = 0; i < types; i++) + { + if (current_device == devices[i]) + { + current_idx = i; + break; + } + } + + current_device = devices + [(current_idx + 1) % types]; + + settings->input.libretro_device[port] = current_device; + pretro_set_controller_port_device(port, current_device); + + return 0; +} + +static int setting_action_left_savestates( void *data, unsigned action, bool wraparound) { rarch_setting_t *setting = (rarch_setting_t*)data; @@ -884,33 +909,28 @@ static int setting_action_toggle_savestates( if (!setting) return -1; - switch (action) - { - case MENU_ACTION_LEFT: - /* Slot -1 is (auto) slot. */ - if (settings->state_slot >= 0) - settings->state_slot--; - break; - case MENU_ACTION_RIGHT: - settings->state_slot++; - break; - } + /* Slot -1 is (auto) slot. */ + if (settings->state_slot >= 0) + settings->state_slot--; return 0; } -/** - * setting_action_toggle_bind_device - * @data : pointer to setting - * @action : toggle action value. Can be either one of : - * MENU_ACTION_RIGHT | MENU_ACTION_LEFT - * - * Function callback for 'Bind Device' action's 'Action Toggle' - * function pointer. - * - * Returns: 0 on success, -1 on error. - **/ -static int setting_action_toggle_bind_device(void *data, +static int setting_action_right_savestates( + void *data, unsigned action, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + settings_t *settings = config_get_ptr(); + + if (!setting) + return -1; + + settings->state_slot++; + + return 0; +} + +static int setting_action_left_bind_device(void *data, unsigned action, bool wraparound) { unsigned *p = NULL; @@ -922,19 +942,28 @@ static int setting_action_toggle_bind_device(void *data, p = &settings->input.joypad_map[setting->index_offset]; - switch (action) - { - case MENU_ACTION_LEFT: - if ((*p) >= settings->input.max_users) - *p = settings->input.max_users - 1; - else if ((*p) > 0) - (*p)--; - break; - case MENU_ACTION_RIGHT: - if (*p < settings->input.max_users) - (*p)++; - break; - } + if ((*p) >= settings->input.max_users) + *p = settings->input.max_users - 1; + else if ((*p) > 0) + (*p)--; + + return 0; +} + +static int setting_action_right_bind_device(void *data, + unsigned action, bool wraparound) +{ + unsigned *p = NULL; + rarch_setting_t *setting = (rarch_setting_t*)data; + settings_t *settings = config_get_ptr(); + + if (!setting) + return -1; + + p = &settings->input.joypad_map[setting->index_offset]; + + if (*p < settings->input.max_users) + (*p)++; return 0; } @@ -947,18 +976,12 @@ static int setting_bool_action_toggle_default(void *data, if (!setting) return -1; - switch (action) - { - case MENU_ACTION_LEFT: - case MENU_ACTION_RIGHT: - *setting->value.boolean = !(*setting->value.boolean); - break; - } + *setting->value.boolean = !(*setting->value.boolean); return 0; } -static int setting_uint_action_toggle_default(void *data, +static int setting_uint_action_left_default(void *data, unsigned action, bool wraparound) { rarch_setting_t *setting = (rarch_setting_t*)data; @@ -966,36 +989,40 @@ static int setting_uint_action_toggle_default(void *data, if (!setting) return -1; - switch (action) + if (*setting->value.unsigned_integer != setting->min) + *setting->value.unsigned_integer = + *setting->value.unsigned_integer - setting->step; + + if (setting->enforce_minrange) { - case MENU_ACTION_LEFT: - if (*setting->value.unsigned_integer != setting->min) - *setting->value.unsigned_integer = - *setting->value.unsigned_integer - setting->step; - - if (setting->enforce_minrange) - { - if (*setting->value.unsigned_integer < setting->min) - *setting->value.unsigned_integer = setting->min; - } - break; - - case MENU_ACTION_RIGHT: - *setting->value.unsigned_integer = - *setting->value.unsigned_integer + setting->step; - - if (setting->enforce_maxrange) - { - if (*setting->value.unsigned_integer > setting->max) - *setting->value.unsigned_integer = setting->max; - } - break; + if (*setting->value.unsigned_integer < setting->min) + *setting->value.unsigned_integer = setting->min; } return 0; } -static int setting_fraction_action_toggle_default( +static int setting_uint_action_right_default(void *data, + unsigned action, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + *setting->value.unsigned_integer = + *setting->value.unsigned_integer + setting->step; + + if (setting->enforce_maxrange) + { + if (*setting->value.unsigned_integer > setting->max) + *setting->value.unsigned_integer = setting->max; + } + + return 0; +} + +static int setting_fraction_action_left_default( void *data, unsigned action, bool wraparound) { rarch_setting_t *setting = (rarch_setting_t*)data; @@ -1003,35 +1030,39 @@ static int setting_fraction_action_toggle_default( if (!setting) return -1; - switch (action) + *setting->value.fraction = + *setting->value.fraction - setting->step; + + if (setting->enforce_minrange) { - case MENU_ACTION_LEFT: - *setting->value.fraction = - *setting->value.fraction - setting->step; - - if (setting->enforce_minrange) - { - if (*setting->value.fraction < setting->min) - *setting->value.fraction = setting->min; - } - break; - - case MENU_ACTION_RIGHT: - *setting->value.fraction = - *setting->value.fraction + setting->step; - - if (setting->enforce_maxrange) - { - if (*setting->value.fraction > setting->max) - *setting->value.fraction = setting->max; - } - break; + if (*setting->value.fraction < setting->min) + *setting->value.fraction = setting->min; } return 0; } -static int setting_string_action_toggle_driver(void *data, +static int setting_fraction_action_right_default( + void *data, unsigned action, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + *setting->value.fraction = + *setting->value.fraction + setting->step; + + if (setting->enforce_maxrange) + { + if (*setting->value.fraction > setting->max) + *setting->value.fraction = setting->max; + } + + return 0; +} + +static int setting_string_action_left_driver(void *data, unsigned action, bool wraparound) { rarch_setting_t *setting = (rarch_setting_t*)data; @@ -1039,24 +1070,29 @@ static int setting_string_action_toggle_driver(void *data, if (!setting) return -1; - switch (action) + if (!find_prev_driver(setting->name, setting->value.string, setting->size)) { - case MENU_ACTION_LEFT: - if (!find_prev_driver(setting->name, setting->value.string, setting->size)) - { #if 0 - if (wraparound) - find_last_driver(setting->name, setting->value.string, setting->size); + if (wraparound) + find_last_driver(setting->name, setting->value.string, setting->size); #endif - } - break; - case MENU_ACTION_RIGHT: - if (!find_next_driver(setting->name, setting->value.string, setting->size)) - { - if (wraparound) - find_first_driver(setting->name, setting->value.string, setting->size); - } - break; + } + + return 0; +} + +static int setting_string_action_right_driver(void *data, + unsigned action, bool wraparound) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + if (!find_next_driver(setting->name, setting->value.string, setting->size)) + { + if (wraparound) + find_first_driver(setting->name, setting->value.string, setting->size); } return 0; @@ -1613,7 +1649,8 @@ static rarch_setting_t setting_action_setting(const char* name, result.get_string_representation = &setting_get_string_representation_default; result.action_start = NULL; result.action_iterate = NULL; - result.action_toggle = NULL; + result.action_left = NULL; + result.action_right = NULL; result.action_ok = setting_action_action_ok; result.action_cancel = NULL; @@ -1705,7 +1742,8 @@ static rarch_setting_t setting_float_setting(const char* name, result.original_value.fraction = *target; result.default_value.fraction = default_value; result.action_start = setting_generic_action_start_default; - result.action_toggle = setting_fraction_action_toggle_default; + result.action_left = setting_fraction_action_left_default; + result.action_right = setting_fraction_action_right_default; result.action_ok = setting_generic_action_ok_default; result.action_cancel = NULL; @@ -1755,7 +1793,8 @@ static rarch_setting_t setting_bool_setting(const char* name, result.boolean.on_label = on; result.action_start = setting_generic_action_start_default; - result.action_toggle = setting_bool_action_toggle_default; + result.action_left = setting_bool_action_toggle_default; + result.action_right = setting_bool_action_toggle_default; result.action_ok = setting_generic_action_ok_default; result.action_cancel = NULL; @@ -1838,7 +1877,8 @@ static rarch_setting_t setting_uint_setting(const char* name, result.original_value.unsigned_integer = *target; result.default_value.unsigned_integer = default_value; result.action_start = setting_generic_action_start_default; - result.action_toggle = setting_uint_action_toggle_default; + result.action_left = setting_uint_action_left_default; + result.action_right = setting_uint_action_right_default; result.action_ok = setting_generic_action_ok_default; result.action_cancel = NULL; result.get_string_representation = &setting_get_string_representation_uint; @@ -1881,7 +1921,8 @@ static rarch_setting_t setting_hex_setting(const char* name, result.original_value.unsigned_integer = *target; result.default_value.unsigned_integer = default_value; result.action_start = setting_generic_action_start_default; - result.action_toggle = NULL; + result.action_left = NULL; + result.action_right = NULL; result.action_ok = setting_generic_action_ok_default; result.action_cancel = NULL; result.get_string_representation = &setting_get_string_representation_hex; @@ -3382,7 +3423,10 @@ static void setting_add_special_callbacks( } } else if (values & SD_FLAG_IS_DRIVER) - (*list)[idx].action_toggle = setting_string_action_toggle_driver; + { + (*list)[idx].action_left = setting_string_action_left_driver; + (*list)[idx].action_right = setting_string_action_right_driver; + } } static void settings_data_list_current_add_flags( @@ -3435,7 +3479,8 @@ static bool setting_append_list_main_menu_options( // to put this callback. It should be called whenever the browser // needs to get the directory to browse into. It's not quite like // get_string_representation, but it is close. - (*list)[list_info->index - 1].action_toggle = core_list_action_toggle; + (*list)[list_info->index - 1].action_left = core_list_action_toggle; + (*list)[list_info->index - 1].action_right = core_list_action_toggle; menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_LOAD_CORE); settings_data_list_current_add_flags(list, list_info, SD_FLAG_BROWSER_ACTION); #endif @@ -3483,7 +3528,8 @@ static bool setting_append_list_main_menu_options( subgroup_info.name); (*list)[list_info->index - 1].size = sizeof(global->fullpath); (*list)[list_info->index - 1].value.string = global->fullpath; - (*list)[list_info->index - 1].action_toggle = load_content_action_toggle; + (*list)[list_info->index - 1].action_left = load_content_action_toggle; + (*list)[list_info->index - 1].action_right = load_content_action_toggle; menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_LOAD_CONTENT); settings_data_list_current_add_flags(list, list_info, SD_FLAG_BROWSER_ACTION); @@ -3547,7 +3593,8 @@ static bool setting_append_list_main_menu_options( "Save State", group_info.name, subgroup_info.name); - (*list)[list_info->index - 1].action_toggle = &setting_action_toggle_savestates; + (*list)[list_info->index - 1].action_left = &setting_action_left_savestates; + (*list)[list_info->index - 1].action_right = &setting_action_right_savestates; (*list)[list_info->index - 1].action_start = &setting_action_start_savestates; (*list)[list_info->index - 1].action_ok = &setting_bool_action_ok_exit; (*list)[list_info->index - 1].get_string_representation = &get_string_representation_savestate; @@ -3558,7 +3605,8 @@ static bool setting_append_list_main_menu_options( "Load State", group_info.name, subgroup_info.name); - (*list)[list_info->index - 1].action_toggle = &setting_action_toggle_savestates; + (*list)[list_info->index - 1].action_left = &setting_action_left_savestates; + (*list)[list_info->index - 1].action_right = &setting_action_left_savestates; (*list)[list_info->index - 1].action_start = &setting_action_start_savestates; (*list)[list_info->index - 1].action_ok = &setting_bool_action_ok_exit; (*list)[list_info->index - 1].get_string_representation = &get_string_representation_savestate; @@ -5276,7 +5324,8 @@ static bool setting_append_list_input_options( general_read_handler); (*list)[list_info->index - 1].index = user + 1; (*list)[list_info->index - 1].index_offset = user; - (*list)[list_info->index - 1].action_toggle = &setting_action_toggle_libretro_device_type; + (*list)[list_info->index - 1].action_left = &setting_action_left_libretro_device_type; + (*list)[list_info->index - 1].action_right = &setting_action_right_libretro_device_type; (*list)[list_info->index - 1].action_start = &setting_action_start_libretro_device_type; (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_libretro_device; @@ -5292,7 +5341,8 @@ static bool setting_append_list_input_options( general_read_handler); (*list)[list_info->index - 1].index = user + 1; (*list)[list_info->index - 1].index_offset = user; - (*list)[list_info->index - 1].action_toggle = &setting_action_toggle_analog_dpad_mode; + (*list)[list_info->index - 1].action_left = &setting_action_left_analog_dpad_mode; + (*list)[list_info->index - 1].action_right = &setting_action_right_analog_dpad_mode; (*list)[list_info->index - 1].action_start = &setting_action_start_analog_dpad_mode; (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_analog_dpad_mode; @@ -5305,7 +5355,8 @@ static bool setting_append_list_input_options( (*list)[list_info->index - 1].index = user + 1; (*list)[list_info->index - 1].index_offset = user; (*list)[list_info->index - 1].action_start = &setting_action_start_bind_device; - (*list)[list_info->index - 1].action_toggle = &setting_action_toggle_bind_device; + (*list)[list_info->index - 1].action_left = &setting_action_left_bind_device; + (*list)[list_info->index - 1].action_right = &setting_action_right_bind_device; (*list)[list_info->index - 1].get_string_representation = &get_string_representation_bind_device; CONFIG_ACTION( @@ -6975,7 +7026,7 @@ bool menu_setting_is_of_path_type(rarch_setting_t *setting) setting && setting->type == ST_ACTION && (setting->flags & SD_FLAG_BROWSER_ACTION) && - setting->action_toggle && + (setting->action_right || setting->action_left) && setting->change_handler) return true; return false; diff --git a/menu/menu_setting.h b/menu/menu_setting.h index 1b47017e95..57ddf13901 100644 --- a/menu/menu_setting.h +++ b/menu/menu_setting.h @@ -103,7 +103,8 @@ enum setting_list_flags #define SL_FLAG_ALL_SETTINGS (SL_FLAG_ALL - SL_FLAG_MAIN_MENU) typedef void (*change_handler_t )(void *data); -typedef int (*action_toggle_handler_t )(void *data, unsigned action, bool wraparound); +typedef int (*action_left_handler_t )(void *data, unsigned action, bool wraparound); +typedef int (*action_right_handler_t )(void *data, unsigned action, bool wraparound); typedef int (*action_up_handler_t )(void *data, unsigned action); typedef int (*action_down_handler_t )(void *data, unsigned action); typedef int (*action_start_handler_t )(void *data); @@ -148,7 +149,8 @@ typedef struct rarch_setting change_handler_t read_handler; action_start_handler_t action_start; action_iterate_handler_t action_iterate; - action_toggle_handler_t action_toggle; + 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;