fix: didn't show skim app windows (closes #772)
This commit is contained in:
1 parent
c3af30a721
commit
fed2eb63e0
4 files changed
+12
-13
No files matched your search
@@ -73,7 +73,7 @@ extension AXUIElement {
|
|||||||
return nil
|
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 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)
|
// 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"
|
// 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 &&
|
size != nil && size!.width > 100 && size!.height > 100 &&
|
||||||
(books(runningApp) || keynote(runningApp) || (
|
(books(runningApp) || keynote(runningApp) || (
|
||||||
// CGWindowLevel == .normalWindow helps filter out iStats Pro and other top-level pop-overs, and floating windows
|
// CGWindowLevel == .normalWindow helps filter out iStats Pro and other top-level pop-overs, and floating windows
|
||||||
isOnNormalLevel &&
|
level == AXUIElement.normalLevel &&
|
||||||
([kAXStandardWindowSubrole, kAXDialogSubrole].contains(subrole) ||
|
([kAXStandardWindowSubrole, kAXDialogSubrole].contains(subrole) ||
|
||||||
openBoard(runningApp) ||
|
openBoard(runningApp) ||
|
||||||
adobeAudition(runningApp, subrole) ||
|
adobeAudition(runningApp, subrole) ||
|
||||||
@@ -161,11 +161,6 @@ extension AXUIElement {
|
|||||||
return title != "" && Applications.isAndroidEmulator(runningApp)
|
return title != "" && Applications.isAndroidEmulator(runningApp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func isOnNormalLevel(_ wid: CGWindowID) -> Bool {
|
|
||||||
let level: CGWindowLevel = wid.level()
|
|
||||||
return level == AXUIElement.normalLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func position() throws -> CGPoint? {
|
func position() throws -> CGPoint? {
|
||||||
return try value(kAXPositionAttribute, CGPoint.zero, .cgPoint)
|
return try value(kAXPositionAttribute, CGPoint.zero, .cgPoint)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,13 @@ extension CGWindowID {
|
|||||||
return cgProperty("kCGSWindowTitle", String.self)
|
return cgProperty("kCGSWindowTitle", String.self)
|
||||||
}
|
}
|
||||||
|
|
||||||
func level() -> CGWindowLevel {
|
func level() throws -> CGWindowLevel {
|
||||||
var level = CGWindowLevel(0)
|
var level = CGWindowLevel(0)
|
||||||
CGSGetWindowLevel(cgsMainConnectionId, self, &level)
|
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
|
return level
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ class Application: NSObject {
|
|||||||
let subrole = try $0.subrole()
|
let subrole = try $0.subrole()
|
||||||
let role = try $0.role()
|
let role = try $0.role()
|
||||||
let size = try $0.size()
|
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) {
|
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)
|
return ($0, wid, title, try $0.isFullscreen(), try $0.isMinimized(), try $0.position(), size)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,13 +88,13 @@ fileprivate func windowCreated(_ element: AXUIElement, _ pid: pid_t) throws {
|
|||||||
let role = try element.role()
|
let role = try element.role()
|
||||||
let isFullscreen = try element.isFullscreen()
|
let isFullscreen = try element.isFullscreen()
|
||||||
let isMinimized = try element.isMinimized()
|
let isMinimized = try element.isMinimized()
|
||||||
let isOnNormalLevel = element.isOnNormalLevel(wid)
|
let level = try wid.level()
|
||||||
let position = try element.position()
|
let position = try element.position()
|
||||||
let size = try element.size()
|
let size = try element.size()
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
if (Windows.list.firstIndex { $0.isEqualRobust(element, wid) }) == nil,
|
if (Windows.list.firstIndex { $0.isEqualRobust(element, wid) }) == nil,
|
||||||
let runningApp = NSRunningApplication(processIdentifier: pid),
|
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 app = (Applications.list.first { $0.pid == pid }) {
|
||||||
let window = Window(element, app, wid, axTitle, isFullscreen, isMinimized, position, size)
|
let window = Window(element, app, wid, axTitle, isFullscreen, isMinimized, position, size)
|
||||||
Windows.appendAndUpdateFocus(window)
|
Windows.appendAndUpdateFocus(window)
|
||||||
@@ -116,13 +116,13 @@ fileprivate func focusedWindowChanged(_ element: AXUIElement, _ pid: pid_t) thro
|
|||||||
let role = try element.role()
|
let role = try element.role()
|
||||||
let isFullscreen = try element.isFullscreen()
|
let isFullscreen = try element.isFullscreen()
|
||||||
let isMinimized = try element.isMinimized()
|
let isMinimized = try element.isMinimized()
|
||||||
let isOnNormalLevel = element.isOnNormalLevel(wid)
|
let level = try wid.level()
|
||||||
let position = try element.position()
|
let position = try element.position()
|
||||||
let size = try element.size()
|
let size = try element.size()
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
if let windows = Windows.updateLastFocus(element, wid) {
|
if let windows = Windows.updateLastFocus(element, wid) {
|
||||||
App.app.refreshOpenUi(windows)
|
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 app = (Applications.list.first { $0.pid == pid }) {
|
||||||
let window = Window(element, app, wid, axTitle, isFullscreen, isMinimized, position, size)
|
let window = Window(element, app, wid, axTitle, isFullscreen, isMinimized, position, size)
|
||||||
Windows.appendAndUpdateFocus(window)
|
Windows.appendAndUpdateFocus(window)
|
||||||
|
|||||||
Reference in new issue
Block a user