fix: workaround some odd bug that's breaking protege.app (closes #314)
This commit is contained in:
1 parent
2729426aec
commit
8f4efdfa97
1 file changed
+18
-10
+18
-10
@@ -6,14 +6,22 @@ class Application: NSObject {
|
|||||||
var axObserver: AXObserver?
|
var axObserver: AXObserver?
|
||||||
var isReallyFinishedLaunching = false
|
var isReallyFinishedLaunching = false
|
||||||
|
|
||||||
static let notifications = [
|
static func notifications(_ app: NSRunningApplication) -> [String] {
|
||||||
kAXApplicationActivatedNotification,
|
var n = [
|
||||||
kAXMainWindowChangedNotification,
|
kAXApplicationActivatedNotification,
|
||||||
kAXWindowCreatedNotification,
|
kAXMainWindowChangedNotification,
|
||||||
kAXApplicationHiddenNotification,
|
kAXWindowCreatedNotification,
|
||||||
kAXApplicationShownNotification,
|
kAXApplicationHiddenNotification,
|
||||||
kAXFocusedUIElementChangedNotification,
|
kAXApplicationShownNotification,
|
||||||
]
|
kAXFocusedUIElementChangedNotification,
|
||||||
|
]
|
||||||
|
// workaround: Protégé exhibits bugs when we subscribe to its kAXFocusedUIElementChangedNotification
|
||||||
|
// we don't know what's happening; we hardcode this exception to make the app usable
|
||||||
|
if app.bundleIdentifier == "edu.stanford.protege" {
|
||||||
|
n.remove(at: 5)
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
// some apps never finish their subscription retry loop; they should be stopped to avoid infinite loop
|
// some apps never finish their subscription retry loop; they should be stopped to avoid infinite loop
|
||||||
static func stopSubscriptionRetries(_ notification: String, _ runningApplication: NSRunningApplication) {
|
static func stopSubscriptionRetries(_ notification: String, _ runningApplication: NSRunningApplication) {
|
||||||
@@ -35,7 +43,7 @@ class Application: NSObject {
|
|||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
// some apps never finish launching; subscription retries should be stopped to avoid infinite loops
|
// some apps never finish launching; subscription retries should be stopped to avoid infinite loops
|
||||||
Application.notifications.forEach { Application.stopSubscriptionRetries($0, runningApplication) }
|
Application.notifications(runningApplication).forEach { Application.stopSubscriptionRetries($0, runningApplication) }
|
||||||
// some apps never finish launching; observer should be removed to avoid leak
|
// some apps never finish launching; observer should be removed to avoid leak
|
||||||
removeObserver()
|
removeObserver()
|
||||||
}
|
}
|
||||||
@@ -79,7 +87,7 @@ class Application: NSObject {
|
|||||||
private func observeEvents() {
|
private func observeEvents() {
|
||||||
guard let axObserver = axObserver else { return }
|
guard let axObserver = axObserver else { return }
|
||||||
let selfPointer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
|
let selfPointer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
|
||||||
for notification in Application.notifications {
|
for notification in Application.notifications(runningApplication) {
|
||||||
Applications.appsInSubscriptionRetryLoop.append(String(runningApplication.processIdentifier) + String(notification))
|
Applications.appsInSubscriptionRetryLoop.append(String(runningApplication.processIdentifier) + String(notification))
|
||||||
axUiElement!.subscribeWithRetry(axObserver, notification, selfPointer, { [weak self] in
|
axUiElement!.subscribeWithRetry(axObserver, notification, selfPointer, { [weak self] in
|
||||||
// some apps have `isFinishedLaunching == true` but are actually not finished, and will return .cannotComplete
|
// some apps have `isFinishedLaunching == true` but are actually not finished, and will return .cannotComplete
|
||||||
|
|||||||
Reference in new issue
Block a user