protocol/workspace: Store ext/cosmic specific capabilities

This means a change to an ext capability will not send a redundant
cosmic capability event, and vice versa.

This will be more important when cosmic-specific states are added. Since
those may change often.
This commit is contained in:
Ian Douglas Scott 2025-03-11 12:28:52 -07:00 committed by Victoria Brekenfeld
parent dea7f2f825
commit f9dd922af3
2 changed files with 43 additions and 40 deletions

View file

@ -20,7 +20,7 @@ use super::{
#[derive(Default)] #[derive(Default)]
pub struct CosmicWorkspaceV2DataInner { pub struct CosmicWorkspaceV2DataInner {
capabilities: Option<WorkspaceCapabilities>, capabilities: Option<zcosmic_workspace_handle_v2::WorkspaceCapabilities>,
tiling: Option<zcosmic_workspace_handle_v2::TilingState>, tiling: Option<zcosmic_workspace_handle_v2::TilingState>,
} }
@ -190,22 +190,22 @@ pub fn send_workspace_to_client(
.lock() .lock()
.unwrap(); .unwrap();
if handle_state.capabilities != Some(workspace.capabilities) { let capabilities = workspace
let caps = workspace .capabilities
.capabilities .iter()
.iter() .filter_map(|cap| match cap {
.filter_map(|cap| match cap { WorkspaceCapabilities::Rename => {
WorkspaceCapabilities::Rename => { Some(zcosmic_workspace_handle_v2::WorkspaceCapabilities::Rename)
Some(zcosmic_workspace_handle_v2::WorkspaceCapabilities::Rename) }
} WorkspaceCapabilities::SetTilingState => {
WorkspaceCapabilities::SetTilingState => { Some(zcosmic_workspace_handle_v2::WorkspaceCapabilities::SetTilingState)
Some(zcosmic_workspace_handle_v2::WorkspaceCapabilities::SetTilingState) }
} _ => None,
_ => None, })
}) .collect::<zcosmic_workspace_handle_v2::WorkspaceCapabilities>();
.collect::<zcosmic_workspace_handle_v2::WorkspaceCapabilities>(); if handle_state.capabilities != Some(capabilities) {
instance.capabilities(caps); instance.capabilities(capabilities);
handle_state.capabilities = Some(workspace.capabilities); handle_state.capabilities = Some(capabilities);
changed = true; changed = true;
} }

View file

@ -23,7 +23,7 @@ use smithay::reexports::wayland_protocols::ext::workspace::v1::server::{
#[derive(Default)] #[derive(Default)]
pub struct WorkspaceDataInner { pub struct WorkspaceDataInner {
name: String, name: String,
capabilities: Option<WorkspaceCapabilities>, capabilities: Option<ext_workspace_handle_v1::WorkspaceCapabilities>,
coordinates: Vec<u32>, coordinates: Vec<u32>,
states: Option<ext_workspace_handle_v1::State>, states: Option<ext_workspace_handle_v1::State>,
pub(super) cosmic_v2_handle: Option<Weak<ZcosmicWorkspaceHandleV2>>, pub(super) cosmic_v2_handle: Option<Weak<ZcosmicWorkspaceHandleV2>>,
@ -416,6 +416,7 @@ where
handle_state.name = workspace.name.clone(); handle_state.name = workspace.name.clone();
changed = true; changed = true;
} }
if handle_state.coordinates != workspace.coordinates { if handle_state.coordinates != workspace.coordinates {
let coords = workspace let coords = workspace
.coordinates .coordinates
@ -426,30 +427,32 @@ where
handle_state.coordinates = workspace.coordinates.clone(); handle_state.coordinates = workspace.coordinates.clone();
changed = true; changed = true;
} }
if handle_state.capabilities != Some(workspace.capabilities) {
let caps = workspace let capabilities = workspace
.capabilities .capabilities
.iter() .iter()
.filter_map(|cap| match cap { .filter_map(|cap| match cap {
WorkspaceCapabilities::Activate => { WorkspaceCapabilities::Activate => {
Some(ext_workspace_handle_v1::WorkspaceCapabilities::Activate) Some(ext_workspace_handle_v1::WorkspaceCapabilities::Activate)
} }
WorkspaceCapabilities::Deactivate => { WorkspaceCapabilities::Deactivate => {
Some(ext_workspace_handle_v1::WorkspaceCapabilities::Deactivate) Some(ext_workspace_handle_v1::WorkspaceCapabilities::Deactivate)
} }
WorkspaceCapabilities::Remove => { WorkspaceCapabilities::Remove => {
Some(ext_workspace_handle_v1::WorkspaceCapabilities::Remove) Some(ext_workspace_handle_v1::WorkspaceCapabilities::Remove)
} }
WorkspaceCapabilities::Assign => { WorkspaceCapabilities::Assign => {
Some(ext_workspace_handle_v1::WorkspaceCapabilities::Assign) Some(ext_workspace_handle_v1::WorkspaceCapabilities::Assign)
} }
_ => None, _ => None,
}) })
.collect::<ext_workspace_handle_v1::WorkspaceCapabilities>(); .collect::<ext_workspace_handle_v1::WorkspaceCapabilities>();
instance.capabilities(caps); if handle_state.capabilities != Some(capabilities) {
handle_state.capabilities = Some(workspace.capabilities.clone()); instance.capabilities(capabilities);
handle_state.capabilities = Some(capabilities);
changed = true; changed = true;
} }
if handle_state.states != Some(workspace.states) { if handle_state.states != Some(workspace.states) {
instance.state(workspace.states); instance.state(workspace.states);
handle_state.states = Some(workspace.states.clone()); handle_state.states = Some(workspace.states.clone());