fix: panel items not dropping on toplevel close

This commit is contained in:
Nova
2023-08-14 03:05:22 -04:00
parent 4e199dd43f
commit 433568da63
2 changed files with 7 additions and 9 deletions

View File

@@ -201,10 +201,6 @@ impl<B: Backend + ?Sized> PanelItem<B> {
ItemType::Panel(generic_panel_item), ItemType::Panel(generic_panel_item),
); );
// panel_item
// .seat_data
// .new_surface(&wl_surface, Arc::downgrade(&panel_item));
if let Some(startup_settings) = &startup_settings { if let Some(startup_settings) = &startup_settings {
if let Some(acceptor) = startup_settings if let Some(acceptor) = startup_settings
.acceptors .acceptors
@@ -413,7 +409,6 @@ impl<B: Backend + ?Sized> PanelItem<B> {
panel_item.configure_toplevel(info.size, info.states, info.bounds); panel_item.configure_toplevel(info.size, info.states, info.bounds);
Ok(()) Ok(())
} }
fn set_toplevel_capabilities_flex( fn set_toplevel_capabilities_flex(
node: &Node, node: &Node,
_calling_client: Arc<Client>, _calling_client: Arc<Client>,
@@ -434,7 +429,6 @@ impl<B: Backend + ?Sized> PanelItem<B> {
let Ok(data) = self.backend.serialize_toplevel() else {return}; let Ok(data) = self.backend.serialize_toplevel() else {return};
let _ = node.send_remote_signal("commit_toplevel", data); let _ = node.send_remote_signal("commit_toplevel", data);
} }
pub fn recommend_toplevel_state(&self, state: RecommendedState) { pub fn recommend_toplevel_state(&self, state: RecommendedState) {
let Some(node) = self.node.upgrade() else {return}; let Some(node) = self.node.upgrade() else {return};
let data = serialize(state).unwrap(); let data = serialize(state).unwrap();
@@ -442,6 +436,11 @@ impl<B: Backend + ?Sized> PanelItem<B> {
let _ = node.send_remote_signal("recommend_toplevel_state", data); let _ = node.send_remote_signal("recommend_toplevel_state", data);
} }
pub fn drop_toplevel(&self) {
let Some(node) = self.node.upgrade() else {return};
node.destroy();
}
} }
impl<B: Backend + ?Sized> PanelItemTrait for PanelItem<B> { impl<B: Backend + ?Sized> PanelItemTrait for PanelItem<B> {
fn uid(&self) -> &str { fn uid(&self) -> &str {
@@ -477,11 +476,9 @@ impl<B: Backend + ?Sized> Backend for PanelItem<B> {
fn pointer_motion(&self, surface: &SurfaceID, position: Vector2<f32>) { fn pointer_motion(&self, surface: &SurfaceID, position: Vector2<f32>) {
self.backend.pointer_motion(surface, position) self.backend.pointer_motion(surface, position)
} }
fn pointer_button(&self, surface: &SurfaceID, button: u32, pressed: bool) { fn pointer_button(&self, surface: &SurfaceID, button: u32, pressed: bool) {
self.backend.pointer_button(surface, button, pressed) self.backend.pointer_button(surface, button, pressed)
} }
fn pointer_scroll( fn pointer_scroll(
&self, &self,
surface: &SurfaceID, surface: &SurfaceID,
@@ -495,7 +492,6 @@ impl<B: Backend + ?Sized> Backend for PanelItem<B> {
fn keyboard_set_keymap(&self, keymap: &str) -> Result<()> { fn keyboard_set_keymap(&self, keymap: &str) -> Result<()> {
self.backend.keyboard_set_keymap(keymap) self.backend.keyboard_set_keymap(keymap)
} }
fn keyboard_key(&self, surface: &SurfaceID, key: u32, state: bool) { fn keyboard_key(&self, surface: &SurfaceID, key: u32, state: bool) {
self.backend.keyboard_key(surface, key, state) self.backend.keyboard_key(surface, key, state)
} }

View File

@@ -908,6 +908,8 @@ impl XDGBackend {
} }
pub fn on_drop(&self) { pub fn on_drop(&self) {
let Some(toplevel_popup) = self.toplevel_xdg_surface().and_then(|s| XdgSurfaceData::get(&s).and_then(|s| s.lock().panel_item.upgrade())) else {return};
toplevel_popup.drop_toplevel();
let Some(toplevel) = self.toplevel_wl_surface() else {return}; let Some(toplevel) = self.toplevel_wl_surface() else {return};
self.seat.drop_surface(&toplevel); self.seat.drop_surface(&toplevel);