diff --git a/alt-tab-macos/api-wrappers/CGWindow.swift b/alt-tab-macos/api-wrappers/CGWindow.swift index ed8b47f8..58d1887d 100644 --- a/alt-tab-macos/api-wrappers/CGWindow.swift +++ b/alt-tab-macos/api-wrappers/CGWindow.swift @@ -8,6 +8,15 @@ extension CGWindow { return CGWindowListCopyWindowInfo([.excludeDesktopElements, option], kCGNullWindowID) as! [CGWindow] } + static func isMissionControlActive() -> Bool { + // when Mission Control is active, the Dock process spawns some windows. We observe this side-effect and infer + for window in windows(.optionOnScreenOnly) { + guard window.ownerName() == "Dock" else { continue } + return true + } + return false + } + // workaround: filtering this criteria seems to remove non-windows UI elements func isNotMenubarOrOthers() -> Bool { return layer() == 0 diff --git a/alt-tab-macos/ui/App.swift b/alt-tab-macos/ui/App.swift index 042d42b0..fdbc9acf 100644 --- a/alt-tab-macos/ui/App.swift +++ b/alt-tab-macos/ui/App.swift @@ -82,7 +82,7 @@ class App: NSApplication, NSApplicationDelegate, NSWindowDelegate { if isFirstSummon { debugPrint("showUiOrCycleSelection: isFirstSummon") isFirstSummon = false - if Windows.listRecentlyUsedFirst.count == 0 { + if Windows.listRecentlyUsedFirst.count == 0 || CGWindow.isMissionControlActive() { appIsBeingUsed = false isFirstSummon = true return @@ -112,6 +112,7 @@ class App: NSApplication, NSApplicationDelegate, NSWindowDelegate { func focusSelectedWindow(_ window: Window?) { hideUi() + guard !CGWindow.isMissionControlActive() else { return } window?.focus() } }