Created
August 13, 2015 03:32
-
-
Save c9iim/904a184921bb00bda759 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Cocoa | |
protocol AXUIWindow { | |
var title : String { get } | |
var size : NSSize { get set } | |
var origin: NSPoint{ get set } | |
var frame : NSRect { get set } | |
} | |
protocol AXUIWindowArray { | |
func getAXUIWindows(processIdentifier pid: pid_t) -> [AXUIWindow] | |
func getAXUIWindows(bundleIdentifier bid: String) -> [AXUIWindow] | |
} | |
struct AXUIWindowElement : AXUIWindow { | |
let element: AXUIElement! | |
init(element: AXUIElement) { | |
self.element = element | |
} | |
func copyAttribute<T>(attribute: String, _ handler: (memory: AnyObject?) -> T) -> T { | |
let val = UnsafeMutablePointer<AnyObject?>.alloc(1) | |
AXUIElementCopyAttributeValue(element, attribute, val) | |
let ret = handler(memory: val.memory) | |
val.dealloc(1) | |
return ret | |
} | |
var title : String { | |
return copyAttribute(NSAccessibilityTitleAttribute, { (memory) -> String in | |
return memory as? String ?? "" | |
}) | |
} | |
var size : NSSize { | |
get { | |
return copyAttribute(NSAccessibilitySizeAttribute, { (memory) -> NSSize in | |
if let mem = memory { | |
var val = NSSize() | |
AXValueGetValue(mem as! AXValue, AXValueType.CGSize, &val) | |
return val | |
} else { | |
return NSZeroSize | |
} | |
}) | |
} | |
set { | |
var ptr = newValue | |
if let val = AXValueCreate(AXValueType.CGSize, &ptr) { | |
let v = val.takeUnretainedValue() | |
AXUIElementSetAttributeValue(element, NSAccessibilitySizeAttribute, v) | |
} | |
} | |
} | |
var origin : NSPoint { | |
get { | |
return copyAttribute(NSAccessibilityPositionAttribute, {(memory) -> NSPoint in | |
if let mem = memory { | |
var val = NSPoint() | |
AXValueGetValue(mem as! AXValue, AXValueType.CGPoint, &val) | |
return val | |
} else { | |
return NSZeroPoint | |
} | |
}) | |
} | |
set { | |
var ptr = newValue | |
if let val = AXValueCreate(AXValueType.CGPoint, &ptr) { | |
let v = val.takeUnretainedValue() | |
AXUIElementSetAttributeValue(element, NSAccessibilityPositionAttribute, v) | |
} | |
} | |
} | |
var frame : NSRect { | |
get { | |
let org = self.origin, siz = self.size | |
return NSMakeRect(org.x, org.y, siz.width, siz.height) | |
} | |
set { | |
self.origin = newValue.origin | |
self.size = newValue.size | |
} | |
} | |
} | |
extension AXUIWindowArray { | |
func getAXUIWindows(processIdentifier pid: pid_t) -> [AXUIWindow] { | |
let elm = AXUIElementCreateApplication(pid).takeUnretainedValue() | |
let val = UnsafeMutablePointer<AnyObject?>.alloc(1) | |
AXUIElementCopyAttributeValue(elm, NSAccessibilityWindowsAttribute, val) | |
let mem = val.memory as? [AXUIElement] ?? [] | |
val.dealloc(1) | |
let ary = mem.map({ AXUIWindowElement(element: $0) }) as [AXUIWindow] | |
let run = NSWorkspace.sharedWorkspace().runningApplications | |
let fin = run.filter({ $0.bundleIdentifier == "com.apple.finder" }).first | |
let con = fin?.processIdentifier == pid | |
return con ? ary.filter({ $0.title != "" }) : ary | |
} | |
func getAXUIWindows(bundleIdentifier bid: String) -> [AXUIWindow] { | |
let run = NSWorkspace.sharedWorkspace().runningApplications | |
if let app = run.filter({$0.bundleIdentifier == bid}).first { | |
return getAXUIWindows(processIdentifier: app.processIdentifier) | |
} else { | |
return [] | |
} | |
} | |
} | |
extension NSRunningApplication: AXUIWindowArray { | |
var windows:[AXUIWindow] { | |
return getAXUIWindows(processIdentifier: self.processIdentifier) | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment