forked from intitni/CopilotForXcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathActiveApplicationMonitor.swift
More file actions
57 lines (49 loc) · 1.81 KB
/
ActiveApplicationMonitor.swift
File metadata and controls
57 lines (49 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import AppKit
public final class ActiveApplicationMonitor {
static let shared = ActiveApplicationMonitor()
var activeApplication = NSWorkspace.shared.runningApplications.first(where: \.isActive)
private var continuations: [UUID: AsyncStream<NSRunningApplication?>.Continuation] = [:]
private init() {
Task {
let sequence = NSWorkspace.shared.notificationCenter
.notifications(named: NSWorkspace.didActivateApplicationNotification)
for await notification in sequence {
guard let app = notification
.userInfo?[NSWorkspace.applicationUserInfoKey] as? NSRunningApplication
else { continue }
activeApplication = app
notifyContinuations()
}
}
}
deinit {
for continuation in continuations {
continuation.value.finish()
}
}
public static var activeApplication: NSRunningApplication? { shared.activeApplication }
public static func createStream() -> AsyncStream<NSRunningApplication?> {
.init { continuation in
let id = UUID()
ActiveApplicationMonitor.shared.addContinuation(continuation, id: id)
continuation.onTermination = { _ in
ActiveApplicationMonitor.shared.removeContinuation(id: id)
}
continuation.yield(activeApplication)
}
}
func addContinuation(
_ continuation: AsyncStream<NSRunningApplication?>.Continuation,
id: UUID
) {
continuations[id] = continuation
}
func removeContinuation(id: UUID) {
continuations[id] = nil
}
private func notifyContinuations() {
for continuation in continuations {
continuation.value.yield(activeApplication)
}
}
}