From 1f2434e590b89bc0bca88231be6ab23723f43989 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Fri, 21 Feb 2025 13:12:10 -0800 Subject: [PATCH] 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`. --- src/wayland/protocols/workspace/cosmic.rs | 12 ++++----- src/wayland/protocols/workspace/ext.rs | 12 ++++----- src/wayland/protocols/workspace/mod.rs | 31 ++++------------------- 3 files changed, 17 insertions(+), 38 deletions(-) diff --git a/src/wayland/protocols/workspace/cosmic.rs b/src/wayland/protocols/workspace/cosmic.rs index aaebc0af..58638654 100644 --- a/src/wayland/protocols/workspace/cosmic.rs +++ b/src/wayland/protocols/workspace/cosmic.rs @@ -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::>(); 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::>(); 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::>(); 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 { diff --git a/src/wayland/protocols/workspace/ext.rs b/src/wayland/protocols/workspace/ext.rs index d7746e0f..610f9ef7 100644 --- a/src/wayland/protocols/workspace/ext.rs +++ b/src/wayland/protocols/workspace/ext.rs @@ -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::(); 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 diff --git a/src/wayland/protocols/workspace/mod.rs b/src/wayland/protocols/workspace/mod.rs index 79074e42..1137f89e 100644 --- a/src/wayland/protocols/workspace/mod.rs +++ b/src/wayland/protocols/workspace/mod.rs @@ -114,24 +114,14 @@ pub struct WorkspaceGroupHandle { id: usize, } +#[derive(Default)] pub struct WorkspaceGroupDataInner { outputs: Vec, wl_outputs: HashSet, - capabilities: GroupCapabilities, + capabilities: Option, 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; #[derive(Debug)] @@ -153,26 +143,15 @@ pub struct WorkspaceHandle { id: usize, } +#[derive(Default)] pub struct WorkspaceDataInner { name: String, - capabilities: WorkspaceCapabilities, + capabilities: Option, coordinates: Vec, - states: ext_workspace_handle_v1::State, + states: Option, tiling: Option, } -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; pub trait WorkspaceHandler