use std::sync::mpsc::Receiver;
use image::RgbaImage;
use crate::{
VideoRecorder, error::XCapResult, platform::impl_monitor::ImplMonitor, video_recorder::Frame,
};
#[derive(Debug, Clone)]
pub struct Monitor {
pub(crate) impl_monitor: ImplMonitor,
}
impl Monitor {
pub(crate) fn new(impl_monitor: ImplMonitor) -> Monitor {
Monitor { impl_monitor }
}
}
impl Monitor {
pub fn all() -> XCapResult<Vec<Monitor>> {
let monitors = ImplMonitor::all()?
.iter()
.map(|impl_monitor| Monitor::new(impl_monitor.clone()))
.collect();
Ok(monitors)
}
pub fn from_point(x: i32, y: i32) -> XCapResult<Monitor> {
let impl_monitor = ImplMonitor::from_point(x, y)?;
Ok(Monitor::new(impl_monitor))
}
}
impl Monitor {
pub fn id(&self) -> XCapResult<u32> {
self.impl_monitor.id()
}
pub fn name(&self) -> XCapResult<String> {
self.impl_monitor.name()
}
pub fn friendly_name(&self) -> XCapResult<String> {
self.impl_monitor.friendly_name()
}
pub fn x(&self) -> XCapResult<i32> {
self.impl_monitor.x()
}
pub fn y(&self) -> XCapResult<i32> {
self.impl_monitor.y()
}
pub fn width(&self) -> XCapResult<u32> {
self.impl_monitor.width()
}
pub fn height(&self) -> XCapResult<u32> {
self.impl_monitor.height()
}
pub fn rotation(&self) -> XCapResult<f32> {
self.impl_monitor.rotation()
}
pub fn scale_factor(&self) -> XCapResult<f32> {
self.impl_monitor.scale_factor()
}
pub fn frequency(&self) -> XCapResult<f32> {
self.impl_monitor.frequency()
}
pub fn is_primary(&self) -> XCapResult<bool> {
self.impl_monitor.is_primary()
}
pub fn is_builtin(&self) -> XCapResult<bool> {
self.impl_monitor.is_builtin()
}
}
impl Monitor {
pub fn capture_image(&self) -> XCapResult<RgbaImage> {
self.impl_monitor.capture_image()
}
pub fn capture_region(&self, x: u32, y: u32, width: u32, height: u32) -> XCapResult<RgbaImage> {
self.impl_monitor.capture_region(x, y, width, height)
}
pub fn video_recorder(&self) -> XCapResult<(VideoRecorder, Receiver<Frame>)> {
let (impl_video_recorder, sx) = self.impl_monitor.video_recorder()?;
Ok((VideoRecorder::new(impl_video_recorder), sx))
}
}
#[cfg(test)]
mod tests {
use crate::XCapError;
use super::*;
#[test]
fn test_capture_region_out_of_bounds() {
let monitors = Monitor::all().unwrap();
let monitor = &monitors[0];
let x = monitor.width().unwrap() / 2;
let y = monitor.height().unwrap() / 2;
let width = monitor.width().unwrap();
let height = monitor.height().unwrap();
let result = monitor.capture_region(x, y, width, height);
match result {
Err(XCapError::InvalidCaptureRegion(_)) => (),
_ => panic!("Expected InvalidCaptureRegion error"),
}
}
}