From b201ab9f80bb99d7223daf52b622f5f7afaef50f Mon Sep 17 00:00:00 2001 From: vcaesar Date: Thu, 5 Sep 2024 13:23:14 -0700 Subject: [PATCH] Update: update screengrad with fixed macos 15 --- robotgo.go | 4 ++++ screen/screengrab_c.h | 55 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/robotgo.go b/robotgo.go index f4660ac..7c79bd4 100644 --- a/robotgo.go +++ b/robotgo.go @@ -33,6 +33,10 @@ package robotgo #cgo darwin CFLAGS: -x objective-c -Wno-deprecated-declarations #cgo darwin LDFLAGS: -framework Cocoa -framework OpenGL -framework IOKit #cgo darwin LDFLAGS: -framework Carbon -framework CoreFoundation +// +#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > MAC_OS_VERSION_14_4 +#cgo darwin LDFLAGS: -framework ScreenCaptureKit +#endif #cgo linux CFLAGS: -I/usr/src #cgo linux LDFLAGS: -L/usr/src -lm -lX11 -lXtst diff --git a/screen/screengrab_c.h b/screen/screengrab_c.h index 9af7302..3007fb7 100644 --- a/screen/screengrab_c.h +++ b/screen/screengrab_c.h @@ -5,6 +5,7 @@ #include #include #include + #include #elif defined(USE_X11) #include #include @@ -13,6 +14,49 @@ #include #endif +#if defined(IS_MACOSX) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > MAC_OS_VERSION_14_4 + static CGImageRef capture15(CGDirectDisplayID id, CGRect diIntersectDisplayLocal, CGColorSpaceRef colorSpace) { + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + __block CGImageRef image1 = nil; + [SCShareableContent getShareableContentWithCompletionHandler:^(SCShareableContent* content, NSError* error) { + @autoreleasepool { + if (error) { + dispatch_semaphore_signal(semaphore); + return; + } + SCDisplay* target = nil; + for (SCDisplay *display in content.displays) { + if (display.displayID == id) { + target = display; + break; + } + } + if (!target) { + dispatch_semaphore_signal(semaphore); + return; + } + + SCContentFilter* filter = [[SCContentFilter alloc] initWithDisplay:target excludingWindows:@[]]; + SCStreamConfiguration* config = [[SCStreamConfiguration alloc] init]; + config.sourceRect = diIntersectDisplayLocal; + config.width = diIntersectDisplayLocal.size.width; + config.height = diIntersectDisplayLocal.size.height; + [SCScreenshotManager captureImageWithFilter:filter + configuration:config + completionHandler:^(CGImageRef img, NSError* error) { + if (!error) { + image1 = CGImageCreateCopyWithColorSpace(img, colorSpace); + } + dispatch_semaphore_signal(semaphore); + }]; + } + }]; + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + dispatch_release(semaphore); + return image1; + } +#endif + MMBitmapRef copyMMBitmapFromDisplayInRect(MMRectInt32 rect, int32_t display_id, int8_t isPid) { #if defined(IS_MACOSX) MMBitmapRef bitmap = NULL; @@ -25,9 +69,16 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRectInt32 rect, int32_t display_id, } MMPointInt32 o = rect.origin; MMSizeInt32 s = rect.size; - CGImageRef image = CGDisplayCreateImageForRect(displayID, CGRectMake(o.x, o.y, s.w, s.h)); + #if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > MAC_OS_VERSION_14_4 + CGColorSpaceRef color = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); + CGImageRef image = capture15(displayID, CGRectMake(o.x, o.y, s.w, s.h), color); + CGColorSpaceRelease(color); + #else + // This API is deprecated in macos 15, use ScreenCaptureKit's captureScreenshot + CGImageRef image = CGDisplayCreateImageForRect(displayID, CGRectMake(o.x, o.y, s.w, s.h)); + #endif if (!image) { return NULL; } - + CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(image)); if (!imageData) { return NULL; }