refactor(wayland): weak references to objects in roles

This commit is contained in:
Nova
2025-09-06 15:19:37 -07:00
parent 053d468035
commit 4641f4f724
2 changed files with 38 additions and 8 deletions

View File

@@ -101,7 +101,7 @@ impl XdgSurface for Surface {
}
if role
.set(XdgSurfaceRole::Toplevel(toplevel.clone()))
.set(XdgSurfaceRole::Toplevel(Arc::downgrade(&toplevel)))
.is_err()
{
return client
@@ -140,6 +140,9 @@ impl XdgSurface for Surface {
let Some(XdgSurfaceRole::Toplevel(toplevel)) = role.get() else {
return true;
};
let Some(toplevel) = toplevel.upgrade() else {
return true;
};
// Only proceed if configured and has valid buffer
let has_valid_buffer = state
@@ -184,10 +187,34 @@ impl XdgSurface for Surface {
let panel_item = match parent.wl_surface().role.get().unwrap() {
SurfaceRole::Xdg(role) => match role.get().unwrap() {
XdgSurfaceRole::Toplevel(toplevel) => {
let toplevel_lock = toplevel.mapped.lock();
toplevel_lock.as_ref().unwrap()._panel_item.clone()
if let Some(toplevel) = toplevel.upgrade() {
let toplevel_lock = toplevel.mapped.lock();
toplevel_lock.as_ref().unwrap()._panel_item.clone()
} else {
return client
.protocol_error(
sender_id,
popup_id,
3, // INVALID_POPUP_PARENT
"Parent surface does not have an XDG role".to_string(),
)
.await;
}
}
XdgSurfaceRole::Popup(popup) => {
if let Some(popup) = popup.upgrade() {
popup.panel_item.upgrade().unwrap()
} else {
return client
.protocol_error(
sender_id,
popup_id,
3, // INVALID_POPUP_PARENT
"Parent surface does not have an XDG role".to_string(),
)
.await;
}
}
XdgSurfaceRole::Popup(popup) => popup.panel_item.upgrade().unwrap(),
},
_ => {
return client
@@ -247,7 +274,10 @@ impl XdgSurface for Surface {
.await;
}
if role.set(XdgSurfaceRole::Popup(popup.clone())).is_err() {
if role
.set(XdgSurfaceRole::Popup(Arc::downgrade(&popup)))
.is_err()
{
return client
.protocol_error(
sender_id,