protocol/workspace: Fix initial sending of states and capabilities

The protocol states that these should always be sent, but this was
not initially sending bitflags if they were empty. That works, but isn't
what the protocol states.

Not wrapping the bitflag fields in options works well for `Workspace`,
but not for `WorkspaceDataInner`.
This commit is contained in:
Ian Douglas Scott 2025-02-21 13:12:10 -08:00 committed by Victoria Brekenfeld
parent b93db878e2
commit 1f2434e590
3 changed files with 17 additions and 38 deletions

View file

@ -338,7 +338,7 @@ where
handle_state.outputs = group.outputs.clone(); handle_state.outputs = group.outputs.clone();
} }
if handle_state.capabilities != group.capabilities { if handle_state.capabilities != Some(group.capabilities) {
let caps = group let caps = group
.capabilities .capabilities
.iter() .iter()
@ -349,7 +349,7 @@ where
.flat_map(|cap| (cap as u32).to_ne_bytes()) .flat_map(|cap| (cap as u32).to_ne_bytes())
.collect::<Vec<u8>>(); .collect::<Vec<u8>>();
instance.capabilities(caps); instance.capabilities(caps);
handle_state.capabilities = group.capabilities.clone(); handle_state.capabilities = Some(group.capabilities.clone());
changed = true; changed = true;
} }
@ -421,7 +421,7 @@ where
handle_state.coordinates = workspace.coordinates.clone(); handle_state.coordinates = workspace.coordinates.clone();
changed = true; changed = true;
} }
if handle_state.capabilities != workspace.capabilities { if handle_state.capabilities != Some(workspace.capabilities) {
let caps = workspace let caps = workspace
.capabilities .capabilities
.iter() .iter()
@ -446,10 +446,10 @@ where
.flat_map(|cap| (cap as u32).to_ne_bytes()) .flat_map(|cap| (cap as u32).to_ne_bytes())
.collect::<Vec<u8>>(); .collect::<Vec<u8>>();
instance.capabilities(caps); instance.capabilities(caps);
handle_state.capabilities = workspace.capabilities.clone(); handle_state.capabilities = Some(workspace.capabilities.clone());
changed = true; changed = true;
} }
if handle_state.states != workspace.states { if handle_state.states != Some(workspace.states) {
let states = workspace let states = workspace
.states .states
.iter() .iter()
@ -468,7 +468,7 @@ where
.flat_map(|state| (state as u32).to_ne_bytes()) .flat_map(|state| (state as u32).to_ne_bytes())
.collect::<Vec<u8>>(); .collect::<Vec<u8>>();
instance.state(states); instance.state(states);
handle_state.states = workspace.states.clone(); handle_state.states = Some(workspace.states.clone());
changed = true; changed = true;
} }
if instance.version() >= zcosmic_workspace_handle_v1::EVT_TILING_STATE_SINCE { if instance.version() >= zcosmic_workspace_handle_v1::EVT_TILING_STATE_SINCE {

View file

@ -333,9 +333,9 @@ where
handle_state.outputs = group.outputs.clone(); handle_state.outputs = group.outputs.clone();
} }
if handle_state.capabilities != group.capabilities { if handle_state.capabilities != Some(group.capabilities) {
instance.capabilities(group.capabilities); instance.capabilities(group.capabilities);
handle_state.capabilities = group.capabilities.clone(); handle_state.capabilities = Some(group.capabilities.clone());
changed = true; changed = true;
} }
@ -411,7 +411,7 @@ where
handle_state.coordinates = workspace.coordinates.clone(); handle_state.coordinates = workspace.coordinates.clone();
changed = true; changed = true;
} }
if handle_state.capabilities != workspace.capabilities { if handle_state.capabilities != Some(workspace.capabilities) {
let caps = workspace let caps = workspace
.capabilities .capabilities
.iter() .iter()
@ -432,12 +432,12 @@ where
}) })
.collect::<ext_workspace_handle_v1::WorkspaceCapabilities>(); .collect::<ext_workspace_handle_v1::WorkspaceCapabilities>();
instance.capabilities(caps); instance.capabilities(caps);
handle_state.capabilities = workspace.capabilities.clone(); handle_state.capabilities = Some(workspace.capabilities.clone());
changed = true; changed = true;
} }
if handle_state.states != workspace.states { if handle_state.states != Some(workspace.states) {
instance.state(workspace.states); instance.state(workspace.states);
handle_state.states = workspace.states.clone(); handle_state.states = Some(workspace.states.clone());
changed = true; changed = true;
} }
// TODO ext_workspace_handle_v1::id // TODO ext_workspace_handle_v1::id

View file

@ -114,24 +114,14 @@ pub struct WorkspaceGroupHandle {
id: usize, id: usize,
} }
#[derive(Default)]
pub struct WorkspaceGroupDataInner { pub struct WorkspaceGroupDataInner {
outputs: Vec<Output>, outputs: Vec<Output>,
wl_outputs: HashSet<WlOutput>, wl_outputs: HashSet<WlOutput>,
capabilities: GroupCapabilities, capabilities: Option<GroupCapabilities>,
workspace_count: usize, workspace_count: usize,
} }
impl Default for WorkspaceGroupDataInner {
fn default() -> Self {
Self {
outputs: Vec::new(),
wl_outputs: HashSet::new(),
capabilities: GroupCapabilities::empty(),
workspace_count: 0,
}
}
}
pub type WorkspaceGroupData = Mutex<WorkspaceGroupDataInner>; pub type WorkspaceGroupData = Mutex<WorkspaceGroupDataInner>;
#[derive(Debug)] #[derive(Debug)]
@ -153,26 +143,15 @@ pub struct WorkspaceHandle {
id: usize, id: usize,
} }
#[derive(Default)]
pub struct WorkspaceDataInner { pub struct WorkspaceDataInner {
name: String, name: String,
capabilities: WorkspaceCapabilities, capabilities: Option<WorkspaceCapabilities>,
coordinates: Vec<u32>, coordinates: Vec<u32>,
states: ext_workspace_handle_v1::State, states: Option<ext_workspace_handle_v1::State>,
tiling: Option<zcosmic_workspace_handle_v1::TilingState>, tiling: Option<zcosmic_workspace_handle_v1::TilingState>,
} }
impl Default for WorkspaceDataInner {
fn default() -> Self {
Self {
name: String::new(),
capabilities: WorkspaceCapabilities::empty(),
coordinates: Vec::new(),
states: ext_workspace_handle_v1::State::empty(),
tiling: None,
}
}
}
pub type WorkspaceData = Mutex<WorkspaceDataInner>; pub type WorkspaceData = Mutex<WorkspaceDataInner>;
pub trait WorkspaceHandler pub trait WorkspaceHandler