Refactor menu_load_game and the content loading routine in

frontend.c
This commit is contained in:
twinaphex 2014-07-28 00:18:05 +02:00
parent 94580b7600
commit 1dfccb84e1
5 changed files with 91 additions and 100 deletions

View file

@ -283,18 +283,90 @@ void free_args(void *data, char **argv_copy, unsigned argv_size)
free(argv_copy[i]);
}
returntype main_entry(signature())
static void check_defaults_dirs(void)
{
if (*g_defaults.autoconfig_dir)
path_mkdir(g_defaults.autoconfig_dir);
if (*g_defaults.audio_filter_dir)
path_mkdir(g_defaults.audio_filter_dir);
if (*g_defaults.assets_dir)
path_mkdir(g_defaults.assets_dir);
if (*g_defaults.core_dir)
path_mkdir(g_defaults.core_dir);
if (*g_defaults.core_info_dir)
path_mkdir(g_defaults.core_info_dir);
if (*g_defaults.overlay_dir)
path_mkdir(g_defaults.overlay_dir);
if (*g_defaults.port_dir)
path_mkdir(g_defaults.port_dir);
if (*g_defaults.shader_dir)
path_mkdir(g_defaults.shader_dir);
if (*g_defaults.savestate_dir)
path_mkdir(g_defaults.savestate_dir);
if (*g_defaults.sram_dir)
path_mkdir(g_defaults.sram_dir);
if (*g_defaults.system_dir)
path_mkdir(g_defaults.system_dir);
}
bool main_load_content(int argc, char **argv, environment_get_t environ_get,
process_args_t process_args)
{
bool retval = true;
int *rarch_argc_ptr;
char **rarch_argv_ptr;
struct rarch_main_wrap *wrap_args;
declare_argc();
declare_argv();
args_type() args = (args_type())args_initial_ptr();
int ret, rarch_argc = 0;
char *rarch_argv[MAX_ARGS] = {NULL};
char *argv_copy[MAX_ARGS] = {NULL};
rarch_argv_ptr = (char**)argv;
rarch_argc_ptr = (int*)&argc;
(void)rarch_argc_ptr;
(void)rarch_argv_ptr;
wrap_args = (struct rarch_main_wrap*)calloc(1, sizeof(*wrap_args));
rarch_assert(wrap_args);
if (environ_get)
environ_get(rarch_argc_ptr, rarch_argv_ptr, NULL, wrap_args);
check_defaults_dirs();
if (wrap_args->touched)
{
rarch_main_init_wrap(wrap_args, &rarch_argc, rarch_argv);
memcpy(argv_copy, rarch_argv, sizeof(rarch_argv));
rarch_argv_ptr = (char**)rarch_argv;
rarch_argc_ptr = (int*)&rarch_argc;
}
if (g_extern.main_is_init)
rarch_main_deinit();
if ((ret = rarch_main_init(*rarch_argc_ptr, rarch_argv_ptr)))
{
retval = false;
goto error;
}
if (process_args)
process_args(rarch_argc_ptr, rarch_argv_ptr);
error:
free_args(wrap_args, argv_copy, ARRAY_SIZE(argv_copy));
free(wrap_args);
return retval;
}
returntype main_entry(signature())
{
declare_argc();
declare_argv();
args_type() args = (args_type())args_initial_ptr();
int ret = 0;
driver.frontend_ctx = (frontend_ctx_driver_t*)frontend_ctx_init_first();
if (!driver.frontend_ctx)
@ -306,62 +378,11 @@ returntype main_entry(signature())
rarch_main_clear_state();
rarch_init_msg_queue();
wrap_args = (struct rarch_main_wrap*)calloc(1, sizeof(*wrap_args));
rarch_assert(wrap_args);
rarch_argv_ptr = (char**)argv;
rarch_argc_ptr = (int*)&argc;
if (driver.frontend_ctx && driver.frontend_ctx->environment_get)
{
driver.frontend_ctx->environment_get(rarch_argc_ptr, rarch_argv_ptr, args, wrap_args);
if (*g_defaults.autoconfig_dir)
path_mkdir(g_defaults.autoconfig_dir);
if (*g_defaults.audio_filter_dir)
path_mkdir(g_defaults.audio_filter_dir);
if (*g_defaults.assets_dir)
path_mkdir(g_defaults.assets_dir);
if (*g_defaults.core_dir)
path_mkdir(g_defaults.core_dir);
if (*g_defaults.core_info_dir)
path_mkdir(g_defaults.core_info_dir);
if (*g_defaults.overlay_dir)
path_mkdir(g_defaults.overlay_dir);
if (*g_defaults.port_dir)
path_mkdir(g_defaults.port_dir);
if (*g_defaults.shader_dir)
path_mkdir(g_defaults.shader_dir);
if (*g_defaults.savestate_dir)
path_mkdir(g_defaults.savestate_dir);
if (*g_defaults.sram_dir)
path_mkdir(g_defaults.sram_dir);
if (*g_defaults.system_dir)
path_mkdir(g_defaults.system_dir);
}
if (wrap_args->touched)
{
g_extern.verbosity = true;
rarch_main_init_wrap(wrap_args, &rarch_argc, rarch_argv);
memcpy(argv_copy, rarch_argv, sizeof(rarch_argv));
rarch_argv_ptr = (char**)rarch_argv;
rarch_argc_ptr = (int*)&rarch_argc;
}
if (g_extern.main_is_init)
rarch_main_deinit();
if ((ret = rarch_main_init(*rarch_argc_ptr, rarch_argv_ptr)))
{
free_args(wrap_args, argv_copy, ARRAY_SIZE(argv_copy));
free(wrap_args);
if (!(main_load_content(argc, argv, driver.frontend_ctx->environment_get,
driver.frontend_ctx->process_args)))
return_var(ret);
}
#if defined(HAVE_MENU)
if (driver.frontend_ctx && driver.frontend_ctx->process_args)
driver.frontend_ctx->process_args(rarch_argc_ptr, rarch_argv_ptr, args);
g_extern.lifecycle_state |= (1ULL << MODE_GAME);
#if defined(RARCH_CONSOLE) || defined(RARCH_MOBILE)
@ -375,10 +396,6 @@ returntype main_entry(signature())
}
#endif
if (wrap_args)
free_args(wrap_args, argv_copy, ARRAY_SIZE(argv_copy));
free(wrap_args);
#if defined(HAVE_MAIN_LOOP)
#if defined(HAVE_MENU)
while (!main_entry_iterate(signature_expand(), args));

View file

@ -20,6 +20,8 @@
#include <stdint.h>
#include <stddef.h>
#include "../boolean.h"
#include "frontend_context.h"
#if defined(ANDROID)
#define args_type() struct android_app*
@ -39,6 +41,8 @@ int main_entry_iterate(signature(), args_type() args);
void main_exit(args_type() args);
returntype main_entry(signature());
void free_args(void *data, char **argv_copy, unsigned argv_size);
bool main_load_content(int argc, char **argv, environment_get_t environ_get,
process_args_t process_args);
#ifdef __cplusplus
}

View file

@ -28,16 +28,18 @@
extern "C" {
#endif
typedef void (*environment_get_t)(int *argc, char *argv[], void *args,
void *params_data);
typedef void (*process_args_t)(int *argc, char *argv[]);
typedef struct frontend_ctx_driver
{
void (*environment_get)(int *argc, char *argv[], void *args,
void *params_data);
environment_get_t environment_get;
void (*init)(void *data);
void (*deinit)(void *data);
void (*exitspawn)(char *core_path, size_t sizeof_core_path);
void (*process_args)(int *argc, char *argv[], void *args);
process_args_t process_args;
int (*process_events)(void *data);
void (*exec)(const char *, bool);
void (*shutdown)(bool);

View file

@ -195,37 +195,9 @@ static void menu_environment_get(int *argc, char *argv[], void *args, void *para
bool load_menu_game(void)
{
int *rarch_argc_ptr;
char **rarch_argv_ptr;
struct rarch_main_wrap *wrap_args;
int ret, rarch_argc = 0;
char *rarch_argv[MAX_ARGS] = {NULL};
char *argv_copy[MAX_ARGS] = {NULL};
(void)rarch_argc_ptr;
(void)rarch_argv_ptr;
wrap_args = (struct rarch_main_wrap*)calloc(1, sizeof(*wrap_args));
rarch_assert(wrap_args);
menu_environment_get(rarch_argc_ptr, rarch_argv_ptr, NULL, wrap_args);
if (wrap_args->touched)
if (!(main_load_content(0, NULL, menu_environment_get,
driver.frontend_ctx->process_args)))
{
rarch_main_init_wrap(wrap_args, &rarch_argc, rarch_argv);
memcpy(argv_copy, rarch_argv, sizeof(rarch_argv));
rarch_argv_ptr = (char**)rarch_argv;
rarch_argc_ptr = (int*)&rarch_argc;
}
if (g_extern.main_is_init)
rarch_main_deinit();
if ((ret = rarch_main_init(rarch_argc, rarch_argv)))
{
free_args(wrap_args, argv_copy, ARRAY_SIZE(argv_copy));
free(wrap_args);
char name[PATH_MAX], msg[PATH_MAX];
fill_pathname_base(name, g_extern.fullpath, sizeof(name));
@ -238,10 +210,6 @@ bool load_menu_game(void)
return false;
}
if (wrap_args)
free_args(wrap_args, argv_copy, ARRAY_SIZE(argv_copy));
free(wrap_args);
// Update menu state which depends on config.
if (driver.menu)
menu_update_libretro_info(driver.menu);

View file

@ -301,7 +301,7 @@ static void frontend_gx_exitspawn(char *core_path, size_t sizeof_core_path)
frontend_gx_exec(core_path, should_load_game);
}
static void frontend_gx_process_args(int *argc, char *argv[], void *args)
static void frontend_gx_process_args(int *argc, char *argv[])
{
#ifndef IS_SALAMANDER
// a big hack: sometimes salamander doesn't save the new core it loads on first boot,