Files
wehub-resource-sync 1d1286fadb
Build / Build and test (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:18:38 +08:00

85 lines
2.7 KiB
Swift

import Foundation
import OSLog
import SwiftUI
import MacToolsPluginKit
public final class DisplaySleepPluginFactory: NSObject, MacToolsPluginBundleFactory {
public static func makeProvider(context: PluginRuntimeContext) throws -> any PluginProvider {
DisplaySleepPluginProvider(context: context)
}
}
@MainActor
private struct DisplaySleepPluginProvider: PluginProvider {
let context: PluginRuntimeContext
func makePlugins() -> [any MacToolsPlugin] {
[DisplaySleepPlugin(localization: PluginLocalization(bundle: context.resourceBundle))]
}
}
@MainActor
final class DisplaySleepPlugin: MacToolsPlugin, PluginPrimaryPanel {
let metadata: PluginMetadata
let primaryPanelDescriptor: PluginPrimaryPanelDescriptor
var onStateChange: (() -> Void)?
var requestPermissionGuidance: ((String) -> Void)?
var shortcutBindingResolver: ((String) -> ShortcutBinding?)?
private let logger = Logger(
subsystem: Bundle.main.bundleIdentifier ?? "cc.ggbond.mactools",
category: "DisplaySleepPlugin"
)
init(localization: PluginLocalization = PluginLocalization(bundle: .main)) {
self.metadata = PluginMetadata(
id: "display-sleep",
title: localization.string("metadata.title", defaultValue: "显示器休眠"),
iconName: "display",
iconTint: Color(nsColor: .systemIndigo),
order: 97,
defaultDescription: localization.string("metadata.description", defaultValue: "立即让显示器休眠")
)
self.primaryPanelDescriptor = PluginPrimaryPanelDescriptor(
controlStyle: .button,
menuActionBehavior: .dismissBeforeHandling,
buttonTitleProvider: { localization.string("panel.button.sleep", defaultValue: "休眠") }
)
}
var primaryPanelState: PluginPanelState {
PluginPanelState(
subtitle: metadata.defaultDescription,
isOn: false,
isExpanded: false,
isEnabled: true,
isVisible: true,
detail: nil,
errorMessage: nil
)
}
func handleAction(_ action: PluginPanelAction) {
guard case let .invokeAction(controlID) = action, controlID == "execute" else {
return
}
sleepDisplays()
}
private func sleepDisplays() {
let task = Process()
task.executableURL = URL(fileURLWithPath: "/usr/bin/pmset")
task.arguments = ["displaysleepnow"]
do {
try task.run()
logger.info("Requested display sleep via pmset")
} catch {
logger.error("Failed to invoke pmset displaysleepnow: \(error.localizedDescription)")
}
}
}