@@ -33,11 +33,11 @@ public final class XcodeInspector: ObservableObject {
3333 . first ( where: \. isActive)
3434 . map ( AppInstanceInspector . init ( runningApplication: ) )
3535
36- if let activeXcode {
37- setActiveXcode ( activeXcode)
38- }
39-
4036 Task { @MainActor in // Did activate app
37+ if let activeXcode {
38+ setActiveXcode ( activeXcode)
39+ }
40+
4141 let sequence = NSWorkspace . shared. notificationCenter
4242 . notifications ( named: NSWorkspace . didActivateApplicationNotification)
4343 for await notification in sequence {
@@ -87,7 +87,10 @@ public final class XcodeInspector: ObservableObject {
8787 }
8888 }
8989
90+ @MainActor
9091 func setActiveXcode( _ xcode: XcodeAppInstanceInspector ) {
92+ xcode. refresh ( )
93+
9194 for task in activeXcodeObservations { task. cancel ( ) }
9295 for cancellable in activeXcodeCancellable { cancellable. cancel ( ) }
9396 activeXcodeObservations. removeAll ( )
@@ -208,6 +211,51 @@ public final class XcodeAppInstanceInspector: AppInstanceInspector {
208211 super. init ( runningApplication: runningApplication)
209212
210213 observeFocusedWindow ( )
214+ observe ( )
215+ }
216+
217+ func observeFocusedWindow( ) {
218+ if let window = appElement. focusedWindow {
219+ if window. identifier == " Xcode.WorkspaceWindow " {
220+ let window = WorkspaceXcodeWindowInspector (
221+ app: runningApplication,
222+ uiElement: window
223+ )
224+ focusedWindow = window
225+ focusedWindowObservations. forEach { $0. cancel ( ) }
226+ focusedWindowObservations. removeAll ( )
227+
228+ documentURL = window. documentURL
229+ projectURL = window. projectURL
230+
231+ window. $documentURL
232+ . filter { $0 != . init( fileURLWithPath: " / " ) }
233+ . sink { [ weak self] url in
234+ self ? . documentURL = url
235+ } . store ( in: & focusedWindowObservations)
236+ window. $projectURL
237+ . filter { $0 != . init( fileURLWithPath: " / " ) }
238+ . sink { [ weak self] url in
239+ self ? . projectURL = url
240+ } . store ( in: & focusedWindowObservations)
241+ } else {
242+ let window = XcodeWindowInspector ( uiElement: window)
243+ focusedWindow = window
244+ }
245+ } else {
246+ focusedWindow = nil
247+ }
248+ }
249+
250+ func refresh( ) {
251+ ( focusedWindow as? WorkspaceXcodeWindowInspector ) ? . refresh ( )
252+ observe ( )
253+ }
254+
255+ func observe( ) {
256+ longRunningTasks. forEach { $0. cancel ( ) }
257+ longRunningTasks = [ ]
258+
211259 let focusedWindowChanged = Task {
212260 let notification = AXNotificationStream (
213261 app: runningApplication,
@@ -243,14 +291,9 @@ public final class XcodeAppInstanceInspector: AppInstanceInspector {
243291
244292 longRunningTasks. insert ( updateTabsTask)
245293
246- completionPanel = appElement. firstChild { element in
247- element. identifier == " _XC_COMPLETION_TABLE_ "
248- } ? . parent
249-
250294 let completionPanelTask = Task {
251295 let stream = AXNotificationStream (
252296 app: runningApplication,
253- element: appElement,
254297 notificationNames: kAXCreatedNotification, kAXUIElementDestroyedNotification
255298 )
256299
@@ -279,39 +322,6 @@ public final class XcodeAppInstanceInspector: AppInstanceInspector {
279322 longRunningTasks. insert ( completionPanelTask)
280323 }
281324
282- func observeFocusedWindow( ) {
283- if let window = appElement. focusedWindow {
284- if window. identifier == " Xcode.WorkspaceWindow " {
285- let window = WorkspaceXcodeWindowInspector (
286- app: runningApplication,
287- uiElement: window
288- )
289- focusedWindow = window
290- focusedWindowObservations. forEach { $0. cancel ( ) }
291- focusedWindowObservations. removeAll ( )
292-
293- documentURL = window. documentURL
294- projectURL = window. projectURL
295-
296- window. $documentURL
297- . filter { $0 != . init( fileURLWithPath: " / " ) }
298- . sink { [ weak self] url in
299- self ? . documentURL = url
300- } . store ( in: & focusedWindowObservations)
301- window. $projectURL
302- . filter { $0 != . init( fileURLWithPath: " / " ) }
303- . sink { [ weak self] url in
304- self ? . projectURL = url
305- } . store ( in: & focusedWindowObservations)
306- } else {
307- let window = XcodeWindowInspector ( uiElement: window)
308- focusedWindow = window
309- }
310- } else {
311- focusedWindow = nil
312- }
313- }
314-
315325 static func fetchWorkspaceInfo(
316326 _ app: NSRunningApplication
317327 ) -> [ WorkspaceIdentifier : WorkspaceInfo ] {
0 commit comments