diff --git a/source/utils/CarlaPluginUI.cpp b/source/utils/CarlaPluginUI.cpp index c8b73d8d4..970b53f01 100644 --- a/source/utils/CarlaPluginUI.cpp +++ b/source/utils/CarlaPluginUI.cpp @@ -1050,7 +1050,54 @@ bool CarlaPluginUI::tryTransientWinIdMatch(const uintptr_t pid, const char* cons #endif #ifdef CARLA_OS_MAC - // TODO + uint const hints = kCGWindowListOptionOnScreenOnly|kCGWindowListExcludeDesktopElements; + + CFArrayRef const windowListRef = CGWindowListCopyWindowInfo(hints, kCGNullWindowID); + const NSArray* const windowList = (const NSArray*)windowListRef; + + int windowToMap, windowWithPID = 0, windowWithNameAndPID = 0; + + for (NSDictionary* const entry in windowList) + { + if ([entry[(id)kCGWindowSharingState] intValue] == kCGWindowSharingNone) + continue; + + NSString* const windowName = entry[(id)kCGWindowName]; + int const windowNumber = [entry[(id)kCGWindowNumber] intValue]; + uintptr_t const windowPID = [entry[(id)kCGWindowOwnerPID] intValue]; + + if (windowPID != pid) + continue; + + windowWithPID = windowNumber; + + if (windowName != nullptr && std::strcmp([windowName UTF8String], uiTitle) == 0) + windowWithNameAndPID = windowNumber; + } + + CFRelease(windowListRef); + + if (windowWithNameAndPID != 0) + { + carla_stdout("Match found using pid and name"); + windowToMap = windowWithNameAndPID; + } + else if (windowWithPID != 0) + { + carla_stdout("Match found using pid"); + windowToMap = windowWithPID; + } + else + { + return false; + } + + NSWindow* const parentWindow = [NSApp windowWithWindowNumber:winId]; + CARLA_SAFE_ASSERT_RETURN(parentWindow != nullptr, false); + + [parentWindow orderWindow:NSWindowBelow + relativeTo:windowToMap]; + return true; #endif #ifdef CARLA_OS_WIN