43 lines
1.4 KiB
Rust
43 lines
1.4 KiB
Rust
use prometeu_hal::RuntimePlatform;
|
|
use prometeu_hal::app_mode::AppMode;
|
|
use prometeu_hal::log::LogSource;
|
|
use prometeu_system::task::TaskId;
|
|
use prometeu_system::{LifecycleError, SystemOS};
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub(crate) enum ResidentGameTerminationOutcome {
|
|
NoResidentGame,
|
|
Terminated { task_id: TaskId, title: String },
|
|
}
|
|
|
|
pub(crate) fn terminate_resident_game(
|
|
os: &mut SystemOS,
|
|
platform: &mut dyn RuntimePlatform,
|
|
log_manual_hub_kill: bool,
|
|
) -> Result<ResidentGameTerminationOutcome, LifecycleError> {
|
|
let Some(task_id) = os.lifecycle().resident_game_task() else {
|
|
return Ok(ResidentGameTerminationOutcome::NoResidentGame);
|
|
};
|
|
|
|
let title = os
|
|
.sessions()
|
|
.vm_session_for_task(task_id)
|
|
.map(|session| session.title.clone())
|
|
.unwrap_or_else(|| "<unknown>".to_string());
|
|
|
|
let terminated = os.lifecycle().terminate_resident_game()?;
|
|
let Some(task_id) = terminated else {
|
|
return Ok(ResidentGameTerminationOutcome::NoResidentGame);
|
|
};
|
|
|
|
os.vm().transition_render_owner(AppMode::Shell, 0);
|
|
platform.game2d_frame_composer().unbind_scene();
|
|
platform.assets_mut().shutdown();
|
|
|
|
if log_manual_hub_kill {
|
|
os.info(LogSource::Hub, format!("Resident game killed from Hub: {title}"));
|
|
}
|
|
|
|
Ok(ResidentGameTerminationOutcome::Terminated { task_id, title })
|
|
}
|