11import AppKit
22import CGEventObserver
3+ import DisplayLink
34import Foundation
45import os. log
56import QuartzCore
@@ -66,7 +67,7 @@ public actor RealtimeSuggestionController {
6667 }
6768 }
6869 if eventObserver. activateIfPossible ( ) {
69- realtimeSuggestionIndicatorController? . isObserving = true
70+ realtimeSuggestionIndicatorController. isObserving = true
7071 }
7172 }
7273
@@ -78,7 +79,7 @@ public actor RealtimeSuggestionController {
7879 task? . cancel ( )
7980 task = nil
8081 eventObserver. deactivate ( )
81- realtimeSuggestionIndicatorController? . isObserving = false
82+ realtimeSuggestionIndicatorController. isObserving = false
8283 }
8384
8485 func handleKeyboardEvent( event: CGEvent ) async {
@@ -132,7 +133,7 @@ public actor RealtimeSuggestionController {
132133 else { return }
133134 if Task . isCancelled { return }
134135 os_log ( . info, " Prefetch suggestions. " )
135- realtimeSuggestionIndicatorController? . triggerPrefetchAnimation ( )
136+ realtimeSuggestionIndicatorController. triggerPrefetchAnimation ( )
136137 do {
137138 try await Environment . triggerAction ( " Prefetch Suggestions " )
138139 } catch {
@@ -239,8 +240,6 @@ final class RealtimeSuggestionIndicatorController {
239240 }
240241
241242 private let viewModel = IndicatorContentViewModel ( )
242- private var displayLink : CVDisplayLink !
243- private var isDisplayLinkStarted : Bool = false
244243 private var userDefaultsObserver = UserDefaultsObserver ( )
245244 var isObserving = false {
246245 didSet {
@@ -250,6 +249,8 @@ final class RealtimeSuggestionIndicatorController {
250249 }
251250 }
252251
252+ private var displayLinkTask : Task < Void , Never > ?
253+
253254 @MainActor
254255 lazy var window = {
255256 let it = NSWindow (
@@ -269,15 +270,7 @@ final class RealtimeSuggestionIndicatorController {
269270 return it
270271 } ( )
271272
272- init ? ( ) {
273- _ = CVDisplayLinkCreateWithCGDisplay ( CGMainDisplayID ( ) , & displayLink)
274- guard displayLink != nil else { return nil }
275- CVDisplayLinkSetOutputHandler ( displayLink) { [ weak self] _, _, _, _, _ in
276- guard let self else { return kCVReturnSuccess }
277- self . updateIndicatorLocation ( )
278- return kCVReturnSuccess
279- }
280-
273+ init ( ) {
281274 Task {
282275 let sequence = NSWorkspace . shared. notificationCenter
283276 . notifications ( named: NSWorkspace . didActivateApplicationNotification)
@@ -327,9 +320,16 @@ final class RealtimeSuggestionIndicatorController {
327320 await { @MainActor in
328321 guard window. isVisible != isVisible else { return }
329322 if isVisible {
330- CVDisplayLinkStart ( self . displayLink)
323+ if displayLinkTask == nil {
324+ displayLinkTask = Task {
325+ for await _ in DisplayLink . createStream ( ) {
326+ self . updateIndicatorLocation ( )
327+ }
328+ }
329+ }
331330 } else {
332- CVDisplayLinkStop ( self . displayLink)
331+ displayLinkTask? . cancel ( )
332+ displayLinkTask = nil
333333 }
334334 window. setIsVisible ( isVisible)
335335 } ( )
0 commit comments