Optionally restore original power scheme when window loses focus.

This commit is contained in:
Nolan Darilek 2022-05-17 14:25:24 -05:00
parent af21188947
commit 013b5dccb4

View File

@ -1,11 +1,58 @@
use bevy::prelude::*;
use bevy::{prelude::*, window::WindowFocused};
#[cfg(windows)]
use windows::Win32::System::{Power, SystemServices::GUID_MIN_POWER_SAVINGS};
use windows::{
core::GUID,
Win32::System::{Power, SystemServices::GUID_MIN_POWER_SAVINGS},
};
fn setup() {
#[derive(Clone, Copy, Default)]
pub struct FullThrottleConfig {
pub restore_original_scheme_on_unfocus: bool,
}
#[cfg(windows)]
#[derive(Deref, DerefMut)]
struct DefaultScheme(GUID);
#[cfg(not(windows))]
struct DefaultScheme();
#[allow(unused_mut, unused_variables)]
fn setup(mut commands: Commands) {
#[cfg(windows)]
unsafe {
Power::PowerSetActiveScheme(None, &GUID_MIN_POWER_SAVINGS);
let mut active: *mut GUID = std::ptr::null_mut();
Power::PowerGetActiveScheme(None, &mut active);
if let Some(active) = active.as_ref() {
let scheme = DefaultScheme(*active);
commands.insert_resource(scheme);
}
}
}
#[allow(unused_variables)]
fn focus_change(
config: Option<Res<FullThrottleConfig>>,
mut focus: EventReader<WindowFocused>,
scheme: Res<DefaultScheme>,
) {
let config: FullThrottleConfig = config
.map(|v| *v)
.unwrap_or_else(|| FullThrottleConfig::default());
for event in focus.iter() {
if event.focused {
#[cfg(windows)]
unsafe {
Power::PowerSetActiveScheme(None, &GUID_MIN_POWER_SAVINGS);
}
} else {
#[cfg(windows)]
if config.restore_original_scheme_on_unfocus {
unsafe {
Power::PowerSetActiveScheme(None, &**scheme);
}
}
}
}
}
@ -13,6 +60,6 @@ pub struct FullThrottlePlugin;
impl Plugin for FullThrottlePlugin {
fn build(&self, app: &mut App) {
app.add_startup_system(setup);
app.add_startup_system(setup).add_system(focus_change);
}
}