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

View file

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

View file

@ -114,24 +114,14 @@ pub struct WorkspaceGroupHandle {
id: usize,
}
#[derive(Default)]
pub struct WorkspaceGroupDataInner {
outputs: Vec<Output>,
wl_outputs: HashSet<WlOutput>,
capabilities: GroupCapabilities,
capabilities: Option<GroupCapabilities>,
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>;
#[derive(Debug)]
@ -153,26 +143,15 @@ pub struct WorkspaceHandle {
id: usize,
}
#[derive(Default)]
pub struct WorkspaceDataInner {
name: String,
capabilities: WorkspaceCapabilities,
capabilities: Option<WorkspaceCapabilities>,
coordinates: Vec<u32>,
states: ext_workspace_handle_v1::State,
states: Option<ext_workspace_handle_v1::State>,
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 trait WorkspaceHandler