diff --git a/frontend/frontend.c b/frontend/frontend.c index d60a7fe69e..934cfe528b 100644 --- a/frontend/frontend.c +++ b/frontend/frontend.c @@ -166,6 +166,12 @@ static void rarch_get_environment_console(void) #define attempt_load_game_fails (1ULL << MODE_EXIT) #endif +#if defined(RARCH_CONSOLE) +#define load_dummy_on_core_shutdown false +#else +#define load_dummy_on_core_shutdown true +#endif + #define frontend_init_enable true #define menu_init_enable true #define initial_lifecycle_state_preinit false @@ -176,7 +182,15 @@ int main_entry_iterate(signature(), args_type() args) static retro_keyboard_event_t key_event; if (g_extern.system.shutdown) - return 1; + { +#ifdef HAVE_MENU + // Load dummy core instead of exiting RetroArch completely. + if (load_dummy_on_core_shutdown) + load_menu_game_prepare_dummy(); + else +#endif + return 1; + } else if (g_extern.lifecycle_state & (1ULL << MODE_LOAD_GAME)) { load_menu_game_prepare(); diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index 016c3c2dbe..286edf1e99 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -347,6 +347,17 @@ static void menu_update_libretro_info(void) rgui->core_info = core_info_list_new(rgui->libretro_dir); } +void load_menu_game_prepare_dummy(void) +{ + // Starts dummy core. + *g_extern.fullpath = '\0'; + rgui->load_no_rom = false; + + g_extern.lifecycle_state |= (1ULL << MODE_LOAD_GAME); + g_extern.lifecycle_state &= ~(1ULL << MODE_GAME); + g_extern.system.shutdown = false; +} + bool load_menu_game(void) { if (g_extern.main_is_init) diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index fd769cd589..a602e682a8 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -359,6 +359,7 @@ void menu_parse_and_resolve(void *data, unsigned menu_type); void menu_init_core_info(void *data); void load_menu_game_prepare(void); +void load_menu_game_prepare_dummy(void); bool load_menu_game(void); void load_menu_game_history(unsigned game_index); extern void load_menu_game_new_core(void);