From c0c0dddf231c255387fc023ac9ca253d86952683 Mon Sep 17 00:00:00 2001 From: Nova Date: Sun, 1 Jan 2023 14:37:11 -0500 Subject: [PATCH] fix(wayland): drop panel item correctly --- src/wayland/panel_item.rs | 12 ++++++++++++ src/wayland/xdg_shell.rs | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) 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!(), } }