diff --git a/menu/backend/menu_common_backend.c b/menu/backend/menu_common_backend.c index 70edc4021f..dac9de806f 100644 --- a/menu/backend/menu_common_backend.c +++ b/menu/backend/menu_common_backend.c @@ -614,8 +614,8 @@ static int menu_common_iterate(unsigned action) break; case MENU_ACTION_CANCEL: - apply_deferred_settings(); - menu_list_pop_stack(driver.menu->menu_list); + if (cbs && cbs->action_cancel) + return cbs->action_cancel(path_offset, label_offset, type_offset, driver.menu->selection_ptr); break; case MENU_ACTION_OK: diff --git a/menu/menu_action.c b/menu/menu_action.c index e03c7b50b8..bcbf8088c9 100644 --- a/menu/menu_action.c +++ b/menu/menu_action.c @@ -58,6 +58,10 @@ static void process_setting_handler( if (setting->action_ok) setting->action_ok(setting, action); break; + case MENU_ACTION_CANCEL: + if (setting->action_cancel) + setting->action_cancel(setting, action); + break; case MENU_ACTION_START: if (setting->action_start) setting->action_start(setting); diff --git a/menu/menu_common.c b/menu/menu_common.c index 368521398e..9d42856750 100644 --- a/menu/menu_common.c +++ b/menu/menu_common.c @@ -531,6 +531,7 @@ void menu_common_list_delete(void *data, size_t idx, { cbs->action_start = NULL; cbs->action_ok = NULL; + cbs->action_cancel = NULL; cbs->action_toggle = NULL; cbs->action_deferred_push = NULL; free(list->list[idx].actiondata); diff --git a/menu/menu_entries_cbs.c b/menu/menu_entries_cbs.c index 73cdf19214..d59ed590bc 100644 --- a/menu/menu_entries_cbs.c +++ b/menu/menu_entries_cbs.c @@ -799,6 +799,20 @@ static int action_ok_lookup_setting(const char *path, return menu_action_setting_set(type, label, MENU_ACTION_OK); } +static int action_cancel_lookup_setting(const char *path, + const char *label, unsigned type, size_t idx) +{ + return menu_action_setting_set(type, label, MENU_ACTION_CANCEL); +} + +static int action_cancel_pop_default(const char *path, + const char *label, unsigned type, size_t idx) +{ + apply_deferred_settings(); + menu_list_pop_stack(driver.menu->menu_list); + return 0; +} + static int action_ok_save_new_config(const char *path, const char *label, unsigned type, size_t idx) { @@ -2589,6 +2603,18 @@ static void menu_entries_cbs_init_bind_content_list_switch(menu_file_list_cbs_t cbs->action_content_list_switch = deferred_push_content_list; } +static void menu_entries_cbs_init_bind_cancel(menu_file_list_cbs_t *cbs, + const char *path, const char *label, unsigned type, size_t idx) +{ + if (!cbs) + return; + + cbs->action_cancel = action_cancel_lookup_setting; + + /* TODO - add some stuff here. */ + cbs->action_cancel = action_cancel_pop_default; +} + static void menu_entries_cbs_init_bind_ok(menu_file_list_cbs_t *cbs, const char *path, const char *label, unsigned type, size_t idx) { @@ -2819,6 +2845,7 @@ void menu_entries_cbs_init(void *data, if (cbs) { menu_entries_cbs_init_bind_ok(cbs, path, label, type, idx); + menu_entries_cbs_init_bind_cancel(cbs, path, label, type, idx); menu_entries_cbs_init_bind_start(cbs, path, label, type, idx); menu_entries_cbs_init_bind_content_list_switch(cbs, path, label, type, idx); menu_entries_cbs_init_bind_toggle(cbs, path, label, type, idx); diff --git a/settings_data.c b/settings_data.c index 60822a2198..6bedcf32d7 100644 --- a/settings_data.c +++ b/settings_data.c @@ -1333,6 +1333,7 @@ rarch_setting_t setting_data_action_setting(const char* name, result.action_start = NULL; result.action_toggle = NULL; result.action_ok = setting_data_action_action_ok; + result.action_cancel = NULL; return result; } @@ -1372,6 +1373,7 @@ rarch_setting_t setting_data_float_setting(const char* name, 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; + result.action_cancel = NULL; return result; } @@ -1394,6 +1396,7 @@ rarch_setting_t setting_data_bool_setting(const char* name, 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; + result.action_cancel= NULL; return result; } @@ -1430,6 +1433,7 @@ rarch_setting_t setting_data_uint_setting(const char* name, 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; + result.action_cancel = NULL; return result; } @@ -1495,8 +1499,9 @@ rarch_setting_t setting_data_bind_setting(const char* name, result.index = idx; result.index_offset = idx_offset; - result.action_start = setting_data_bind_action_start; - result.action_ok = setting_data_bind_action_ok; + result.action_start = setting_data_bind_action_start; + result.action_ok = setting_data_bind_action_ok; + result.action_cancel = NULL; return result; } @@ -2997,10 +3002,12 @@ static void setting_data_add_special_callbacks( case ST_UINT: (*list)[idx].action_start = setting_data_uint_action_start_linefeed; (*list)[idx].action_ok = setting_data_uint_action_ok_linefeed; + (*list)[idx].action_cancel = NULL; break; case ST_STRING: (*list)[idx].action_start = setting_data_string_action_start_allow_input; (*list)[idx].action_ok = setting_data_string_action_ok_allow_input; + (*list)[idx].action_cancel = NULL; break; default: break; @@ -3177,8 +3184,8 @@ static bool setting_data_append_list_main_menu_options( group_info.name, subgroup_info.name); (*list)[list_info->index - 1].action_toggle = &setting_data_action_toggle_savestates; - (*list)[list_info->index - 1].action_start = &setting_data_action_start_savestates; - (*list)[list_info->index - 1].action_ok = &setting_data_bool_action_ok_exit; + (*list)[list_info->index - 1].action_start = &setting_data_action_start_savestates; + (*list)[list_info->index - 1].action_ok = &setting_data_bool_action_ok_exit; (*list)[list_info->index - 1].get_string_representation = &get_string_representation_savestate; settings_list_current_add_cmd (list, list_info, RARCH_CMD_SAVE_STATE); @@ -3188,8 +3195,8 @@ static bool setting_data_append_list_main_menu_options( group_info.name, subgroup_info.name); (*list)[list_info->index - 1].action_toggle = &setting_data_action_toggle_savestates; - (*list)[list_info->index - 1].action_start = &setting_data_action_start_savestates; - (*list)[list_info->index - 1].action_ok = &setting_data_bool_action_ok_exit; + (*list)[list_info->index - 1].action_start = &setting_data_action_start_savestates; + (*list)[list_info->index - 1].action_ok = &setting_data_bool_action_ok_exit; (*list)[list_info->index - 1].get_string_representation = &get_string_representation_savestate; settings_list_current_add_cmd (list, list_info, RARCH_CMD_LOAD_STATE); @@ -3206,7 +3213,7 @@ static bool setting_data_append_list_main_menu_options( group_info.name, subgroup_info.name); settings_list_current_add_cmd (list, list_info, RARCH_CMD_RESUME); - (*list)[list_info->index - 1].action_ok = &setting_data_bool_action_ok_exit; + (*list)[list_info->index - 1].action_ok = &setting_data_bool_action_ok_exit; CONFIG_ACTION( "restart_content", @@ -4714,18 +4721,20 @@ static bool setting_data_append_list_input_options( label_bind_all[user], group_info.name, subgroup_info.name); - (*list)[list_info->index - 1].index = user + 1; - (*list)[list_info->index - 1].index_offset = user; - (*list)[list_info->index - 1].action_ok = &setting_data_action_ok_bind_all; + (*list)[list_info->index - 1].index = user + 1; + (*list)[list_info->index - 1].index_offset = user; + (*list)[list_info->index - 1].action_ok = &setting_data_action_ok_bind_all; + (*list)[list_info->index - 1].action_cancel = NULL; CONFIG_ACTION( key_bind_defaults[user], label_bind_defaults[user], group_info.name, subgroup_info.name); - (*list)[list_info->index - 1].index = user + 1; - (*list)[list_info->index - 1].index_offset = user; - (*list)[list_info->index - 1].action_ok = &setting_data_action_ok_bind_defaults; + (*list)[list_info->index - 1].index = user + 1; + (*list)[list_info->index - 1].index_offset = user; + (*list)[list_info->index - 1].action_ok = &setting_data_action_ok_bind_defaults; + (*list)[list_info->index - 1].action_cancel = NULL; } START_SUB_GROUP(