Skip to main content

SCContentFilter

Struct SCContentFilter 

Source
pub struct SCContentFilter(/* private fields */);
Expand description

Content filter for ScreenCaptureKit streams

Defines what content to capture (displays, windows, or applications).

§Immutability, Clone, Send and Sync

An SCContentFilter is immutable once built. Every method on it is a read; the one property Apple declares as writable, includeMenuBar, is set by SCContentFilterBuilder::with_include_menu_bar while the underlying object is still uniquely owned by the builder and has not yet escaped.

That invariant is what makes the three otherwise-conflicting properties of this type sound together:

  • Clone aliases. SCContentFilter is a plain NSObject: Apple provides no copy initialiser and does not conform it to NSCopying, so a deep copy is impossible. Cloning therefore performs an Objective-C retain and hands back a second handle to the same object.
  • Send + Sync are unsafe impls. They promise that sharing a handle across threads is safe.
  • includeMenuBar is @property(nonatomic, assign) — an unsynchronised BOOL ivar.

Exposing a setter alongside an aliasing Clone and Sync would let two threads write and read that ivar concurrently through safe Rust, which is a data race. Removing the setter (rather than Clone or Send/Sync) keeps the ergonomic handle semantics while leaving nothing to race on. Filters obtained from the content sharing picker keep whatever includeMenuBar value the system chose; build your own filter if you need to override it.

§Examples

use screencapturekit::shareable_content::SCShareableContent;
use screencapturekit::stream::content_filter::SCContentFilter;

let content = SCShareableContent::get()?;
let display = &content.displays()[0];

// Capture entire display
let filter = SCContentFilter::create()
    .with_display(display)
    .with_excluding_windows(&[])
    .build()?;

// Or capture a specific window
let window = &content.windows()[0];
let filter = SCContentFilter::create()
    .with_window(window)
    .build()?;

Implementations§

Source§

impl SCContentFilter

Source

pub fn create() -> SCContentFilterBuilder

Creates a content filter builder

§Examples
use screencapturekit::prelude::*;

let content = SCShareableContent::get()?;
let display = &content.displays()[0];

let filter = SCContentFilter::create()
    .with_display(display)
    .with_excluding_windows(&[])
    .build()?;
Source

pub fn content_rect(&self) -> CGRect

Gets the content rectangle for this filter (macOS 14.0+)

This mirrors Apple’s read-only SCContentFilter.contentRect: the rect, in points, that the filter’s content occupies. There is no setter — SCContentFilter derives the rect from the display/window/application it was built from. Returns a zero rect on macOS < 14.0.

Source

pub fn style(&self) -> SCResult<SCShareableContentStyle>

Get the content style (macOS 14.0+)

Returns the type of content being captured (window, display, application, or none).

Source

pub fn stream_type(&self) -> SCResult<SCStreamType>

👎Deprecated since 8.0.0:

Apple deprecated SCContentFilter.streamType in macOS 14.2 (and SCStreamType itself in 15.0). Use style(), which also distinguishes application filters.

Get the stream type (macOS 14.0+)

Returns whether this filter captures a window or a display.

Source

pub fn point_pixel_scale(&self) -> f32

Get the point-to-pixel scale factor (macOS 14.0+)

Returns the scaling factor used to convert points to pixels. Typically 2.0 for Retina displays.

Source

pub fn include_menu_bar(&self) -> bool

Whether the menu bar is included in capture (macOS 14.2+)

Fixed when the filter is built. Apple’s default depends on the constructor — true for display-excluding filters, false for display-including ones — and is overridden by SCContentFilterBuilder::with_include_menu_bar.

There is deliberately no setter: SCContentFilter is immutable once it escapes the builder, which is what makes Clone, Send and Sync sound for this handle. See the type-level docs.

Source

pub fn included_displays(&self) -> Vec<SCDisplay>

Get included displays (macOS 15.2+)

Returns the displays currently included in this filter.

Source

pub fn included_windows(&self) -> Vec<SCWindow>

Get included windows (macOS 15.2+)

Returns the windows currently included in this filter.

Source

pub fn included_applications(&self) -> Vec<SCRunningApplication>

Get included applications (macOS 15.2+)

Returns the applications currently included in this filter.

Trait Implementations§

Source§

impl Clone for SCContentFilter

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SCContentFilter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for SCContentFilter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for SCContentFilter

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
Source§

impl Eq for SCContentFilter

Source§

impl Hash for SCContentFilter

Source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SCContentFilter

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Send for SCContentFilter

Source§

impl Sync for SCContentFilter

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.