* Fixes registration of event handler for xinput-2 device changes, revealed by this improvement. * Pushes `.unwrap()` panic-ing outwards to callers. * Includes a description of what the X11 call was doing when a failure was encountered. * Fixes a variety of places where the X11 reply wasn't being inspected for failures. * Destroys windows on failure during setup. New structure makes it possible for the caller of `open_window` to carry on despite failures, and so partially initialized window should be removed (though all calls I looked at also panic currently). Considered pushing this through `linux/x11/client.rs` too but figured it'd be nice to minimize merge conflicts with #20853. Release Notes: - N/A
53 lines
1.3 KiB
Rust
53 lines
1.3 KiB
Rust
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<Pixels>,
|
|
uuid: Uuid,
|
|
}
|
|
|
|
impl X11Display {
|
|
pub(crate) fn new(
|
|
xcb: &XCBConnection,
|
|
scale_factor: f32,
|
|
x_screen_index: usize,
|
|
) -> anyhow::Result<Self> {
|
|
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<Uuid> {
|
|
Ok(self.uuid)
|
|
}
|
|
|
|
fn bounds(&self) -> Bounds<Pixels> {
|
|
self.bounds
|
|
}
|
|
}
|