use std::ffi::c_void;
use windows::Win32::System::Threading::{
GetCurrentProcess, IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS,
PROCESS_POWER_THROTTLING_CURRENT_VERSION, PROCESS_POWER_THROTTLING_EXECUTION_SPEED,
PROCESS_POWER_THROTTLING_STATE, ProcessPowerThrottling, SetPriorityClass,
SetProcessInformation, SetProcessWorkingSetSize,
};
pub fn set_efficiency_mode(on: bool) {
unsafe {
let process = GetCurrentProcess();
let state = PROCESS_POWER_THROTTLING_STATE {
Version: PROCESS_POWER_THROTTLING_CURRENT_VERSION,
ControlMask: PROCESS_POWER_THROTTLING_EXECUTION_SPEED,
StateMask: if on {
PROCESS_POWER_THROTTLING_EXECUTION_SPEED
} else {
0
},
};
let _ = SetProcessInformation(
process,
ProcessPowerThrottling,
&state as *const _ as *const c_void,
size_of_val(&state) as u32,
);
let class = if on {
IDLE_PRIORITY_CLASS
} else {
NORMAL_PRIORITY_CLASS
};
let _ = SetPriorityClass(process, class);
if on {
let _ = SetProcessWorkingSetSize(process, usize::MAX, usize::MAX);
}
}
}