use anyhow::Result; use uuid::Uuid; use x11rb::{connection::Connection as _, xcb_ffi::XCBConnection}; use crate::{px, Bounds, DisplayId, Pixels, PlatformDisplay, Size}; #[derive(Debug)] pub(crate) struct X11Display { x_screen_index: usize, bounds: Bounds, uuid: Uuid, } impl X11Display { pub(crate) fn new( xcb: &XCBConnection, scale_factor: f32, x_screen_index: usize, ) -> anyhow::Result { let Some(screen) = xcb.setup().roots.get(x_screen_index) else { return Err(anyhow::anyhow!( "No screen found with index {}", x_screen_index )); }; Ok(Self { x_screen_index, bounds: Bounds { origin: Default::default(), size: Size { width: px(screen.width_in_pixels as f32 / scale_factor), height: px(screen.height_in_pixels as f32 / scale_factor), }, }, uuid: Uuid::from_bytes([0; 16]), }) } } impl PlatformDisplay for X11Display { fn id(&self) -> DisplayId { DisplayId(self.x_screen_index as u32) } fn uuid(&self) -> Result { Ok(self.uuid) } fn bounds(&self) -> Bounds { self.bounds } }