From 3d689bd40f6d774a3026315ed5434d31cd41c389 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 14 Sep 2014 22:39:33 +0200 Subject: [PATCH] (Menu) Add SD_FLAG_EXIT to signal to the menu that we want to cleanly exit out of the menu --- frontend/menu/backend/menu_common_backend.c | 59 +++++++++++++++------ frontend/menu/menu_action.c | 21 ++++++-- frontend/menu/menu_action.h | 6 +-- settings_data.c | 8 +-- settings_data.h | 1 + 5 files changed, 68 insertions(+), 27 deletions(-) diff --git a/frontend/menu/backend/menu_common_backend.c b/frontend/menu/backend/menu_common_backend.c index 4b3891969b..1050024c3b 100644 --- a/frontend/menu/backend/menu_common_backend.c +++ b/frontend/menu/backend/menu_common_backend.c @@ -215,7 +215,7 @@ static int menu_common_setting_set_perf(unsigned setting, unsigned action, } -static void menu_common_setting_set_current_path_selection( +static int menu_common_setting_set_current_path_selection( rarch_setting_t *setting, const char *start_path, const char *label, unsigned type, unsigned action) @@ -234,18 +234,28 @@ static void menu_common_setting_set_current_path_selection( if (setting->change_handler) setting->change_handler(setting); + + if (setting->flags & SD_FLAG_EXIT) + return -1; + + return 0; } -static void menu_common_setting_set_current_string_path( +static int menu_common_setting_set_current_string_path( rarch_setting_t *setting, const char *dir, const char *path) { fill_pathname_join(setting->value.string, dir, path, setting->size); if (setting->change_handler) setting->change_handler(setting); + + if (setting->flags & SD_FLAG_EXIT) + return -1; + + return 0; } -void menu_common_set_current_string_based_on_label( +int menu_common_set_current_string_based_on_label( const char *label, const char *str) { if (!strcmp(label, "video_shader_preset_save_as")) @@ -256,27 +266,38 @@ void menu_common_set_current_string_based_on_label( driver.menu_ctx->backend->shader_manager_save_preset(str, false); #endif } + + return 0; } -void menu_common_setting_set_current_string( +int menu_common_setting_set_current_string( rarch_setting_t *setting, const char *str) { strlcpy(setting->value.string, str, setting->size); if (setting->change_handler) setting->change_handler(setting); + + if (setting->flags & SD_FLAG_EXIT) + return -1; + + return 0; } -static void handle_setting(rarch_setting_t *setting, +static int handle_setting(rarch_setting_t *setting, unsigned id, const char *label, unsigned action) { if (setting->type == ST_BOOL) - menu_action_setting_boolean(setting, action); - else if (setting->type == ST_UINT) - menu_action_setting_unsigned_integer(setting, id, action); - else if (setting->type == ST_FLOAT) - menu_action_setting_fraction(setting, action); - else if (setting->type == ST_DIR) + return menu_action_setting_boolean(setting, action); + if (setting->type == ST_UINT) + return menu_action_setting_unsigned_integer(setting, id, action); + if (setting->type == ST_FLOAT) + return menu_action_setting_fraction(setting, action); + if (setting->type == ST_PATH) + return menu_common_setting_set_current_path_selection(setting, + setting->default_value.string, setting->name, id, action); + + if (setting->type == ST_DIR) { if (action == MENU_ACTION_START) { @@ -284,12 +305,14 @@ static void handle_setting(rarch_setting_t *setting, if (setting->change_handler) setting->change_handler(setting); + + if (setting->flags & SD_FLAG_EXIT) + return -1; } + return 0; } - else if (setting->type == ST_PATH) - menu_common_setting_set_current_path_selection(setting, - setting->default_value.string, setting->name, id, action); - else if (setting->type == ST_STRING) + + if (setting->type == ST_STRING) { if ( (setting->flags & SD_FLAG_ALLOW_INPUT) || @@ -304,6 +327,8 @@ static void handle_setting(rarch_setting_t *setting, else menu_action_setting_driver(setting, action); } + + return 0; } static int menu_setting_set(unsigned id, const char *label, @@ -316,7 +341,7 @@ static int menu_setting_set(unsigned id, const char *label, ); if (setting) - handle_setting(setting, id, label, action); + return handle_setting(setting, id, label, action); else { setting = (rarch_setting_t*)get_last_setting( @@ -350,7 +375,7 @@ static int menu_setting_set(unsigned id, const char *label, } } - handle_setting(setting, id, label, action); + return handle_setting(setting, id, label, action); } else if (!strcmp(label, "video_shader_num_passes")) { diff --git a/frontend/menu/menu_action.c b/frontend/menu/menu_action.c index af50bd86da..c1bc44e483 100644 --- a/frontend/menu/menu_action.c +++ b/frontend/menu/menu_action.c @@ -18,7 +18,7 @@ #include "menu_input_line_cb.h" #include "menu_action.h" -void menu_action_setting_boolean( +int menu_action_setting_boolean( rarch_setting_t *setting, unsigned action) { if ( @@ -55,9 +55,14 @@ void menu_action_setting_boolean( if (setting->change_handler) setting->change_handler(setting); + + if (setting->flags & SD_FLAG_EXIT) + return -1; + + return 0; } -void menu_action_setting_unsigned_integer( +int menu_action_setting_unsigned_integer( rarch_setting_t *setting, unsigned id, unsigned action) { if (id == MENU_FILE_LINEFEED) @@ -106,9 +111,14 @@ void menu_action_setting_unsigned_integer( if (setting->change_handler) setting->change_handler(setting); + + if (setting->flags & SD_FLAG_EXIT) + return -1; + + return 0; } -void menu_action_setting_fraction( +int menu_action_setting_fraction( rarch_setting_t *setting, unsigned action) { if (!strcmp(setting->name, "video_refresh_rate_auto")) @@ -188,6 +198,11 @@ void menu_action_setting_fraction( if (setting->change_handler) setting->change_handler(setting); + + if (setting->flags & SD_FLAG_EXIT) + return -1; + + return 0; } void menu_action_setting_driver( diff --git a/frontend/menu/menu_action.h b/frontend/menu/menu_action.h index 97f7ac4b49..b48e215e3b 100644 --- a/frontend/menu/menu_action.h +++ b/frontend/menu/menu_action.h @@ -19,13 +19,13 @@ #include "../../settings_data.h" -void menu_action_setting_boolean( +int menu_action_setting_boolean( rarch_setting_t *setting, unsigned action); -void menu_action_setting_fraction( +int menu_action_setting_fraction( rarch_setting_t *setting, unsigned action); -void menu_action_setting_unsigned_integer( +int menu_action_setting_unsigned_integer( rarch_setting_t *setting, unsigned id, unsigned action); void menu_action_setting_driver( diff --git a/settings_data.c b/settings_data.c index 73dd829351..ae77b3ca8d 100644 --- a/settings_data.c +++ b/settings_data.c @@ -2375,11 +2375,11 @@ rarch_setting_t *setting_data_get_mainmenu(bool regenerate) } if (g_extern.main_is_init && !g_extern.libretro_dummy) { - CONFIG_BOOL(lists[9], "savestate", "Save State", false, "", "", GROUP_NAME, SUBGROUP_NAME, general_write_handler, general_read_handler) - CONFIG_BOOL(lists[10], "loadstate", "Load State", false, "", "", GROUP_NAME, SUBGROUP_NAME, general_write_handler, general_read_handler) + CONFIG_BOOL(lists[9], "savestate", "Save State", false, "", "", GROUP_NAME, SUBGROUP_NAME, general_write_handler, general_read_handler) WITH_FLAGS(SD_FLAG_EXIT) + CONFIG_BOOL(lists[10], "loadstate", "Load State", false, "", "", GROUP_NAME, SUBGROUP_NAME, general_write_handler, general_read_handler) WITH_FLAGS(SD_FLAG_EXIT) CONFIG_BOOL(lists[11], "take_screenshot", "Take Screenshot", false, "", "", GROUP_NAME, SUBGROUP_NAME, general_write_handler, general_read_handler) WITH_FLAGS(SD_FLAG_PUSH_ACTION) - CONFIG_BOOL(lists[12], "resume_content", "Resume Content", false, "", "", GROUP_NAME, SUBGROUP_NAME, general_write_handler, general_read_handler) WITH_FLAGS(SD_FLAG_PUSH_ACTION) - CONFIG_BOOL(lists[13], "restart_content", "Restart Content", false, "", "", GROUP_NAME, SUBGROUP_NAME, general_write_handler, general_read_handler) WITH_FLAGS(SD_FLAG_PUSH_ACTION) + CONFIG_BOOL(lists[12], "resume_content", "Resume Content", false, "", "", GROUP_NAME, SUBGROUP_NAME, general_write_handler, general_read_handler) WITH_FLAGS(SD_FLAG_PUSH_ACTION) WITH_FLAGS(SD_FLAG_EXIT) + CONFIG_BOOL(lists[13], "restart_content", "Restart Content", false, "", "", GROUP_NAME, SUBGROUP_NAME, general_write_handler, general_read_handler) WITH_FLAGS(SD_FLAG_PUSH_ACTION) WITH_FLAGS(SD_FLAG_EXIT) } #ifndef HAVE_DYNAMIC CONFIG_BOOL(lists[14], "restart_retroarch", "Restart RetroArch", false, "", "",GROUP_NAME, SUBGROUP_NAME, general_write_handler, general_read_handler) WITH_FLAGS(SD_FLAG_PUSH_ACTION) diff --git a/settings_data.h b/settings_data.h index b1e1fb7222..c74a8a40a1 100644 --- a/settings_data.h +++ b/settings_data.h @@ -55,6 +55,7 @@ enum setting_flags SD_FLAG_ALLOW_INPUT = (1 << 5), SD_FLAG_PUSH_ACTION = (1 << 6), SD_FLAG_IS_DRIVER = (1 << 7), + SD_FLAG_EXIT = (1 << 8), }; typedef struct rarch_setting_t