#[cfg(feature = "macos_14_0")]
use screencapturekit::prelude::*;
#[cfg(feature = "macos_14_0")]
use screencapturekit::screenshot_manager::{CGImageExt, SCScreenshotManager};
#[cfg(not(feature = "macos_14_0"))]
fn main() {
println!("⚠️ This example requires macOS 14.0+");
println!(" Run with: cargo run --example 05_screenshot --features macos_14_0");
}
#[cfg(feature = "macos_14_0")]
#[allow(clippy::too_many_lines)]
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("📸 Screenshot Capture\n");
let content = SCShareableContent::get()?;
let display = content
.displays()
.into_iter()
.next()
.ok_or("No displays found")?;
println!("Display: {}x{}", display.width(), display.height());
let filter = SCContentFilter::create()
.with_display(&display)
.with_excluding_windows(&[])
.build();
if let Some(info) =
screencapturekit::shareable_content::SCShareableContentInfo::for_filter(&filter)
{
println!("\n📊 Content Info:");
println!(" Style: {:?}", info.style());
println!(" Scale: {:.1}x (Retina)", info.point_pixel_scale());
let (pw, ph) = info.pixel_size();
println!(" Pixel dimensions: {pw}x{ph}");
}
let config = SCStreamConfiguration::new()
.with_width(1920)
.with_height(1080);
println!("\n📷 Capturing full screenshot...");
let image = SCScreenshotManager::capture_image(&filter, &config)?;
let width = image.width();
let height = image.height();
println!(" Captured: {width}x{height}");
let filename = "screenshot.png";
save_image_as_png(&image, filename)?;
println!(" ✅ Saved to {filename}");
#[cfg(feature = "macos_15_2")]
{
use screencapturekit::cg::CGRect;
println!("\n📷 Capturing screen region (macOS 15.2+)...");
let rect = CGRect::new(100.0, 100.0, 640.0, 480.0);
match SCScreenshotManager::capture_image_in_rect(rect) {
Ok(region_image) => {
let filename = "screenshot_region.png";
save_image_as_png(®ion_image, filename)?;
println!(
" Captured region: {}x{}",
region_image.width(),
region_image.height()
);
println!(" ✅ Saved to {filename}");
}
Err(e) => {
println!(" ⚠️ Region capture failed: {e}");
}
}
}
#[cfg(feature = "macos_26_0")]
{
use screencapturekit::screenshot_manager::{
SCScreenshotConfiguration, SCScreenshotDynamicRange,
};
println!("\n🌈 Advanced HDR Screenshot (macOS 26.0+)...");
let screenshot_config = SCScreenshotConfiguration::new()
.with_width(1920)
.with_height(1080)
.with_shows_cursor(true)
.with_dynamic_range(SCScreenshotDynamicRange::BothSDRAndHDR)
.with_ignore_shadows(false)
.with_include_child_windows(true);
match SCScreenshotManager::capture_screenshot(&filter, &screenshot_config) {
Ok(output) => {
if let Some(sdr) = output.sdr_image() {
let filename = "screenshot_sdr.png";
save_image_as_png(&sdr, filename)?;
println!(" SDR: {}x{} → {filename}", sdr.width(), sdr.height());
}
if let Some(hdr) = output.hdr_image() {
let filename = "screenshot_hdr.png";
save_image_as_png(&hdr, filename)?;
println!(" HDR: {}x{} → {filename}", hdr.width(), hdr.height());
} else {
println!(" HDR: Not available (requires HDR display)");
}
println!(" ✅ Advanced screenshot complete");
}
Err(e) => {
println!(" ⚠️ Advanced screenshot failed: {e}");
}
}
println!("\n💾 Screenshot with file output (macOS 26.0+)...");
let file_config = SCScreenshotConfiguration::new()
.with_width(1920)
.with_height(1080)
.with_file_path("screenshot_direct.png");
match SCScreenshotManager::capture_screenshot(&filter, &file_config) {
Ok(output) => {
if let Some(saved) = output.file_path() {
println!(" ✅ Saved directly to: {}", saved.display());
} else {
println!(" ✅ Screenshot captured (file save may be async)");
}
}
Err(e) => {
println!(" ⚠️ File screenshot failed: {e}");
}
}
}
println!("\n✅ Screenshot example completed!");
Ok(())
}
#[cfg(feature = "macos_14_0")]
fn save_image_as_png(
image: &screencapturekit::screenshot_manager::CGImage,
filename: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let rgba_data = image.rgba_data()?;
let file = std::fs::File::create(filename)?;
let buf_writer = std::io::BufWriter::new(file);
#[allow(clippy::cast_possible_truncation)]
let mut encoder = png::Encoder::new(buf_writer, image.width() as u32, image.height() as u32);
encoder.set_color(png::ColorType::Rgba);
encoder.set_depth(png::BitDepth::Eight);
let mut writer = encoder.write_header()?;
writer.write_image_data(&rgba_data)?;
Ok(())
}