iOS/Sources/Shared/Environment/MacBridgeProtocol.swift

113 lines
4.1 KiB
Swift

import CoreGraphics
import Foundation
// Must be @objc so we get the same reference in memory, since we're not directly loading the bundle
@objc(MacBridge) public protocol MacBridge: NSObjectProtocol {
init()
var deviceName: String { get }
var distributedNotificationCenter: NotificationCenter { get }
var workspaceNotificationCenter: NotificationCenter { get }
var networkConnectivity: MacBridgeNetworkConnectivity { get }
var networkConnectivityDidChangeNotification: Notification.Name { get }
var terminationWillBeginNotification: Notification.Name { get }
var screens: [MacBridgeScreen] { get }
var screensWillChangeNotification: Notification.Name { get }
var frontmostApplication: MacBridgeRunningApplication? { get }
var frontmostApplicationDidChangeNotification: Notification.Name { get }
var activationPolicy: MacBridgeActivationPolicy { get set }
func configureStatusItem(using configuration: MacBridgeStatusItemConfiguration)
func configureStatusItem(title: String)
func setLoginItem(forBundleIdentifier: String, enabled: Bool) -> Bool
func isLoginItemEnabled(forBundleIdentifier identifier: String) -> Bool
}
@objc(MacBridgeStatusItemCallbackInfo) public protocol MacBridgeStatusItemCallbackInfo {
var isActive: Bool { get }
func activate()
func deactivate()
func terminate()
}
// not actually possible to represent, via swift into objc and back into swift, the OptionSet import of this
@objc(MacBridgeStatusModifierMask) public enum MacBridgeStatusModifierMask: Int {
case capsLock = 0b1 // Set if Caps Lock key is pressed.
case shift = 0b10 // Set if Shift key is pressed.
case control = 0b100 // Set if Control key is pressed.
case option = 0b1000 // Set if Option or Alternate key is pressed.
case command = 0b10000 // Set if Command key is pressed.
case numericPad = 0b100000 // Set if any key in the numeric keypad is pressed.
case help = 0b1000000 // Set if the Help key is pressed.
case function = 0b1000_0000 // Set if any function key is pressed.
}
@objc(MacBridgeStatusItemActionInfo) public protocol MacBridgeStatusItemMenuItem {
var name: String { get }
var image: CGImage? { get }
var imageSize: CGSize { get }
var isSeparator: Bool { get }
var keyEquivalentModifierMask: Int { get }
var keyEquivalent: String { get }
var subitems: [MacBridgeStatusItemMenuItem] { get }
var primaryActionHandler: (MacBridgeStatusItemCallbackInfo) -> Void { get }
}
@objc(MacBridgeStatusItemConfiguration) public protocol MacBridgeStatusItemConfiguration {
var isVisible: Bool { get }
var image: CGImage { get }
var imageSize: CGSize { get }
var accessibilityLabel: String { get }
var items: [MacBridgeStatusItemMenuItem] { get }
var primaryActionHandler: (MacBridgeStatusItemCallbackInfo) -> Void { get }
}
@objc(MacBridgeActivationPolicy) public enum MacBridgeActivationPolicy: Int {
case regular
case accessory
case prohibited
}
@objc(MacBridgeNetworkType) public enum MacBridgeNetworkType: Int {
case ethernet
case wifi
case noNetwork
case unknown
}
@objc(MacBridgeNetworkConnectivity) public protocol MacBridgeNetworkConnectivity: NSObjectProtocol {
var networkType: MacBridgeNetworkType { get }
var hasWiFi: Bool { get }
var wifi: MacBridgeWiFi? { get }
var interface: MacBridgeNetworkInterface? { get }
}
@objc(MacBridgeNetworkInterface) public protocol MacBridgeNetworkInterface: NSObjectProtocol {
var name: String { get }
var hardwareAddress: String { get }
}
@objc(MacBridgeWiFiConnectivity) public protocol MacBridgeWiFi: NSObjectProtocol {
var ssid: String { get }
var bssid: String { get }
}
@objc(MacBridgeScreen) public protocol MacBridgeScreen: NSObjectProtocol {
var identifier: String { get }
var name: String { get }
}
@objc(MacBridgeRunningApplication) public protocol MacBridgeRunningApplication: NSObjectProtocol {
var localizedName: String? { get }
var bundleIdentifier: String? { get }
var launchDate: Date? { get }
var isHidden: Bool { get }
var ownsMenuBar: Bool { get }
}