use crate::{common::TraitCapturer, x11, TraitFrame, Pixfmt}; use std::{io, time::Duration}; pub struct Capturer(x11::Capturer); pub const IS_CURSOR_EMBEDDED: bool = false; impl Capturer { pub fn new(display: Display) -> io::Result { x11::Capturer::new(display.0).map(Capturer) } pub fn width(&self) -> usize { self.0.display().rect().w as usize } pub fn height(&self) -> usize { self.0.display().rect().h as usize } } impl TraitCapturer for Capturer { fn frame<'a>(&'a mut self, _timeout: Duration) -> io::Result> { Ok(self.0.frame()?) } } pub struct Frame<'a>{ pub data: &'a [u8], pub pixfmt:Pixfmt, pub stride:Vec, } impl<'a> Frame<'a> { pub fn new(data:&'a [u8], pixfmt:Pixfmt, h:usize) -> Self { let stride = data.len() / h; let mut v = Vec::new(); v.push(stride); Self { data, pixfmt, stride: v } } } impl<'a> TraitFrame for Frame<'a> { fn data(&self) -> &[u8] { self.data } fn stride(&self) -> Vec { self.stride.clone() } fn pixfmt(&self) -> crate::Pixfmt { self.pixfmt } } pub struct Display(x11::Display); impl Display { pub fn primary() -> io::Result { let server = match x11::Server::default() { Ok(server) => server, Err(_) => return Err(io::ErrorKind::ConnectionRefused.into()), }; let mut displays = x11::Server::displays(server); let mut best = displays.next(); if best.as_ref().map(|x| x.is_default()) == Some(false) { best = displays.find(|x| x.is_default()).or(best); } match best { Some(best) => Ok(Display(best)), None => Err(io::ErrorKind::NotFound.into()), } } pub fn all() -> io::Result> { let server = match x11::Server::default() { Ok(server) => server, Err(_) => return Err(io::ErrorKind::ConnectionRefused.into()), }; Ok(x11::Server::displays(server).map(Display).collect()) } pub fn width(&self) -> usize { self.0.rect().w as usize } pub fn height(&self) -> usize { self.0.rect().h as usize } pub fn origin(&self) -> (i32, i32) { let r = self.0.rect(); (r.x as _, r.y as _) } pub fn is_online(&self) -> bool { true } pub fn is_primary(&self) -> bool { self.0.is_default() } pub fn name(&self) -> String { self.0.name() } }