52 lines
1.6 KiB
Rust
52 lines
1.6 KiB
Rust
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<Self> {
|
|
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<Screenshot> {
|
|
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)
|
|
}
|
|
}
|