use crate::{
error::{CaptureError, CaptureResult},
types::{CaptureRegion, PixelFormat, RawImage},
};
pub struct ScreenCaptureKit {
}
impl ScreenCaptureKit {
pub fn is_available() -> bool {
if let Ok(version) = Self::get_macos_version() {
version.0 > 12 || (version.0 == 12 && version.1 >= 3)
} else {
false
}
}
pub fn new() -> CaptureResult<Self> {
if !Self::is_available() {
return Err(CaptureError::HardwareAccelerationUnavailable(
"ScreenCaptureKit requires macOS 12.3 or later".to_string(),
));
}
Err(CaptureError::HardwareAccelerationUnavailable(
"ScreenCaptureKit implementation pending".to_string(),
))
}
pub fn capture_display(&self, display_index: usize) -> CaptureResult<RawImage> {
#[cfg(target_os = "macos")]
unsafe {
use objc::{class, msg_send, sel, sel_impl};
use objc::runtime::{Object, BOOL, YES};
use core_foundation::base::TCFType;
log::warn!("ScreenCaptureKit capture not yet implemented, falling back");
return Err(CaptureError::HardwareAccelerationUnavailable(
"ScreenCaptureKit capture implementation pending".to_string(),
));
}
#[cfg(not(target_os = "macos"))]
Err(CaptureError::PlatformError(
"ScreenCaptureKit only available on macOS".to_string(),
))
}
pub fn capture_region(&self, region: CaptureRegion) -> CaptureResult<RawImage> {
#[cfg(target_os = "macos")]
{
log::warn!("ScreenCaptureKit region capture not yet implemented, falling back");
return Err(CaptureError::HardwareAccelerationUnavailable(
"ScreenCaptureKit region capture implementation pending".to_string(),
));
}
#[cfg(not(target_os = "macos"))]
Err(CaptureError::PlatformError(
"ScreenCaptureKit only available on macOS".to_string(),
))
}
fn get_macos_version() -> Result<(u32, u32), Box<dyn std::error::Error>> {
#[cfg(target_os = "macos")]
{
use std::process::Command;
let output = Command::new("sw_vers")
.arg("-productVersion")
.output()?;
let version_str = String::from_utf8(output.stdout)?;
let parts: Vec<&str> = version_str.trim().split('.').collect();
if parts.len() >= 2 {
let major = parts[0].parse::<u32>()?;
let minor = parts[1].parse::<u32>()?;
Ok((major, minor))
} else {
Err("Invalid macOS version format".into())
}
}
#[cfg(not(target_os = "macos"))]
Err("Not running on macOS".into())
}
}