Skip to content

Instantly share code, notes, and snippets.

@c9iim
Created August 13, 2015 03:32
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save c9iim/904a184921bb00bda759 to your computer and use it in GitHub Desktop.
Save c9iim/904a184921bb00bda759 to your computer and use it in GitHub Desktop.
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