pub mod mock;
pub use mock::MockBackend;
#[cfg(all(windows, feature = "wgc"))]
pub mod windows;
use crate::error::CaptureError;
use crate::frame::{RawFrame, WindowInfo};
use std::sync::atomic::AtomicBool;
use std::sync::Arc;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ControlFlow {
Continue,
Stop,
}
pub trait CaptureBackend {
fn run(
&mut self,
on_frame: &mut dyn FnMut(RawFrame) -> ControlFlow,
) -> Result<(), CaptureError>;
fn stop(&mut self);
fn stop_signal(&self) -> Option<Arc<AtomicBool>> {
None
}
}
impl CaptureBackend for Box<dyn CaptureBackend> {
fn run(
&mut self,
on_frame: &mut dyn FnMut(RawFrame) -> ControlFlow,
) -> Result<(), CaptureError> {
(**self).run(on_frame)
}
fn stop(&mut self) {
(**self).stop()
}
fn stop_signal(&self) -> Option<Arc<AtomicBool>> {
(**self).stop_signal()
}
}
pub fn enumerate_windows() -> Result<Vec<WindowInfo>, CaptureError> {
#[cfg(all(windows, feature = "wgc"))]
{
windows::enumerate::enumerate_windows()
}
#[cfg(not(all(windows, feature = "wgc")))]
{
Err(CaptureError::Backend(
"window enumeration requires building on Windows with the `wgc` feature".into(),
))
}
}