Fix: use window ref instead of app ref to get bounds on macos

This commit is contained in:
Wang Jie 2025-06-15 00:05:35 +08:00
parent 48706562fc
commit ae4390f607

View File

@ -24,33 +24,45 @@ Bounds get_bounds(uintptr pid, int8_t isPid){
AXValueRef axp = NULL; AXValueRef axp = NULL;
AXValueRef axs = NULL; AXValueRef axs = NULL;
AXUIElementRef AxID = AXUIElementCreateApplication(pid); AXUIElementRef AxID = AXUIElementCreateApplication(pid);
AXUIElementRef AxWin = NULL;
// Get the window from the application
if (AXUIElementCopyAttributeValue(AxID, kAXFocusedWindowAttribute, (CFTypeRef *)&AxWin)
!= kAXErrorSuccess || AxWin == NULL) {
// If no focused window, try to get the main window
if (AXUIElementCopyAttributeValue(AxID, kAXMainWindowAttribute, (CFTypeRef *)&AxWin)
!= kAXErrorSuccess || AxWin == NULL) {
goto exit;
}
}
// Determine the current point of the window // Determine the current point of the window
if (AXUIElementCopyAttributeValue(AxID, kAXPositionAttribute, (CFTypeRef*) &axp) if (AXUIElementCopyAttributeValue(AxWin, kAXPositionAttribute, (CFTypeRef*) &axp)
!= kAXErrorSuccess || axp == NULL){ != kAXErrorSuccess || axp == NULL) {
goto exit; goto exit;
} }
// Determine the current size of the window // Determine the current size of the window
if (AXUIElementCopyAttributeValue(AxID, kAXSizeAttribute, (CFTypeRef*) &axs) if (AXUIElementCopyAttributeValue(AxWin, kAXSizeAttribute, (CFTypeRef*) &axs)
!= kAXErrorSuccess || axs == NULL){ != kAXErrorSuccess || axs == NULL) {
goto exit; goto exit;
} }
CGPoint p; CGSize s; CGPoint p; CGSize s;
// Attempt to convert both values into atomic types // Attempt to convert both values into atomic types
if (AXValueGetValue(axp, kAXValueCGPointType, &p) && if (AXValueGetValue(axp, kAXValueCGPointType, &p) &&
AXValueGetValue(axs, kAXValueCGSizeType, &s)){ AXValueGetValue(axs, kAXValueCGSizeType, &s)) {
bounds.X = p.x; bounds.X = p.x;
bounds.Y = p.y; bounds.Y = p.y;
bounds.W = s.width; bounds.W = s.width;
bounds.H = s.height; bounds.H = s.height;
} }
// return bounds;
exit: exit:
if (axp != NULL) { CFRelease(axp); } if (axp != NULL) { CFRelease(axp); }
if (axs != NULL) { CFRelease(axs); } if (axs != NULL) { CFRelease(axs); }
if (AxWin != NULL) { CFRelease(AxWin); }
if (AxID != NULL) { CFRelease(AxID); }
return bounds; return bounds;
#elif defined(USE_X11) #elif defined(USE_X11)