diff --git a/window/pub.h b/window/pub.h index cfd0f31..83da769 100644 --- a/window/pub.h +++ b/window/pub.h @@ -42,7 +42,7 @@ typedef struct _Bounds Bounds; static Boolean(*gAXIsProcessTrustedWithOptions) (CFDictionaryRef); static CFStringRef* gkAXTrustedCheckOptionPrompt; - AXError _AXUIElementGetWindow(AXUIElementRef, CGWindowID* out); + //AXError _AXUIElementGetWindow(AXUIElementRef, CGWindowID* out); static AXUIElementRef GetUIElement(CGWindowID win){ intptr pid = 0; // double_t pid = 0; @@ -90,13 +90,25 @@ typedef struct _Bounds Bounds; AXUIElementRef element = (AXUIElementRef) CFArrayGetValueAtIndex(windows, i); CGWindowID temp = 0; // Use undocumented API to get WindowID - _AXUIElementGetWindow(element, &temp); + /*_AXUIElementGetWindow(element, &temp); if (temp == win) { // Retain element CFRetain(element); result = element; break; + }*/ + CFTypeRef cfWindow = NULL; + if (AXUIElementCopyAttributeValue(element, kAXWindowAttribute, &cfWindow) == kAXErrorSuccess && cfWindow != NULL) { + temp = *(CGWindowID*)CFDataGetBytePtr(cfWindow); + CFRelease(cfWindow); + + if (temp == win) { + // Retain element + CFRetain(element); + result = element; + break; + } } } diff --git a/window/window.h b/window/window.h index bb1382b..3ac788f 100644 --- a/window/window.h +++ b/window/window.h @@ -366,12 +366,12 @@ MData get_active(void) { AXUIElementRef focused = AXUIElementCreateApplication(pid); if (focused == NULL) { return result; } // Verify - AXUIElementRef element; + /*AXUIElementRef element; CGWindowID win = 0; // Retrieve the currently focused window if (AXUIElementCopyAttributeValue(focused, kAXFocusedWindowAttribute, (CFTypeRef*) &element) == kAXErrorSuccess && element) { - + // Use undocumented API to get WID if (_AXUIElementGetWindow(element, &win) == kAXErrorSuccess && win) { // Manually set internals @@ -383,7 +383,31 @@ MData get_active(void) { } else { result.CgID = win; result.AxID = element; + }*/ + + AXUIElementRef windowElement = NULL; + CGWindowID win = 0; + + // Retrieve the currently focused window + if (AXUIElementCopyAttributeValue(focused, kAXFocusedWindowAttribute, (CFTypeRef*) &windowElement) == kAXErrorSuccess && windowElement) { + // Use AXUIElementCopyAttributeValue to get parent window + CFTypeRef cfWindow = NULL; + if (AXUIElementCopyAttributeValue(windowElement, kAXParentAttribute, &cfWindow) == kAXErrorSuccess && cfWindow != NULL) { + AXUIElementRef parentWindow = (AXUIElementRef)cfWindow; + if (AXUIElementCopyAttributeValue(parentWindow, kAXWindowAttribute, (CFTypeRef*)&win) == kAXErrorSuccess && win) { + // Manually set internals + result.CgID = win; + result.AxID = windowElement; + } else { + CFRelease(parentWindow); + } + } + CFRelease(windowElement); + } else { + result.CgID = 0; + result.AxID = NULL; } + CFRelease(focused); return result;