use bevy::prelude::*;
#[allow(unused_imports)]
use crate::SpeedupAdjustments;
#[derive(Resource, Reflect, Debug, Default)]
#[reflect(Resource)]
pub enum UnattendedAdjustment {
#[default]
NotImplemented,
Completed,
Failed,
}
#[derive(Debug)]
pub struct UnattendedPlugin;
impl Plugin for UnattendedPlugin {
fn build(
&self,
_app: &mut App,
) {
#[cfg(target_os = "windows")]
{
_app.add_systems(PreStartup, adjust_unattended_windows)
}
}
}
#[cfg(target_os = "windows")]
fn adjust_unattended_windows(mut adjustments: ResMut<'_, SpeedupAdjustments>) {
#[allow(unsafe_code)]
unsafe {
use windows::Win32::System::Power::{
ES_CONTINUOUS,
ES_DISPLAY_REQUIRED,
ES_SYSTEM_REQUIRED,
SetThreadExecutionState,
};
let flags = ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED;
let result = SetThreadExecutionState(flags);
if result.0 == 0 {
warn!("Unable to adjust thread execution state");
adjustments.unattended = UnattendedAdjustment::Failed;
} else {
info!("Adjusted execution state to prevent suspension");
adjustments.unattended = UnattendedAdjustment::Completed;
}
}
return;
}