fix sleep win

This commit is contained in:
yourok
2023-04-26 19:01:55 +03:00
parent c951bef034
commit 4e1935ef19

View File

@@ -13,6 +13,7 @@ import (
const ( const (
EsSystemRequired = 0x00000001 EsSystemRequired = 0x00000001
EsAwaymodeRequired = 0x00000040 // Added for future improvements
EsContinuous = 0x80000000 EsContinuous = 0x80000000
) )
@@ -23,20 +24,32 @@ func Preconfig(kill bool) {
// don't sleep/hibernate windows // don't sleep/hibernate windows
kernel32 := syscall.NewLazyDLL("kernel32.dll") kernel32 := syscall.NewLazyDLL("kernel32.dll")
setThreadExecStateProc := kernel32.NewProc("SetThreadExecutionState") setThreadExecStateProc := kernel32.NewProc("SetThreadExecutionState")
currentExecState := uintptr(EsContinuous)
normalExecutionState := uintptr(EsContinuous)
systemRequireState := uintptr(EsSystemRequired | EsContinuous)
pulse := time.NewTicker(pulseTime) pulse := time.NewTicker(pulseTime)
for { for {
select { select {
case <-pulse.C: case <-pulse.C:
{ {
send := false systemRequired := false
for _, torrent := range torr.ListTorrent() { for _, torrent := range torr.ListTorrent() {
if torrent.Stat != state.TorrentInDB { if torrent.Stat != state.TorrentInDB {
send = true systemRequired = true
break break
} }
} }
if send { if systemRequired && currentExecState != systemRequireState {
setThreadExecStateProc.Call(uintptr(EsSystemRequired)) // Looks like sending just EsSystemRequired to clear timer is broken in Win11.
// Enable system required to avoid the system to idle to sleep.
currentExecState = systemRequireState
setThreadExecStateProc.Call(systemRequireState)
}
if !systemRequired && currentExecState != normalExecutionState {
// Clear EXECUTION_STATE flags to disable away mode and allow the system to idle to sleep normally.
currentExecState = normalExecutionState
setThreadExecStateProc.Call(normalExecutionState)
} }
} }
} }