diff --git a/backend/app.go b/backend/app.go index 2390eaf..50268d7 100644 --- a/backend/app.go +++ b/backend/app.go @@ -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 diff --git a/backend/nosleep_unsupported.go b/backend/nosleep_unsupported.go new file mode 100644 index 0000000..b082169 --- /dev/null +++ b/backend/nosleep_unsupported.go @@ -0,0 +1,7 @@ +//go:build !windows + +package backend + +func SetSystemSleepDisabled(disable bool) { + // no-op +} diff --git a/backend/nosleep_windows.go b/backend/nosleep_windows.go new file mode 100644 index 0000000..d605e5a --- /dev/null +++ b/backend/nosleep_windows.go @@ -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) +}