workspaces: Fix issues causing malformed or flood of messages
This commit is contained in:
parent
5a0752957b
commit
55e0c34e98
2 changed files with 14 additions and 11 deletions
|
|
@ -505,7 +505,6 @@ impl Shell {
|
||||||
|
|
||||||
pub fn refresh(&mut self, dh: &DisplayHandle) {
|
pub fn refresh(&mut self, dh: &DisplayHandle) {
|
||||||
self.popups.cleanup();
|
self.popups.cleanup();
|
||||||
let mut state = self.workspace_state.update();
|
|
||||||
for output in &self.outputs {
|
for output in &self.outputs {
|
||||||
let workspace = match &self.workspace_mode {
|
let workspace = match &self.workspace_mode {
|
||||||
WorkspaceMode::OutputBound => {
|
WorkspaceMode::OutputBound => {
|
||||||
|
|
@ -520,13 +519,14 @@ impl Shell {
|
||||||
WorkspaceMode::Global { active, .. } => &mut self.spaces[*active],
|
WorkspaceMode::Global { active, .. } => &mut self.spaces[*active],
|
||||||
};
|
};
|
||||||
workspace.refresh(dh);
|
workspace.refresh(dh);
|
||||||
if workspace.space.windows().next().is_none() {
|
if workspace.space.windows().next().is_none()
|
||||||
state.add_workspace_state(&workspace.handle, WState::Hidden);
|
&& !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);
|
let mut map = layer_map_for_output(output);
|
||||||
map.cleanup(dh);
|
map.cleanup(dh);
|
||||||
}
|
}
|
||||||
std::mem::drop(state);
|
|
||||||
self.toplevel_info_state
|
self.toplevel_info_state
|
||||||
.refresh(Some(&self.workspace_state));
|
.refresh(Some(&self.workspace_state));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use std::sync::Mutex;
|
use std::{
|
||||||
|
collections::HashSet,
|
||||||
|
sync::Mutex,
|
||||||
|
};
|
||||||
|
|
||||||
use smithay::{
|
use smithay::{
|
||||||
reexports::wayland_server::{
|
reexports::wayland_server::{
|
||||||
|
|
@ -81,7 +84,7 @@ pub struct Workspace {
|
||||||
name: String,
|
name: String,
|
||||||
capabilities: Vec<WorkspaceCapabilities>,
|
capabilities: Vec<WorkspaceCapabilities>,
|
||||||
coordinates: Vec<u32>,
|
coordinates: Vec<u32>,
|
||||||
states: Vec<zcosmic_workspace_handle_v1::State>,
|
states: HashSet<zcosmic_workspace_handle_v1::State>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
|
|
@ -94,7 +97,7 @@ pub struct WorkspaceDataInner {
|
||||||
name: String,
|
name: String,
|
||||||
capabilities: Vec<WorkspaceCapabilities>,
|
capabilities: Vec<WorkspaceCapabilities>,
|
||||||
coordinates: Vec<u32>,
|
coordinates: Vec<u32>,
|
||||||
states: Vec<zcosmic_workspace_handle_v1::State>,
|
states: HashSet<zcosmic_workspace_handle_v1::State>,
|
||||||
}
|
}
|
||||||
pub type WorkspaceData = Mutex<WorkspaceDataInner>;
|
pub type WorkspaceData = Mutex<WorkspaceDataInner>;
|
||||||
|
|
||||||
|
|
@ -714,7 +717,7 @@ where
|
||||||
.iter_mut()
|
.iter_mut()
|
||||||
.find_map(|g| g.workspaces.iter_mut().find(|w| w.id == workspace.id))
|
.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()
|
.iter_mut()
|
||||||
.find_map(|g| g.workspaces.iter_mut().find(|w| w.id == workspace.id))
|
.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
|
for old_output in handle_state
|
||||||
.outputs
|
.outputs
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|o| group.outputs.contains(o))
|
.filter(|o| !group.outputs.contains(o))
|
||||||
{
|
{
|
||||||
old_output.with_client_outputs(dh, &client, |_dh, wl_output| {
|
old_output.with_client_outputs(dh, &client, |_dh, wl_output| {
|
||||||
instance.output_leave(wl_output);
|
instance.output_leave(wl_output);
|
||||||
|
|
@ -919,7 +922,7 @@ where
|
||||||
}
|
}
|
||||||
if handle_state.states != workspace.states {
|
if handle_state.states != workspace.states {
|
||||||
let states: Vec<u8> = {
|
let states: Vec<u8> = {
|
||||||
let mut states = workspace.states.clone();
|
let mut states = workspace.states.iter().cloned().collect::<Vec<_>>();
|
||||||
let ratio = std::mem::size_of::<zcosmic_workspace_handle_v1::State>()
|
let ratio = std::mem::size_of::<zcosmic_workspace_handle_v1::State>()
|
||||||
/ std::mem::size_of::<u8>();
|
/ std::mem::size_of::<u8>();
|
||||||
let ptr = states.as_mut_ptr() as *mut u8;
|
let ptr = states.as_mut_ptr() as *mut u8;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue