From 55e0c34e98bd0a3a466480f7d1dab0320065b459 Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Fri, 8 Jul 2022 23:19:35 +0200 Subject: [PATCH] workspaces: Fix issues causing malformed or flood of messages --- src/shell/mod.rs | 8 ++++---- src/wayland/protocols/workspace.rs | 17 ++++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/shell/mod.rs b/src/shell/mod.rs index 2a348b6b..a4e1778a 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -505,7 +505,6 @@ impl Shell { pub fn refresh(&mut self, dh: &DisplayHandle) { self.popups.cleanup(); - let mut state = self.workspace_state.update(); for output in &self.outputs { let workspace = match &self.workspace_mode { WorkspaceMode::OutputBound => { @@ -520,13 +519,14 @@ impl Shell { WorkspaceMode::Global { active, .. } => &mut self.spaces[*active], }; workspace.refresh(dh); - if workspace.space.windows().next().is_none() { - state.add_workspace_state(&workspace.handle, WState::Hidden); + if workspace.space.windows().next().is_none() + && !self.workspace_state.workspace_states(&workspace.handle).map(|mut i| i.any(|s| s == &WState::Hidden)).unwrap_or(true) + { + self.workspace_state.update().add_workspace_state(&workspace.handle, WState::Hidden); } let mut map = layer_map_for_output(output); map.cleanup(dh); } - std::mem::drop(state); self.toplevel_info_state .refresh(Some(&self.workspace_state)); } diff --git a/src/wayland/protocols/workspace.rs b/src/wayland/protocols/workspace.rs index 647fb306..e0a85460 100644 --- a/src/wayland/protocols/workspace.rs +++ b/src/wayland/protocols/workspace.rs @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only -use std::sync::Mutex; +use std::{ + collections::HashSet, + sync::Mutex, +}; use smithay::{ reexports::wayland_server::{ @@ -81,7 +84,7 @@ pub struct Workspace { name: String, capabilities: Vec, coordinates: Vec, - states: Vec, + states: HashSet, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -94,7 +97,7 @@ pub struct WorkspaceDataInner { name: String, capabilities: Vec, coordinates: Vec, - states: Vec, + states: HashSet, } pub type WorkspaceData = Mutex; @@ -714,7 +717,7 @@ where .iter_mut() .find_map(|g| g.workspaces.iter_mut().find(|w| w.id == workspace.id)) { - workspace.states.push(state); + workspace.states.insert(state); } } @@ -729,7 +732,7 @@ where .iter_mut() .find_map(|g| g.workspaces.iter_mut().find(|w| w.id == workspace.id)) { - workspace.states.retain(|s| *s != state); + workspace.states.remove(&state); } } } @@ -808,7 +811,7 @@ where for old_output in handle_state .outputs .iter() - .filter(|o| group.outputs.contains(o)) + .filter(|o| !group.outputs.contains(o)) { old_output.with_client_outputs(dh, &client, |_dh, wl_output| { instance.output_leave(wl_output); @@ -919,7 +922,7 @@ where } if handle_state.states != workspace.states { let states: Vec = { - let mut states = workspace.states.clone(); + let mut states = workspace.states.iter().cloned().collect::>(); let ratio = std::mem::size_of::() / std::mem::size_of::(); let ptr = states.as_mut_ptr() as *mut u8;