From fed2eb63e0577e3b9998e2157660f1f2da46d1f3 Mon Sep 17 00:00:00 2001 From: Louis Pontoise Date: Tue, 9 Feb 2021 17:05:22 +0900 Subject: [PATCH] fix: didn't show skim app windows (closes #772) --- src/api-wrappers/AXUIElement.swift | 9 ++------- src/api-wrappers/CGWindowID.swift | 6 +++++- src/logic/Application.swift | 2 +- src/logic/events/AccessibilityEvents.swift | 8 ++++---- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/api-wrappers/AXUIElement.swift b/src/api-wrappers/AXUIElement.swift index 213186c2..98ff7446 100644 --- a/src/api-wrappers/AXUIElement.swift +++ b/src/api-wrappers/AXUIElement.swift @@ -73,7 +73,7 @@ extension AXUIElement { return nil } - func isActualWindow(_ runningApp: NSRunningApplication, _ wid: CGWindowID, _ isOnNormalLevel: Bool, _ title: String?, _ subrole: String?, _ role: String?, _ size: CGSize?) -> Bool { + func isActualWindow(_ runningApp: NSRunningApplication, _ wid: CGWindowID, _ level: CGWindowLevel, _ title: String?, _ subrole: String?, _ role: String?, _ size: CGSize?) -> Bool { // Some non-windows have title: nil (e.g. some OS elements) // Some non-windows have subrole: nil (e.g. some OS elements), "AXUnknown" (e.g. Bartender), "AXSystemDialog" (e.g. Intellij tooltips) // Minimized windows or windows of a hidden app have subrole "AXDialog" @@ -84,7 +84,7 @@ extension AXUIElement { size != nil && size!.width > 100 && size!.height > 100 && (books(runningApp) || keynote(runningApp) || ( // CGWindowLevel == .normalWindow helps filter out iStats Pro and other top-level pop-overs, and floating windows - isOnNormalLevel && + level == AXUIElement.normalLevel && ([kAXStandardWindowSubrole, kAXDialogSubrole].contains(subrole) || openBoard(runningApp) || adobeAudition(runningApp, subrole) || @@ -161,11 +161,6 @@ extension AXUIElement { return title != "" && Applications.isAndroidEmulator(runningApp) } - func isOnNormalLevel(_ wid: CGWindowID) -> Bool { - let level: CGWindowLevel = wid.level() - return level == AXUIElement.normalLevel - } - func position() throws -> CGPoint? { return try value(kAXPositionAttribute, CGPoint.zero, .cgPoint) } diff --git a/src/api-wrappers/CGWindowID.swift b/src/api-wrappers/CGWindowID.swift index 37a9c68f..3921f708 100644 --- a/src/api-wrappers/CGWindowID.swift +++ b/src/api-wrappers/CGWindowID.swift @@ -5,9 +5,13 @@ extension CGWindowID { return cgProperty("kCGSWindowTitle", String.self) } - func level() -> CGWindowLevel { + func level() throws -> CGWindowLevel { var level = CGWindowLevel(0) CGSGetWindowLevel(cgsMainConnectionId, self, &level) + // in some weird cases, a window can spawn with level == 1, which is not even a publicly listed level + if level == 1 { + throw AxError.runtimeError + } return level } diff --git a/src/logic/Application.swift b/src/logic/Application.swift index c391b85d..dcfc8b68 100644 --- a/src/logic/Application.swift +++ b/src/logic/Application.swift @@ -85,7 +85,7 @@ class Application: NSObject { let subrole = try $0.subrole() let role = try $0.role() let size = try $0.size() - let isOnNormalLevel = $0.isOnNormalLevel(wid) + let isOnNormalLevel = try $0.isOnNormalLevel(wid) if $0.isActualWindow(self.runningApplication, wid, isOnNormalLevel, title, subrole, role, size) { return ($0, wid, title, try $0.isFullscreen(), try $0.isMinimized(), try $0.position(), size) } diff --git a/src/logic/events/AccessibilityEvents.swift b/src/logic/events/AccessibilityEvents.swift index 7c613e39..2b37dc40 100644 --- a/src/logic/events/AccessibilityEvents.swift +++ b/src/logic/events/AccessibilityEvents.swift @@ -88,13 +88,13 @@ fileprivate func windowCreated(_ element: AXUIElement, _ pid: pid_t) throws { let role = try element.role() let isFullscreen = try element.isFullscreen() let isMinimized = try element.isMinimized() - let isOnNormalLevel = element.isOnNormalLevel(wid) + let level = try wid.level() let position = try element.position() let size = try element.size() DispatchQueue.main.async { if (Windows.list.firstIndex { $0.isEqualRobust(element, wid) }) == nil, let runningApp = NSRunningApplication(processIdentifier: pid), - element.isActualWindow(runningApp, wid, isOnNormalLevel, axTitle, subrole, role, size), + element.isActualWindow(runningApp, wid, level, axTitle, subrole, role, size), let app = (Applications.list.first { $0.pid == pid }) { let window = Window(element, app, wid, axTitle, isFullscreen, isMinimized, position, size) Windows.appendAndUpdateFocus(window) @@ -116,13 +116,13 @@ fileprivate func focusedWindowChanged(_ element: AXUIElement, _ pid: pid_t) thro let role = try element.role() let isFullscreen = try element.isFullscreen() let isMinimized = try element.isMinimized() - let isOnNormalLevel = element.isOnNormalLevel(wid) + let level = try wid.level() let position = try element.position() let size = try element.size() DispatchQueue.main.async { if let windows = Windows.updateLastFocus(element, wid) { App.app.refreshOpenUi(windows) - } else if element.isActualWindow(runningApp, wid, isOnNormalLevel, axTitle, subrole, role, size), + } else if element.isActualWindow(runningApp, wid, level, axTitle, subrole, role, size), let app = (Applications.list.first { $0.pid == pid }) { let window = Window(element, app, wid, axTitle, isFullscreen, isMinimized, position, size) Windows.appendAndUpdateFocus(window)