diff --git a/src/wayland/panel_item.rs b/src/wayland/panel_item.rs index 5e9e881..1adc75b 100644 --- a/src/wayland/panel_item.rs +++ b/src/wayland/panel_item.rs @@ -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 { diff --git a/src/wayland/xdg_shell.rs b/src/wayland/xdg_shell.rs index fddec97..38f1d2f 100644 --- a/src/wayland/xdg_shell.rs +++ b/src/wayland/xdg_shell.rs @@ -335,7 +335,13 @@ impl Dispatch 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::>().cloned() + }) else { return }; + panel_item.on_drop(); + } _ => unreachable!(), } }