use anyhow::Context as _; use uuid::Uuid; use x11rb::{connection::Connection as _, xcb_ffi::XCBConnection}; use gpui::{Bounds, DisplayId, Pixels, PlatformDisplay, Size, px}; #[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 screen = xcb .setup() .roots .get(x_screen_index) .with_context(|| format!("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::new(self.x_screen_index as u64) } fn uuid(&self) -> anyhow::Result { Ok(self.uuid) } fn bounds(&self) -> Bounds { self.bounds } }