diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 2141315409..d4fe1ff8b2 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -564,7 +564,7 @@ static int generic_action_ok(const char *path, msg_force = true; menu_display_ctl(MENU_DISPLAY_CTL_SET_MSG_FORCE, &msg_force); - if (rarch_replace_config(action_path)) + if (rarch_ctl(RARCH_ACTION_STATE_REPLACE_CONFIG, action_path)) { bool pending_push = false; menu_navigation_ctl(MENU_NAVIGATION_CTL_CLEAR, &pending_push); diff --git a/retroarch.c b/retroarch.c index 74065e8fc3..4f8c33a146 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1365,7 +1365,7 @@ void rarch_main_init_wrap(const struct rarch_main_wrap *args, #endif } -void rarch_ctl(enum rarch_ctl_state state, void *data) +bool rarch_ctl(enum rarch_ctl_state state, void *data) { driver_t *driver = driver_get_ptr(); global_t *global = global_get_ptr(); @@ -1374,6 +1374,27 @@ void rarch_ctl(enum rarch_ctl_state state, void *data) switch(state) { + case RARCH_ACTION_STATE_REPLACE_CONFIG: + { + char *path = (char*)data; + + if (!path) + return false; + + /* If config file to be replaced is the same as the + * current config file, exit. */ + if (!strcmp(path, global->path.config)) + return false; + + if (settings->config_save_on_exit && *global->path.config) + config_save_file(global->path.config); + + strlcpy(global->path.config, path, sizeof(global->path.config)); + global->block_config_read = false; + *settings->libretro = '\0'; /* Load core in new config. */ + } + event_command(EVENT_CMD_PREPARE_DUMMY); + return true; case RARCH_ACTION_STATE_MENU_RUNNING: #ifdef HAVE_MENU menu_driver_toggle(true); @@ -1432,8 +1453,10 @@ void rarch_ctl(enum rarch_ctl_state state, void *data) break; case RARCH_ACTION_STATE_NONE: default: - break; + return false; } + + return true; } /** @@ -1569,44 +1592,3 @@ int rarch_defer_core(core_info_list_t *core_info, const char *dir, return -1; } -/** - * rarch_replace_config: - * @path : Path to config file to replace - * current config file with. - * - * Replaces currently loaded configuration file with - * another one. Will load a dummy core to flush state - * properly. - * - * Quite intrusive and error prone. - * Likely to have lots of small bugs. - * Cleanly exit the main loop to ensure that all the tiny details - * get set properly. - * - * This should mitigate most of the smaller bugs. - * - * Returns: true (1) if successful, false (0) if @path was the - * same as the current config file. - **/ - -bool rarch_replace_config(const char *path) -{ - settings_t *settings = config_get_ptr(); - global_t *global = global_get_ptr(); - - /* If config file to be replaced is the same as the - * current config file, exit. */ - if (!strcmp(path, global->path.config)) - return false; - - if (settings->config_save_on_exit && *global->path.config) - config_save_file(global->path.config); - - strlcpy(global->path.config, path, sizeof(global->path.config)); - global->block_config_read = false; - *settings->libretro = '\0'; /* Load core in new config. */ - - event_command(EVENT_CMD_PREPARE_DUMMY); - - return true; -} diff --git a/retroarch.h b/retroarch.h index 8298200698..13bad6a1df 100644 --- a/retroarch.h +++ b/retroarch.h @@ -63,6 +63,10 @@ enum rarch_ctl_state RARCH_ACTION_STATE_LOAD_CONTENT_IMAGEVIEWER, RARCH_ACTION_STATE_MENU_RUNNING, RARCH_ACTION_STATE_MENU_RUNNING_FINISHED, + /* Replaces currently loaded configuration file with + * another one. Will load a dummy core to flush state + * properly. */ + RARCH_ACTION_STATE_REPLACE_CONFIG, RARCH_ACTION_STATE_QUIT, RARCH_ACTION_STATE_FORCE_QUIT }; @@ -101,7 +105,7 @@ void rarch_main_new(void); void rarch_main_free(void); -void rarch_ctl(enum rarch_ctl_state state, void *data); +bool rarch_ctl(enum rarch_ctl_state state, void *data); /** * rarch_main_init: