diff --git a/frontend/menu/menu_action.c b/frontend/menu/menu_action.c index 8b94a9995f..94dc46c695 100644 --- a/frontend/menu/menu_action.c +++ b/frontend/menu/menu_action.c @@ -23,8 +23,22 @@ int menu_action_setting_boolean( rarch_setting_t *setting, unsigned action) { - if (setting->action_ok) - setting->action_ok(setting, action); + switch (action) + { + case MENU_ACTION_LEFT: + case MENU_ACTION_RIGHT: + if (setting->action_toggle) + setting->action_toggle(setting, action); + break; + case MENU_ACTION_OK: + if (setting->action_ok) + setting->action_ok(setting, action); + break; + case MENU_ACTION_START: + if (setting->action_start) + setting->action_start(setting); + break; + } if (setting->change_handler) setting->change_handler(setting); @@ -42,8 +56,22 @@ int menu_action_setting_boolean( int menu_action_setting_unsigned_integer( rarch_setting_t *setting, unsigned action) { - if (setting->action_ok) - setting->action_ok(setting, action); + switch (action) + { + case MENU_ACTION_LEFT: + case MENU_ACTION_RIGHT: + if (setting->action_toggle) + setting->action_toggle(setting, action); + break; + case MENU_ACTION_OK: + if (setting->action_ok) + setting->action_ok(setting, action); + break; + case MENU_ACTION_START: + if (setting->action_start) + setting->action_start(setting); + break; + } if (setting->change_handler) setting->change_handler(setting); @@ -61,8 +89,22 @@ int menu_action_setting_unsigned_integer( int menu_action_setting_fraction( rarch_setting_t *setting, unsigned action) { - if (setting->action_ok) - setting->action_ok(setting, action); + switch (action) + { + case MENU_ACTION_LEFT: + case MENU_ACTION_RIGHT: + if (setting->action_toggle) + setting->action_toggle(setting, action); + break; + case MENU_ACTION_OK: + if (setting->action_ok) + setting->action_ok(setting, action); + break; + case MENU_ACTION_START: + if (setting->action_start) + setting->action_start(setting); + break; + } if (setting->change_handler) setting->change_handler(setting); @@ -173,27 +215,46 @@ int menu_action_handle_setting(rarch_setting_t *setting, if (setting->type == ST_DIR) { - if (action == MENU_ACTION_START) + switch (action) { - *setting->value.string = '\0'; + case MENU_ACTION_START: + *setting->value.string = '\0'; - if (setting->change_handler) - setting->change_handler(setting); + if (setting->change_handler) + setting->change_handler(setting); - if (setting->flags & SD_FLAG_EXIT - && setting->cmd_trigger.triggered) - { - setting->cmd_trigger.triggered = false; - return -1; - } + if (setting->flags & SD_FLAG_EXIT + && setting->cmd_trigger.triggered) + { + setting->cmd_trigger.triggered = false; + return -1; + } + break; } + return 0; } if (setting->type == ST_STRING) { - if (setting->action_toggle) - return setting->action_toggle(setting, action); + switch (action) + { + case MENU_ACTION_LEFT: + case MENU_ACTION_RIGHT: + if (setting->action_toggle) + return setting->action_toggle(setting, action); + break; + case MENU_ACTION_START: + if (setting->action_start) + return setting->action_start(setting); + break; + case MENU_ACTION_OK: + if (setting->action_ok) + return setting->action_ok(setting, action); + break; + } + + return 0; } return 0; diff --git a/settings_data.c b/settings_data.c index de1a37ed83..c9cde30aa9 100644 --- a/settings_data.c +++ b/settings_data.c @@ -674,7 +674,19 @@ void setting_data_get_string_representation(rarch_setting_t* setting, } } -static int setting_data_bool_action_ok_savestates(void *data, unsigned action) +static int setting_data_bool_action_start_savestates(void *data) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + g_settings.state_slot = 0; + + return 0; +} + +static int setting_data_bool_action_toggle_savestates(void *data, unsigned action) { rarch_setting_t *setting = (rarch_setting_t*)data; @@ -683,9 +695,6 @@ static int setting_data_bool_action_ok_savestates(void *data, unsigned action) switch (action) { - case MENU_ACTION_START: - g_settings.state_slot = 0; - break; case MENU_ACTION_LEFT: // Slot -1 is (auto) slot. if (g_settings.state_slot >= 0) @@ -694,11 +703,50 @@ static int setting_data_bool_action_ok_savestates(void *data, unsigned action) case MENU_ACTION_RIGHT: g_settings.state_slot++; break; - case MENU_ACTION_OK: - *setting->value.boolean = !(*setting->value.boolean); + } - if (setting->cmd_trigger.idx != RARCH_CMD_NONE) - setting->cmd_trigger.triggered = true; + return 0; +} + +static int setting_data_bool_action_ok_savestates(void *data, unsigned action) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + *setting->value.boolean = !(*setting->value.boolean); + + if (setting->cmd_trigger.idx != RARCH_CMD_NONE) + setting->cmd_trigger.triggered = true; + + return 0; +} + +static int setting_data_bool_action_start_default(void *data) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + *setting->value.boolean = setting->default_value.boolean; + + return 0; +} + +static int setting_data_bool_action_toggle_default(void *data, unsigned action) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + switch (action) + { + case MENU_ACTION_LEFT: + case MENU_ACTION_RIGHT: + *setting->value.boolean = !(*setting->value.boolean); break; } @@ -712,25 +760,25 @@ static int setting_data_bool_action_ok_default(void *data, unsigned action) if (!setting) return -1; - switch (action) - { - case MENU_ACTION_OK: - if (setting->cmd_trigger.idx != RARCH_CMD_NONE) - setting->cmd_trigger.triggered = true; - /* fall-through */ - case MENU_ACTION_LEFT: - case MENU_ACTION_RIGHT: - *setting->value.boolean = !(*setting->value.boolean); - break; - case MENU_ACTION_START: - *setting->value.boolean = setting->default_value.boolean; - break; - } + if (setting->cmd_trigger.idx != RARCH_CMD_NONE) + setting->cmd_trigger.triggered = true; return 0; } -static int setting_data_uint_action_ok_default(void *data, unsigned action) +static int setting_data_uint_action_start_default(void *data) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + *setting->value.unsigned_integer = setting->default_value.unsigned_integer; + + return 0; +} + +static int setting_data_uint_action_toggle_default(void *data, unsigned action) { rarch_setting_t *setting = (rarch_setting_t*)data; @@ -751,10 +799,6 @@ static int setting_data_uint_action_ok_default(void *data, unsigned action) } break; - case MENU_ACTION_OK: - if (setting->cmd_trigger.idx != RARCH_CMD_NONE) - setting->cmd_trigger.triggered = true; - /* fall-through */ case MENU_ACTION_RIGHT: *setting->value.unsigned_integer = *setting->value.unsigned_integer + setting->step; @@ -765,52 +809,62 @@ static int setting_data_uint_action_ok_default(void *data, unsigned action) *setting->value.unsigned_integer = setting->max; } break; - - case MENU_ACTION_START: - *setting->value.unsigned_integer = - setting->default_value.unsigned_integer; - break; } return 0; } +static int setting_data_uint_action_ok_default(void *data, unsigned action) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + if (setting->cmd_trigger.idx != RARCH_CMD_NONE) + setting->cmd_trigger.triggered = true; + + return 0; +} + +static int setting_data_fraction_action_start_video_refresh_rate_auto( + void *data) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + g_extern.measure_data.frame_time_samples_count = 0; + + return 0; +} + static int setting_data_fraction_action_ok_video_refresh_rate_auto( void *data, unsigned action) { + double video_refresh_rate, deviation = 0.0; + unsigned sample_points = 0; rarch_setting_t *setting = (rarch_setting_t*)data; if (!setting) return -1; - switch (action) + if (driver_monitor_fps_statistics(&video_refresh_rate, + &deviation, &sample_points)) { - case MENU_ACTION_START: - g_extern.measure_data.frame_time_samples_count = 0; - break; - case MENU_ACTION_OK: - { - double video_refresh_rate, deviation = 0.0; - unsigned sample_points = 0; - - if (driver_monitor_fps_statistics(&video_refresh_rate, - &deviation, &sample_points)) - { - driver_set_monitor_refresh_rate(video_refresh_rate); - /* Incase refresh rate update forced non-block video. */ - rarch_main_command(RARCH_CMD_VIDEO_SET_BLOCKING_STATE); - } - - if (setting->cmd_trigger.idx != RARCH_CMD_NONE) - setting->cmd_trigger.triggered = true; - } - break; + driver_set_monitor_refresh_rate(video_refresh_rate); + /* Incase refresh rate update forced non-block video. */ + rarch_main_command(RARCH_CMD_VIDEO_SET_BLOCKING_STATE); } + if (setting->cmd_trigger.idx != RARCH_CMD_NONE) + setting->cmd_trigger.triggered = true; + return 0; } -static int setting_data_fraction_action_ok_default( +static int setting_data_fraction_action_toggle_default( void *data, unsigned action) { rarch_setting_t *setting = (rarch_setting_t*)data; @@ -831,10 +885,6 @@ static int setting_data_fraction_action_ok_default( } break; - case MENU_ACTION_OK: - if (setting->cmd_trigger.idx != RARCH_CMD_NONE) - setting->cmd_trigger.triggered = true; - /* fall-through */ case MENU_ACTION_RIGHT: *setting->value.fraction = *setting->value.fraction + setting->step; @@ -845,15 +895,50 @@ static int setting_data_fraction_action_ok_default( *setting->value.fraction = setting->max; } break; - - case MENU_ACTION_START: - *setting->value.fraction = setting->default_value.fraction; - break; } return 0; } +static int setting_data_fraction_action_start_default( + void *data) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + *setting->value.fraction = setting->default_value.fraction; + + return 0; +} + +static int setting_data_fraction_action_ok_default( + void *data, unsigned action) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + if (setting->cmd_trigger.idx != RARCH_CMD_NONE) + setting->cmd_trigger.triggered = true; + + return 0; +} + +static int setting_data_uint_action_start_linefeed(void *data) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting) + return -1; + + *setting->value.unsigned_integer = setting->default_value.unsigned_integer; + + return 0; +} + static int setting_data_uint_action_ok_linefeed(void *data, unsigned action) { rarch_setting_t *setting = (rarch_setting_t*)data; @@ -861,17 +946,8 @@ static int setting_data_uint_action_ok_linefeed(void *data, unsigned action) if (!setting) return -1; - switch (action) - { - case MENU_ACTION_OK: - menu_key_start_line(driver.menu, setting->short_description, - setting->name, st_uint_callback); - break; - case MENU_ACTION_START: - *setting->value.unsigned_integer = - setting->default_value.unsigned_integer; - break; - } + menu_key_start_line(driver.menu, setting->short_description, + setting->name, st_uint_callback); return 0; } @@ -909,7 +985,9 @@ rarch_setting_t setting_data_float_setting(const char* name, result.original_value.fraction = *target; result.default_value.fraction = default_value; - result.action_ok = setting_data_fraction_action_ok_default; + result.action_start = setting_data_fraction_action_start_default; + result.action_toggle = setting_data_fraction_action_toggle_default; + result.action_ok = setting_data_fraction_action_ok_default; return result; } @@ -929,7 +1007,9 @@ rarch_setting_t setting_data_bool_setting(const char* name, result.boolean.off_label = off; result.boolean.on_label = on; - result.action_ok = setting_data_bool_action_ok_default; + result.action_start = setting_data_bool_action_start_default; + result.action_toggle= setting_data_bool_action_toggle_default; + result.action_ok = setting_data_bool_action_ok_default; return result; } @@ -963,7 +1043,9 @@ rarch_setting_t setting_data_uint_setting(const char* name, result.original_value.unsigned_integer = *target; result.default_value.unsigned_integer = default_value; - result.action_ok = setting_data_uint_action_ok_default; + result.action_start = setting_data_uint_action_start_default; + result.action_toggle = setting_data_uint_action_toggle_default; + result.action_ok = setting_data_uint_action_ok_default; return result; } @@ -2400,7 +2482,19 @@ static int setting_data_string_action_toggle_driver(void *data, return 0; } -static int setting_data_string_action_toggle_allow_input(void *data, +static int setting_data_string_action_start_allow_input(void *data) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + + if (!setting || !driver.menu) + return -1; + + *setting->value.string = '\0'; + + return 0; +} + +static int setting_data_string_action_ok_allow_input(void *data, unsigned action) { rarch_setting_t *setting = (rarch_setting_t*)data; @@ -2408,16 +2502,8 @@ static int setting_data_string_action_toggle_allow_input(void *data, if (!setting || !driver.menu) return -1; - switch (action) - { - case MENU_ACTION_OK: - menu_key_start_line(driver.menu, setting->short_description, - setting->name, st_string_callback); - break; - case MENU_ACTION_START: - *setting->value.string = '\0'; - break; - } + menu_key_start_line(driver.menu, setting->short_description, + setting->name, st_string_callback); return 0; } @@ -2448,15 +2534,26 @@ static void setting_data_add_special_callbacks( rarch_setting_info_t *list_info, unsigned values) { - /* Action OK. */ - if (values & SD_FLAG_ALLOW_INPUT) - (*list)[list_info->index - 1].action_ok = setting_data_uint_action_ok_linefeed; + unsigned index = list_info->index - 1; - /* Action Toggle. */ if (values & SD_FLAG_ALLOW_INPUT) - (*list)[list_info->index - 1].action_toggle = setting_data_string_action_toggle_allow_input; + { + switch ((*list)[index].type) + { + case ST_UINT: + (*list)[index].action_start = setting_data_uint_action_start_linefeed; + (*list)[index].action_ok = setting_data_uint_action_ok_linefeed; + break; + case ST_STRING: + (*list)[index].action_start = setting_data_string_action_start_allow_input; + (*list)[index].action_ok = setting_data_string_action_ok_allow_input; + break; + default: + break; + } + } else if (values & SD_FLAG_IS_DRIVER) - (*list)[list_info->index - 1].action_toggle = setting_data_string_action_toggle_driver; + (*list)[index].action_toggle = setting_data_string_action_toggle_driver; } static void settings_data_list_current_add_flags( @@ -2627,6 +2724,8 @@ static bool setting_data_append_list_main_menu_options( subgroup_info.name, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].action_toggle = &setting_data_bool_action_toggle_savestates; + (*list)[list_info->index - 1].action_start = &setting_data_bool_action_start_savestates; (*list)[list_info->index - 1].action_ok = &setting_data_bool_action_ok_savestates; settings_list_current_add_cmd (list, list_info, RARCH_CMD_SAVE_STATE); settings_data_list_current_add_flags(list, list_info, SD_FLAG_EXIT); @@ -2642,6 +2741,8 @@ static bool setting_data_append_list_main_menu_options( subgroup_info.name, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].action_toggle = &setting_data_bool_action_toggle_savestates; + (*list)[list_info->index - 1].action_start = &setting_data_bool_action_start_savestates; (*list)[list_info->index - 1].action_ok = &setting_data_bool_action_ok_savestates; settings_list_current_add_cmd (list, list_info, RARCH_CMD_LOAD_STATE); settings_data_list_current_add_flags(list, list_info, SD_FLAG_EXIT); @@ -3311,6 +3412,8 @@ static bool setting_data_append_list_video_options( subgroup_info.name, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].action_start = + &setting_data_fraction_action_start_video_refresh_rate_auto; (*list)[list_info->index - 1].action_ok = &setting_data_fraction_action_ok_video_refresh_rate_auto; diff --git a/settings_list.h b/settings_list.h index d10185257a..a6ae756e39 100644 --- a/settings_list.h +++ b/settings_list.h @@ -80,9 +80,10 @@ 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); -typedef int (*action_ok_handler_t)(void *data, unsigned action); +typedef void (*change_handler_t )(void *data); +typedef int (*action_toggle_handler_t)(void *data, unsigned action); +typedef int (*action_start_handler_t )(void *data); +typedef int (*action_ok_handler_t )(void *data, unsigned action); typedef struct rarch_setting_info { @@ -117,6 +118,7 @@ typedef struct rarch_setting change_handler_t change_handler; change_handler_t deferred_handler; change_handler_t read_handler; + action_start_handler_t action_start; action_toggle_handler_t action_toggle; action_ok_handler_t action_ok;