use paris::info; use scrap::{Capturer, Display}; use super::{config::DisplayConfig, screen::Screen, screenshot::Screenshot}; pub struct DisplayPicker { pub screen: Screen, pub config: DisplayConfig, } impl DisplayPicker { pub fn new(screen: Screen, config: DisplayConfig) -> Self { Self { screen, config } } pub fn from_config(config: DisplayConfig) -> anyhow::Result { let displays = Display::all() .map_err(|error| anyhow::anyhow!("Can not get all of displays. {}", error))?; let display = displays .into_iter() .skip(config.index_of_display) .next(); match display { Some(display) => { let height = display.height(); let width = display.width(); info!("dw: {}, cw: {}", width, config.display_height); assert_eq!(width, config.display_width); let capturer = Capturer::new(display)?; let screen = Screen::new(capturer, width, height); Ok(Self { screen, config }) } None => { anyhow::bail!("Index out of displays range.") } } } pub fn take_screenshot(&mut self) -> anyhow::Result { let bitmap = self .screen .take() .map_err(|error| anyhow::anyhow!("take screenshot for display failed. {}", error))?; // info!("bitmap size {}", bitmap.len()); let screenshot = Screenshot::new(bitmap, self.config); Ok(screenshot) } }