#![warn(missing_docs)]
pub mod capture;
pub mod clock;
pub mod config;
pub mod detect;
pub mod engine;
pub mod error;
pub mod event;
pub mod frame;
pub mod session;
pub mod sink;
#[cfg(feature = "gui")]
pub mod gui;
pub use capture::{enumerate_windows, CaptureBackend, ControlFlow, MockBackend};
pub use clock::{Clock, MockClock, SystemClock};
pub use config::{Config, ConfigBuilder, ImageOpts, RoiHint, RoiKind, Rotation, Target};
pub use engine::Engine;
pub use error::{CaptureError, Error, SinkError};
pub use event::{CaptureEvent, CaptureMeta, EncodedImage, EventKind, ImageFormat, SaveMask};
pub use frame::{RawFrame, Rect, WindowInfo};
pub use sink::{ChannelSink, CompositeSink, DirectorySink, Sink};
pub fn default_backend(config: &Config) -> Result<Box<dyn CaptureBackend>, Error> {
#[cfg(all(windows, feature = "wgc"))]
{
let backend = capture::windows::wgc::WgcBackend::for_target(&config.target)?;
Ok(Box::new(backend))
}
#[cfg(not(all(windows, feature = "wgc")))]
{
let _ = config;
Err(Error::NoBackend(
"live capture requires building on Windows with the `wgc` feature".into(),
))
}
}
pub fn watch(config: Config, mut sink: impl Sink) -> Result<(), Error> {
config.validate()?;
let mut backend = default_backend(&config)?;
let mut engine = Engine::new(config, SystemClock);
backend.run(&mut |frame| {
for event in engine.process(&frame, frame.captured_at) {
if sink.on_event(&event).is_err() {
return ControlFlow::Stop;
}
}
ControlFlow::Continue
})?;
sink.flush()?;
Ok(())
}