diff --git a/frontend/frontend.c b/frontend/frontend.c index bc8d644e1b..abb93948e7 100644 --- a/frontend/frontend.c +++ b/frontend/frontend.c @@ -276,14 +276,32 @@ void main_exit(args_type() args) driver.frontend_ctx->shutdown(false); } +static void free_args(struct rarch_main_wrap *wrap_args, + char *argv_copy[]) +{ + int i; + for (i = 0; i < ARRAY_SIZE(argv_copy); i++) + if (argv_copy[i]) + free(argv_copy[i]); + + free(wrap_args); +} + returntype main_entry(signature()) { - int ret; + int ret, rarch_argc; + char *rarch_argv[MAX_ARGS], *argv_copy[MAX_ARGS]; + 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(); + wrap_args = NULL; driver.frontend_ctx = (frontend_ctx_driver_t*)frontend_ctx_init_first(); + rarch_argv_ptr = (char**)argv; + rarch_argc_ptr = (int*)&argc; if (!driver.frontend_ctx) { @@ -298,7 +316,7 @@ returntype main_entry(signature()) if (driver.frontend_ctx && driver.frontend_ctx->environment_get) { - driver.frontend_ctx->environment_get(&argc, argv, args); + driver.frontend_ctx->environment_get(rarch_argc_ptr, rarch_argv_ptr, args, wrap_args); #if defined(RARCH_CONSOLE) || defined(RARCH_MOBILE) if (*default_paths.autoconfig_dir) path_mkdir(default_paths.autoconfig_dir); @@ -323,13 +341,30 @@ returntype main_entry(signature()) if (*default_paths.system_dir) path_mkdir(default_paths.system_dir); #endif + + if (wrap_args) + { + rarch_main_init_wrap(wrap_args, &rarch_argc, rarch_argv); + + if (rarch_argc > 0) + { + memcpy(argv_copy, rarch_argv, sizeof(rarch_argv)); + rarch_argv_ptr = (char**)rarch_argv; + rarch_argc_ptr = (int*)&rarch_argc; + } + } } - if ((ret = rarch_main_init(argc, argv))) return_var(ret); + if ((ret = rarch_main_init(*rarch_argc_ptr, rarch_argv_ptr))) + { + free_args(wrap_args, argv_copy); + return_var(ret); + } #if defined(HAVE_MENU) if (driver.frontend_ctx && driver.frontend_ctx->process_args) - ret = driver.frontend_ctx->process_args(&argc, argv, args); + ret = driver.frontend_ctx->process_args(rarch_argc_ptr, rarch_argv_ptr, args); + g_extern.lifecycle_state |= (1ULL << MODE_GAME); @@ -342,7 +377,12 @@ returntype main_entry(signature()) if (!g_extern.libretro_dummy) menu_rom_history_push_current(); } +#endif + if (wrap_args) + free_args(wrap_args, argv_copy); + +#if defined(HAVE_MENU) while (!main_entry_iterate(signature_expand(), args)); #else while ((g_extern.is_paused && !g_extern.is_oneshot) ? rarch_main_idle_iterate() : rarch_main_iterate()); diff --git a/frontend/frontend_context.h b/frontend/frontend_context.h index 834ba9ad23..a36cd3177c 100644 --- a/frontend/frontend_context.h +++ b/frontend/frontend_context.h @@ -29,7 +29,8 @@ extern "C" { typedef struct frontend_ctx_driver { - void (*environment_get)(int *argc, char *argv[], void *args); + void (*environment_get)(int *argc, char *argv[], void *args, + void *params_data); void (*init)(void *data); void (*deinit)(void *data); diff --git a/frontend/frontend_salamander.c b/frontend/frontend_salamander.c index 14ab1834a4..bcae1b2c43 100644 --- a/frontend/frontend_salamander.c +++ b/frontend/frontend_salamander.c @@ -89,7 +89,10 @@ static void find_first_libretro_core(char *first_file, int main(int argc, char *argv[]) { void *args = NULL; + struct rarch_main_wrap *wrap_args; + frontend_ctx_driver_t *frontend_ctx = (frontend_ctx_driver_t*)frontend_ctx_init_first(); + wrap_args = NULL; if (!frontend_ctx) return 0; @@ -98,7 +101,7 @@ int main(int argc, char *argv[]) frontend_ctx->init(args); if (frontend_ctx && frontend_ctx->environment_get) - frontend_ctx->environment_get(&argc, argv, args); + frontend_ctx->environment_get(&argc, argv, args, wrap_args); if (frontend_ctx && frontend_ctx->salamander_init) frontend_ctx->salamander_init(); diff --git a/frontend/platform/platform_android.c b/frontend/platform/platform_android.c index 879c8a6bab..42e371a6f9 100644 --- a/frontend/platform/platform_android.c +++ b/frontend/platform/platform_android.c @@ -407,7 +407,8 @@ static bool android_run_events (void *data) return true; } -static void frontend_android_get_environment_settings(int *argc, char *argv[], void *data) +static void frontend_android_get_environment_settings(int *argc, char *argv[], + void *data, void *params_data) { JNIEnv *env; jobject obj = NULL; diff --git a/frontend/platform/platform_gx.c b/frontend/platform/platform_gx.c index b06538266a..e308c43c34 100644 --- a/frontend/platform/platform_gx.c +++ b/frontend/platform/platform_gx.c @@ -217,7 +217,8 @@ int gx_logger_file(struct _reent *r, int fd, const char *ptr, size_t len) extern char gx_rom_path[PATH_MAX]; #endif -static void frontend_gx_get_environment_settings(int *argc, char *argv[], void *args) +static void frontend_gx_get_environment_settings(int *argc, char *argv[], + void *args, void *params_data) { #ifndef IS_SALAMANDER #if defined(HAVE_LOGGER) diff --git a/frontend/platform/platform_ps3.c b/frontend/platform/platform_ps3.c index 57c5be46a6..6ea2855ba2 100644 --- a/frontend/platform/platform_ps3.c +++ b/frontend/platform/platform_ps3.c @@ -167,7 +167,8 @@ static void callback_sysutil_exit(uint64_t status, uint64_t param, void *userdat } #endif -static void frontend_ps3_get_environment_settings(int *argc, char *argv[], void *args) +static void frontend_ps3_get_environment_settings(int *argc, char *argv[], + void *args, void *params_data) { #ifndef IS_SALAMANDER bool original_verbose = g_extern.verbose; diff --git a/frontend/platform/platform_psp.c b/frontend/platform/platform_psp.c index 97eaf4bb7e..afba3b4d17 100644 --- a/frontend/platform/platform_psp.c +++ b/frontend/platform/platform_psp.c @@ -44,7 +44,8 @@ static int exit_callback(int arg1, int arg2, void *common) return 0; } -static void frontend_psp_get_environment_settings(int *argc, char *argv[], void *args) +static void frontend_psp_get_environment_settings(int *argc, char *argv[], + void *args, void *params_data) { (void)args; #ifndef IS_SALAMANDER diff --git a/frontend/platform/platform_qnx.c b/frontend/platform/platform_qnx.c index bbc35eff18..414532fba3 100644 --- a/frontend/platform/platform_qnx.c +++ b/frontend/platform/platform_qnx.c @@ -23,7 +23,8 @@ #include "../../dynamic.h" #include "../../libretro_private.h" -static void frontend_qnx_get_environment_settings(int *argc, char *argv[], void *args) +static void frontend_qnx_get_environment_settings(int *argc, char *argv[], + void *args, void *params_data) { (void)argc; (void)argv; diff --git a/frontend/platform/platform_xdk.c b/frontend/platform/platform_xdk.c index 59ce09483f..3f8e58d7d4 100644 --- a/frontend/platform/platform_xdk.c +++ b/frontend/platform/platform_xdk.c @@ -192,7 +192,8 @@ static HRESULT xbox_io_unmount(char *szDrive) } #endif -static void frontend_xdk_get_environment_settings(int *argc, char *argv[], void *args) +static void frontend_xdk_get_environment_settings(int *argc, char *argv[], + void *args, void *params_data) { HRESULT ret; (void)ret;