Merge pull request #425 from dweymouth/feat/prevent-sleep

Prevent sleep on Windows when playing
This commit is contained in:
Drew Weymouth
2024-07-24 08:13:34 -07:00
committed by GitHub
3 changed files with 53 additions and 0 deletions
+10
View File
@@ -127,6 +127,16 @@ func StartupApp(appName, displayAppName, appVersionTag, latestReleaseURL string)
_, _ = a.ImageManager.GetCoverThumbnail(coverID)
})
a.PlaybackManager.OnPlaying(func() {
SetSystemSleepDisabled(true)
})
a.PlaybackManager.OnPaused(func() {
SetSystemSleepDisabled(false)
})
a.PlaybackManager.OnStopped(func() {
SetSystemSleepDisabled(false)
})
// Start IPC server if another not already running in a different instance
if cli == nil {
ipc.DestroyConn() // cleanup socket possibly orphaned by crashed process
+7
View File
@@ -0,0 +1,7 @@
//go:build !windows
package backend
func SetSystemSleepDisabled(disable bool) {
// no-op
}
+36
View File
@@ -0,0 +1,36 @@
//go:build windows
package backend
import (
"sync/atomic"
"syscall"
)
const (
ES_CONTINUOUS uint = 0x80000000
ES_SYSTEM_REQUIRED uint = 0x00000001
)
var (
sleepDisabled atomic.Bool
executionState *syscall.LazyProc
)
func SetSystemSleepDisabled(disable bool) {
if old := sleepDisabled.Swap(disable); old == disable {
return
}
if executionState == nil {
kernel32 := syscall.NewLazyDLL("kernel32.dll")
executionState = kernel32.NewProc("SetThreadExecutionState")
}
uType := ES_CONTINUOUS
if disable {
uType |= ES_SYSTEM_REQUIRED
}
syscall.SyscallN(executionState.Addr(), 1, uintptr(uType), 0, 0)
}