/** * menu_free: * @menu : Menu handle. * * Frees a menu handle **/ void menu_free(menu_handle_t *menu) { global_t *global = global_get_ptr(); menu_display_t *disp = menu_display_get_ptr(); if (!menu || !disp) return; if (menu->playlist) content_playlist_free(menu->playlist); menu->playlist = NULL; menu_shader_free(menu); menu_driver_free(menu); #ifdef HAVE_DYNAMIC libretro_free_system_info(&global->menu.info); #endif menu_display_free(menu); menu_free_list(&menu->entries); event_command(EVENT_CMD_HISTORY_DEINIT); if (global->core_info) core_info_list_free(global->core_info); if (global->core_info_current) free(global->core_info_current); global->core_info_current = NULL; menu_driver_unset_alive(); free(menu); }
void rarch_main_set_state(unsigned cmd) { driver_t *driver = driver_get_ptr(); global_t *global = global_get_ptr(); settings_t *settings = config_get_ptr(); switch (cmd) { case RARCH_ACTION_STATE_MENU_RUNNING: #ifdef HAVE_MENU { menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return; menu_driver_toggle(true); /* Menu should always run with vsync on. */ event_command(EVENT_CMD_VIDEO_SET_BLOCKING_STATE); /* Stop all rumbling before entering the menu. */ event_command(EVENT_CMD_RUMBLE_STOP); if (settings->menu.pause_libretro) event_command(EVENT_CMD_AUDIO_STOP); /* Override keyboard callback to redirect to menu instead. * We'll use this later for something ... * FIXME: This should probably be moved to menu_common somehow. */ if (global) { global->frontend_key_event = global->system.key_event; global->system.key_event = menu_input_key_event; global->system.frame_time_last = 0; } menu_set_refresh(); menu_driver_set_alive(); } #endif break; case RARCH_ACTION_STATE_LOAD_CONTENT: #ifdef HAVE_MENU /* If content loading fails, we go back to menu. */ if (!menu_load_content()) rarch_main_set_state(RARCH_ACTION_STATE_MENU_RUNNING); #endif if (driver->frontend_ctx && driver->frontend_ctx->content_loaded) driver->frontend_ctx->content_loaded(); break; case RARCH_ACTION_STATE_MENU_RUNNING_FINISHED: #ifdef HAVE_MENU menu_setting_apply_deferred(); menu_driver_toggle(false); menu_driver_unset_alive(); driver_set_nonblock_state(driver->nonblock_state); if (settings && settings->menu.pause_libretro) event_command(EVENT_CMD_AUDIO_START); /* Prevent stray input from going to libretro core */ driver->flushing_input = true; /* Restore libretro keyboard callback. */ if (global) global->system.key_event = global->frontend_key_event; #endif video_driver_set_texture_enable(false, false); break; case RARCH_ACTION_STATE_QUIT: if (global) global->system.shutdown = true; rarch_main_set_state(RARCH_ACTION_STATE_MENU_RUNNING_FINISHED); break; case RARCH_ACTION_STATE_FORCE_QUIT: if (global) global->lifecycle_state = 0; rarch_main_set_state(RARCH_ACTION_STATE_QUIT); break; case RARCH_ACTION_STATE_NONE: default: break; } }