From f9dd922af3f39483d36ed327eb76b84c59eda369 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 11 Mar 2025 12:28:52 -0700 Subject: [PATCH] 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. --- src/wayland/protocols/workspace/cosmic_v2.rs | 34 +++++++------- src/wayland/protocols/workspace/ext.rs | 49 +++++++++++--------- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/wayland/protocols/workspace/cosmic_v2.rs b/src/wayland/protocols/workspace/cosmic_v2.rs index 64e823d0..a42f45c5 100644 --- a/src/wayland/protocols/workspace/cosmic_v2.rs +++ b/src/wayland/protocols/workspace/cosmic_v2.rs @@ -20,7 +20,7 @@ use super::{ #[derive(Default)] pub struct CosmicWorkspaceV2DataInner { - capabilities: Option, + capabilities: Option, tiling: Option, } @@ -190,22 +190,22 @@ pub fn send_workspace_to_client( .lock() .unwrap(); - if handle_state.capabilities != Some(workspace.capabilities) { - let caps = workspace - .capabilities - .iter() - .filter_map(|cap| match cap { - WorkspaceCapabilities::Rename => { - Some(zcosmic_workspace_handle_v2::WorkspaceCapabilities::Rename) - } - WorkspaceCapabilities::SetTilingState => { - Some(zcosmic_workspace_handle_v2::WorkspaceCapabilities::SetTilingState) - } - _ => None, - }) - .collect::(); - instance.capabilities(caps); - handle_state.capabilities = Some(workspace.capabilities); + let capabilities = workspace + .capabilities + .iter() + .filter_map(|cap| match cap { + WorkspaceCapabilities::Rename => { + Some(zcosmic_workspace_handle_v2::WorkspaceCapabilities::Rename) + } + WorkspaceCapabilities::SetTilingState => { + Some(zcosmic_workspace_handle_v2::WorkspaceCapabilities::SetTilingState) + } + _ => None, + }) + .collect::(); + if handle_state.capabilities != Some(capabilities) { + instance.capabilities(capabilities); + handle_state.capabilities = Some(capabilities); changed = true; } diff --git a/src/wayland/protocols/workspace/ext.rs b/src/wayland/protocols/workspace/ext.rs index 8d7891ae..d813a399 100644 --- a/src/wayland/protocols/workspace/ext.rs +++ b/src/wayland/protocols/workspace/ext.rs @@ -23,7 +23,7 @@ use smithay::reexports::wayland_protocols::ext::workspace::v1::server::{ #[derive(Default)] pub struct WorkspaceDataInner { name: String, - capabilities: Option, + capabilities: Option, coordinates: Vec, states: Option, pub(super) cosmic_v2_handle: Option>, @@ -416,6 +416,7 @@ where handle_state.name = workspace.name.clone(); changed = true; } + if handle_state.coordinates != workspace.coordinates { let coords = workspace .coordinates @@ -426,30 +427,32 @@ where handle_state.coordinates = workspace.coordinates.clone(); changed = true; } - if handle_state.capabilities != Some(workspace.capabilities) { - let caps = workspace - .capabilities - .iter() - .filter_map(|cap| match cap { - WorkspaceCapabilities::Activate => { - Some(ext_workspace_handle_v1::WorkspaceCapabilities::Activate) - } - WorkspaceCapabilities::Deactivate => { - Some(ext_workspace_handle_v1::WorkspaceCapabilities::Deactivate) - } - WorkspaceCapabilities::Remove => { - Some(ext_workspace_handle_v1::WorkspaceCapabilities::Remove) - } - WorkspaceCapabilities::Assign => { - Some(ext_workspace_handle_v1::WorkspaceCapabilities::Assign) - } - _ => None, - }) - .collect::(); - instance.capabilities(caps); - handle_state.capabilities = Some(workspace.capabilities.clone()); + + let capabilities = workspace + .capabilities + .iter() + .filter_map(|cap| match cap { + WorkspaceCapabilities::Activate => { + Some(ext_workspace_handle_v1::WorkspaceCapabilities::Activate) + } + WorkspaceCapabilities::Deactivate => { + Some(ext_workspace_handle_v1::WorkspaceCapabilities::Deactivate) + } + WorkspaceCapabilities::Remove => { + Some(ext_workspace_handle_v1::WorkspaceCapabilities::Remove) + } + WorkspaceCapabilities::Assign => { + Some(ext_workspace_handle_v1::WorkspaceCapabilities::Assign) + } + _ => None, + }) + .collect::(); + if handle_state.capabilities != Some(capabilities) { + instance.capabilities(capabilities); + handle_state.capabilities = Some(capabilities); changed = true; } + if handle_state.states != Some(workspace.states) { instance.state(workspace.states); handle_state.states = Some(workspace.states.clone());