diff options
| author | Grégoire Duchêne <gduchene@awhk.org> | 2025-11-02 19:27:32 +0000 |
|---|---|---|
| committer | Grégoire Duchêne <gduchene@awhk.org> | 2025-11-02 19:29:30 +0000 |
| commit | c7d428455c42e8039a6aedeb032b0685d7a47ebb (patch) | |
| tree | f2b2b176fea7d019d578a873fc23af70f54f829a /Sources/SleepInhibitor.swift | |
| parent | aee698176a33879e7cb5b23e89157104c4b05c19 (diff) | |
First version of the CLI
It’s pretty basic, and it only works on macOS for now.
Diffstat (limited to 'Sources/SleepInhibitor.swift')
| -rw-r--r-- | Sources/SleepInhibitor.swift | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/Sources/SleepInhibitor.swift b/Sources/SleepInhibitor.swift new file mode 100644 index 0000000..0cfe895 --- /dev/null +++ b/Sources/SleepInhibitor.swift @@ -0,0 +1,48 @@ +import IOKit.pwr_mgt + +actor SleepInhibitor { + var assertionID = IOPMAssertionID?.none + var isInhibitingSleep: Bool { self.assertionID != nil } + + func create(name: String, details: String) throws { + guard self.assertionID == nil else { + return + } + + var assertionID = IOPMAssertionID(0) + let ioReturn = IOPMAssertionCreateWithDescription( + kIOPMAssertionTypePreventUserIdleSystemSleep as CFString, + name as CFString, + details as CFString, + nil, nil, 0, nil, + &assertionID + ) + guard ioReturn == kIOReturnSuccess else { + throw SleepInhibitorError(ioReturn: ioReturn) + } + self.assertionID = assertionID + } + + func release() throws { + guard let assertionID = self.assertionID else { + return + } + + let ioReturn = IOPMAssertionRelease(assertionID) + guard ioReturn == kIOReturnSuccess else { + throw SleepInhibitorError(ioReturn: ioReturn) + } + self.assertionID = nil + } +} + +struct SleepInhibitorError: CustomStringConvertible, Error { + let ioReturn: IOReturn + + var description: String { + guard let cString = mach_error_string(self.ioReturn) else { + return self.ioReturn.description + } + return String(cString: cString) + } +} |
