aerospace fork
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220import AppKitimport Darwinimport Foundation
public let socketPath = "/tmp/\(aeroSpaceAppId)-\(unixUserName).sock"public let unixUserName = NSUserName()public let mainModeId = "main"
@TaskLocalpublic var refreshSessionEvent: RefreshSessionEvent? = nil
@TaskLocalprivate var recursionDetectorDuringTermination = false
public func bugPrompt( _ __message: String = "", isDie: Bool = false, file: StaticString = #fileID, line: Int = #line, column: Int = #column, function: String = #function,) -> String { let _message = __message.contains("\n") ? "\n" + __message.prefixLines(with: " ") : __message let thread = Thread.current return """ Please report to: https://github.com/nagasrinath/DeeWM/discussions/categories/potential-bugs Please describe what you did to trigger this error
Message: \(_message) Version: \(aeroSpaceAppVersion) Git hash: \(gitHash) refreshSessionEvent: \(refreshSessionEvent.prettyDescription) Date: \(Date.now) Thread name: \(thread.name.prettyDescription) Is main thread: \(thread.isMainThread) axTaskLocalAppThreadToken: \(axTaskLocalAppThreadToken.prettyDescription) macOS version: \(ProcessInfo().operatingSystemVersionString) Coordinate: \(file):\(line):\(column) \(function) recursionDetectorDuringTermination: \(recursionDetectorDuringTermination) cli: \(isCli) die: \(isDie) Monitor count: \(NSScreen.screens.count) Displays have separate spaces: \(NSScreen.screensHaveSeparateSpaces)
Stacktrace: \(getStringStacktrace()) """}
public func dieT<T>( _ __message: String = "", file: StaticString = #fileID, line: Int = #line, column: Int = #column, function: String = #function,) -> T { let message = bugPrompt(__message, isDie: true, file: file, line: line, column: column, function: function) if !isUnitTest && isServer { showMessageInGui( filenameIfConsoleApp: recursionDetectorDuringTermination ? "deewm-runtime-error-recursion.txt" : "deewm-runtime-error.txt", title: "DeeWM Runtime Error", message: message, ) } if let terminationHandler, !recursionDetectorDuringTermination { MainActor.runSync { $recursionDetectorDuringTermination.withValue(true) { terminationHandler.beforeTermination() } } } fatalError("\n" + message)}
extension MainActor { static func runSync(block: @escaping @MainActor () -> ()) { switch Thread.isMainThread { case true: MainActor.assumeIsolated(block) case false: DispatchQueue.main.asyncAndWait { block() } } }}
public enum RefreshSessionEvent: Sendable, CustomStringConvertible { case configAutoReload case globalObserver(String) case globalObserverLeftMouseUp case menuBarButton case hotkeyBinding case startup case socketServer(any CmdArgs) case resetManipulatedWithMouse case ax(String) case focusFollowsMouse
public var isStartup: Bool { if case .startup = self { return true } else { return false } }
public var isFocusFollowsMouse: Bool { if case .focusFollowsMouse = self { return true } else { return false } }
public var description: String { switch self { case .ax(let str): "ax(\(str))" case .configAutoReload: "configAutoReload" case .globalObserver(let str): "globalObserver(\(str))" case .globalObserverLeftMouseUp: "globalObserverLeftMouseUp" case .hotkeyBinding: "hotkeyBinding" case .menuBarButton: "menuBarButton" case .resetManipulatedWithMouse: "resetManipulatedWithMouse" case .socketServer(let args): "socketServer: \(args)" case .startup: "startup" case .focusFollowsMouse: "focusFollowsMouse" } }}
// periphery:ignorepublic func throwT<T, E: Error>(_ error: E) throws(E) -> T { throw error }
public func getStringStacktrace() -> String { Thread.callStackSymbols.joined(separator: "\n") }
@inlinable public func die( _ message: String = "", file: StaticString = #fileID, line: Int = #line, column: Int = #column, function: String = #function,) -> Never { dieT(message, file: file, line: line, column: column, function: function)}
public func check( _ condition: Bool, _ message: @autoclosure () -> String = "", file: StaticString = #fileID, line: Int = #line, column: Int = #column, function: String = #function,) { if !condition { die(message(), file: file, line: line, column: column, function: function) }}
public var isUnitTest: Bool { NSClassFromString("XCTestCase") != nil }
extension CaseIterable where Self: RawRepresentable, RawValue == String { public static var cliArgsCases: [String] { allCases.map(\.rawValue) } public static var unionLiteral: String { cliArgsCases.joinedCliArgs }}
extension [String] { public var joinedCliArgs: String { "(" + self.joined(separator: "|") + ")" }}
extension Int { public func toDouble() -> Double { Double(self) }}
public func + <K, V>(lhs: [K: V], rhs: [K: V]) -> [K: V] { lhs.merging(rhs) { _, r in r }}
extension String { public func removePrefix(_ prefix: String) -> String { hasPrefix(prefix) ? String(dropFirst(prefix.count)) : self }
public func prependLines(_ prefix: String) -> String { split(separator: "\n").map { prefix + $0 }.joined(separator: "\n") }}
extension Bool { /// Implication /// | a | b | a.implies(b) | /// |-------|-------|--------------| /// | false | false | true | /// | false | true | true | /// | true | false | false | /// | true | true | true | public func implies(_ mustHold: @autoclosure () -> Bool) -> Bool { !self || mustHold() }}
extension URL { public func open(with url: URL) { NSWorkspace.shared.open([self], withApplicationAt: url, configuration: NSWorkspace.OpenConfiguration()) }}
public func eprint(_ msg: String) { unsafe fputs(msg + "\n", stderr)}
public func exit(_ exitCode: Int32, out: String? = nil, err: String? = nil) -> Never { exitT(exitCode, out: out, err: err)}
public func exitT<T>(_ exitCode: Int32, out: String? = nil, err: String? = nil) -> T { if let out { print(out) } if let err { eprint(err) } exit(exitCode)}
/// 'id' stands for 'identity'. It's a common name in functional programmingpublic func id<T>(_ t: T) -> T { t }
@inlinable public func zipIfCountsAreEqual<C1, C2>(_ c1: C1, _ c2: C2) -> Zip2Sequence<C1, C2>? where C1: Collection, C2: Collection { switch c1.count == c2.count { case true: zip(c1, c2) case false: nil }}