fix(wayland): drop panel item correctly

This commit is contained in:
Nova
2023-01-01 14:37:11 -05:00
parent c2665938d9
commit c0c0dddf23
2 changed files with 19 additions and 1 deletions

View File

@@ -561,6 +561,18 @@ impl PanelItem {
let _ = node.send_remote_signal("set_cursor", &data);
}
pub fn on_drop(&self) {
let Ok(toplevel_surface) = self.toplevel_surface.upgrade() else { return; };
let Some(focused_surface) = self.seat_data.pointer_focused_surface() else { return; };
if focused_surface.id() == toplevel_surface.id() {
let Some(pointer) = self.seat_data.pointer() else { return };
pointer.leave(0, &toplevel_surface);
pointer.frame();
*self.seat_data.pointer_focus.lock() = None;
}
}
}
impl ItemSpecialization for PanelItem {
fn serialize_start_data(&self, id: &str) -> Vec<u8> {

View File

@@ -335,7 +335,13 @@ impl Dispatch<XdgToplevel, XdgToplevelData, WaylandState> for WaylandState {
xdg_toplevel::Request::SetFullscreen { output: _ } => (),
xdg_toplevel::Request::UnsetFullscreen => (),
xdg_toplevel::Request::SetMinimized => (),
xdg_toplevel::Request::Destroy => (),
xdg_toplevel::Request::Destroy => {
let Ok(wl_surface) = data.xdg_surface_data.wl_surface.upgrade() else { return };
let Some(panel_item) = compositor::with_states(&wl_surface, |data| {
data.data_map.get::<Arc<PanelItem>>().cloned()
}) else { return };
panel_item.on_drop();
}
_ => unreachable!(),
}
}