fix(wayland): don't clone topleveldata

This commit is contained in:
Nova
2023-09-16 13:52:31 -04:00
parent 218089a21d
commit 1babfdf10d

View File

@@ -499,7 +499,7 @@ impl Dispatch<XdgSurface, Mutex<XdgSurfaceData>, WaylandState> for WaylandState
}
}
#[derive(Debug, Clone)]
#[derive(Debug)]
pub struct ToplevelData {
panel_item: OnceCell<Weak<PanelItem<XDGBackend>>>,
xdg_surface: WlWeak<XdgSurface>,
@@ -907,11 +907,24 @@ impl Drop for XDGBackend {
}
impl Backend for XDGBackend {
fn start_data(&self) -> Result<PanelItemInitData> {
let toplevel_data = self
.toplevel()
.map(|t| ToplevelData::get(&t).lock().clone())
let toplevel = self.toplevel();
let toplevel_data = toplevel
.as_ref()
.map(|t| ToplevelData::get(t).lock())
.ok_or_else(|| eyre!("Could not get toplevel"))?;
let parent = toplevel_data
.parent
.as_ref()
.and_then(|p| p.upgrade().ok())
.and_then(|p| ToplevelData::get(&p).lock().panel_item())
.map(|p| p.uid.clone());
let title = toplevel_data.title.clone();
let app_id = toplevel_data.app_id.clone();
let min_size = toplevel_data.min_size.clone();
let max_size = toplevel_data.max_size.clone();
drop(toplevel_data);
let pointer_grab = self.pointer_grab.lock().clone();
let keyboard_grab = self.keyboard_grab.lock().clone();
@@ -919,27 +932,24 @@ impl Backend for XDGBackend {
let Some(core_surface) = CoreSurface::from_wl_surface(&wl_surface) else {bail!("Core surface not found")};
let Some(size) = core_surface.size() else {bail!("Surface size not found")};
let logical_rectangle = self
.toplevel_xdg_surface()
.as_ref()
.and_then(XdgSurfaceData::get)
.and_then(|d| d.lock().geometry.clone())
.unwrap_or_else(|| Geometry {
origin: [0, 0].into(),
size,
});
let toplevel = ToplevelInfo {
parent: toplevel_data
.parent
.as_ref()
.and_then(|p| p.upgrade().ok())
.and_then(|p| ToplevelData::get(&p).lock().panel_item())
.map(|p| p.uid.clone()),
title: toplevel_data.title.clone(),
app_id: toplevel_data.app_id.clone(),
parent,
title,
app_id,
size,
min_size: toplevel_data.min_size.clone(),
max_size: toplevel_data.max_size.clone(),
logical_rectangle: self
.toplevel_xdg_surface()
.as_ref()
.and_then(XdgSurfaceData::get)
.and_then(|d| d.lock().geometry.clone())
.unwrap_or_else(|| Geometry {
origin: [0, 0].into(),
size,
}),
min_size,
max_size,
logical_rectangle,
};
Ok(PanelItemInitData {