protocol/workspace: Split ext/cosmic-v1 workspace data into two types

This commit is contained in:
Ian Douglas Scott 2025-03-11 12:19:55 -07:00 committed by Victoria Brekenfeld
parent c72002e15a
commit dea7f2f825
4 changed files with 74 additions and 53 deletions

View file

@ -8,9 +8,11 @@ use smithay::{
},
};
use std::sync::Mutex;
use super::{
GroupCapabilities, Request, Workspace, WorkspaceCapabilities, WorkspaceClientHandler,
WorkspaceData, WorkspaceGlobalData, WorkspaceGroup, WorkspaceGroupData, WorkspaceGroupHandle,
WorkspaceGlobalData, WorkspaceGroup, WorkspaceGroupData, WorkspaceGroupHandle,
WorkspaceHandler, WorkspaceState,
};
@ -23,12 +25,23 @@ use cosmic_protocols::workspace::{
v2::server::zcosmic_workspace_handle_v2,
};
#[derive(Default)]
pub struct CosmicWorkspaceV1DataInner {
name: String,
capabilities: Option<WorkspaceCapabilities>,
coordinates: Vec<u32>,
states: Option<ext_workspace_handle_v1::State>,
tiling: Option<zcosmic_workspace_handle_v2::TilingState>,
}
pub type CosmicWorkspaceV1Data = Mutex<CosmicWorkspaceV1DataInner>;
impl<D> GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData, D> for WorkspaceState<D>
where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -60,7 +73,7 @@ where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -113,7 +126,7 @@ where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -169,12 +182,12 @@ where
}
}
impl<D> Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData, D> for WorkspaceState<D>
impl<D> Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data, D> for WorkspaceState<D>
where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -184,7 +197,7 @@ where
client: &Client,
obj: &ZcosmicWorkspaceHandleV1,
request: zcosmic_workspace_handle_v1::Request,
_data: &WorkspaceData,
_data: &CosmicWorkspaceV1Data,
_dh: &DisplayHandle,
_data_init: &mut DataInit<'_, D>,
) {
@ -278,7 +291,7 @@ where
state: &mut D,
_client: ClientId,
resource: &ZcosmicWorkspaceHandleV1,
_data: &WorkspaceData,
_data: &CosmicWorkspaceV1Data,
) {
for group in &mut state.workspace_state_mut().groups {
for workspace in &mut group.workspaces {
@ -297,7 +310,7 @@ where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -391,7 +404,7 @@ where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -403,7 +416,7 @@ where
if let Ok(handle) = client.create_resource::<ZcosmicWorkspaceHandleV1, _, D>(
dh,
group.version(),
WorkspaceData::default(),
CosmicWorkspaceV1Data::default(),
) {
group.workspace(&handle);
workspace.instances.push((mngr.downgrade(), handle));
@ -417,7 +430,11 @@ where
}
};
let mut handle_state = instance.data::<WorkspaceData>().unwrap().lock().unwrap();
let mut handle_state = instance
.data::<CosmicWorkspaceV1Data>()
.unwrap()
.lock()
.unwrap();
let mut changed = false;
if handle_state.name != workspace.name {

View file

@ -19,21 +19,21 @@ use super::{
};
#[derive(Default)]
pub struct CosmicWorkspaceDataInner {
pub struct CosmicWorkspaceV2DataInner {
capabilities: Option<WorkspaceCapabilities>,
tiling: Option<zcosmic_workspace_handle_v2::TilingState>,
}
pub struct CosmicWorkspaceData {
pub struct CosmicWorkspaceV2Data {
workspace: Weak<ExtWorkspaceHandleV1>,
inner: Mutex<CosmicWorkspaceDataInner>,
inner: Mutex<CosmicWorkspaceV2DataInner>,
}
impl<D> GlobalDispatch<ZcosmicWorkspaceManagerV2, WorkspaceGlobalData, D> for WorkspaceState<D>
where
D: GlobalDispatch<ZcosmicWorkspaceManagerV2, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV2, ()>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceV2Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -58,7 +58,7 @@ impl<D> Dispatch<ZcosmicWorkspaceManagerV2, (), D> for WorkspaceState<D>
where
D: GlobalDispatch<ZcosmicWorkspaceManagerV2, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV2, ()>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceV2Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -79,9 +79,9 @@ where
} => {
let cosmic_workspace = data_init.init(
cosmic_workspace,
CosmicWorkspaceData {
CosmicWorkspaceV2Data {
workspace: workspace.downgrade(),
inner: Mutex::new(CosmicWorkspaceDataInner::default()),
inner: Mutex::new(CosmicWorkspaceV2DataInner::default()),
},
);
if let Some(data) = workspace.data::<WorkspaceData>() {
@ -115,11 +115,11 @@ where
}
}
impl<D> Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceData, D> for WorkspaceState<D>
impl<D> Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceV2Data, D> for WorkspaceState<D>
where
D: GlobalDispatch<ZcosmicWorkspaceManagerV2, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV2, ()>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceV2Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -129,7 +129,7 @@ where
client: &Client,
_obj: &ZcosmicWorkspaceHandleV2,
request: zcosmic_workspace_handle_v2::Request,
data: &CosmicWorkspaceData,
data: &CosmicWorkspaceV2Data,
_dh: &DisplayHandle,
_data_init: &mut DataInit<'_, D>,
) {
@ -184,7 +184,7 @@ pub fn send_workspace_to_client(
let mut changed = false;
let mut handle_state = instance
.data::<CosmicWorkspaceData>()
.data::<CosmicWorkspaceV2Data>()
.unwrap()
.inner
.lock()

View file

@ -1,14 +1,17 @@
// SPDX-License-Identifier: GPL-3.0-only
use cosmic_protocols::workspace::v2::server::zcosmic_workspace_handle_v2::ZcosmicWorkspaceHandleV2;
use smithay::reexports::wayland_server::{
backend::{ClientData, ClientId},
Client, DataInit, Dispatch, DisplayHandle, GlobalDispatch, New, Resource,
Client, DataInit, Dispatch, DisplayHandle, GlobalDispatch, New, Resource, Weak,
};
use std::sync::Mutex;
use super::{
Request, Workspace, WorkspaceCapabilities, WorkspaceClientHandler, WorkspaceData,
WorkspaceGlobalData, WorkspaceGroup, WorkspaceGroupData, WorkspaceGroupHandle,
WorkspaceHandler, WorkspaceState,
Request, Workspace, WorkspaceCapabilities, WorkspaceClientHandler, WorkspaceGlobalData,
WorkspaceGroup, WorkspaceGroupData, WorkspaceGroupHandle, WorkspaceHandler, WorkspaceState,
};
use smithay::reexports::wayland_protocols::ext::workspace::v1::server::{
@ -17,6 +20,17 @@ use smithay::reexports::wayland_protocols::ext::workspace::v1::server::{
ext_workspace_manager_v1::{self, ExtWorkspaceManagerV1},
};
#[derive(Default)]
pub struct WorkspaceDataInner {
name: String,
capabilities: Option<WorkspaceCapabilities>,
coordinates: Vec<u32>,
states: Option<ext_workspace_handle_v1::State>,
pub(super) cosmic_v2_handle: Option<Weak<ZcosmicWorkspaceHandleV2>>,
}
pub type WorkspaceData = Mutex<WorkspaceDataInner>;
impl<D> GlobalDispatch<ExtWorkspaceManagerV1, WorkspaceGlobalData, D> for WorkspaceState<D>
where
D: GlobalDispatch<ExtWorkspaceManagerV1, WorkspaceGlobalData>

View file

@ -32,9 +32,11 @@ use cosmic_protocols::workspace::{
};
mod cosmic;
pub use cosmic::CosmicWorkspaceV1Data;
mod cosmic_v2;
pub use cosmic_v2::CosmicWorkspaceData;
pub use cosmic_v2::CosmicWorkspaceV2Data;
mod ext;
pub use ext::WorkspaceData;
pub use smithay::reexports::wayland_protocols::ext::workspace::v1::server::ext_workspace_group_handle_v1::GroupCapabilities;
@ -59,14 +61,14 @@ where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ GlobalDispatch<ExtWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ExtWorkspaceManagerV1, ()>
+ Dispatch<ExtWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ExtWorkspaceHandleV1, WorkspaceData>
+ GlobalDispatch<ZcosmicWorkspaceManagerV2, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV2, ()>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceV2Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -85,7 +87,7 @@ where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static;
@ -155,31 +157,19 @@ pub struct WorkspaceHandle {
id: usize,
}
#[derive(Default)]
pub struct WorkspaceDataInner {
name: String,
capabilities: Option<WorkspaceCapabilities>,
coordinates: Vec<u32>,
states: Option<ext_workspace_handle_v1::State>,
tiling: Option<zcosmic_workspace_handle_v2::TilingState>,
cosmic_v2_handle: Option<Weak<ZcosmicWorkspaceHandleV2>>,
}
pub type WorkspaceData = Mutex<WorkspaceDataInner>;
pub trait WorkspaceHandler
where
Self: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ GlobalDispatch<ExtWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ExtWorkspaceManagerV1, ()>
+ Dispatch<ExtWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ExtWorkspaceHandleV1, WorkspaceData>
+ GlobalDispatch<ZcosmicWorkspaceManagerV2, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV2, ()>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceV2Data>
+ Sized
+ 'static,
{
@ -232,14 +222,14 @@ where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ GlobalDispatch<ExtWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ExtWorkspaceManagerV1, ()>
+ Dispatch<ExtWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ExtWorkspaceHandleV1, WorkspaceData>
+ GlobalDispatch<ZcosmicWorkspaceManagerV2, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV2, ()>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceV2Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -501,13 +491,13 @@ where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ Dispatch<ExtWorkspaceManagerV1, ()>
+ Dispatch<ExtWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ExtWorkspaceHandleV1, WorkspaceData>
+ GlobalDispatch<ZcosmicWorkspaceManagerV2, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV2, ()>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceV2Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -763,14 +753,14 @@ where
D: GlobalDispatch<ZcosmicWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV1, ()>
+ Dispatch<ZcosmicWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ZcosmicWorkspaceHandleV1, WorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV1, CosmicWorkspaceV1Data>
+ GlobalDispatch<ExtWorkspaceManagerV1, WorkspaceGlobalData>
+ Dispatch<ExtWorkspaceManagerV1, ()>
+ Dispatch<ExtWorkspaceGroupHandleV1, WorkspaceGroupData>
+ Dispatch<ExtWorkspaceHandleV1, WorkspaceData>
+ GlobalDispatch<ZcosmicWorkspaceManagerV2, WorkspaceGlobalData>
+ Dispatch<ZcosmicWorkspaceManagerV2, ()>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceData>
+ Dispatch<ZcosmicWorkspaceHandleV2, CosmicWorkspaceV2Data>
+ WorkspaceHandler
+ 'static,
<D as WorkspaceHandler>::Client: ClientData + WorkspaceClientHandler + 'static,
@ -792,7 +782,7 @@ macro_rules! delegate_workspace {
cosmic_protocols::workspace::v1::server::zcosmic_workspace_group_handle_v1::ZcosmicWorkspaceGroupHandleV1: $crate::wayland::protocols::workspace::WorkspaceGroupData
] => $crate::wayland::protocols::workspace::WorkspaceState<Self>);
smithay::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
cosmic_protocols::workspace::v1::server::zcosmic_workspace_handle_v1::ZcosmicWorkspaceHandleV1: $crate::wayland::protocols::workspace::WorkspaceData
cosmic_protocols::workspace::v1::server::zcosmic_workspace_handle_v1::ZcosmicWorkspaceHandleV1: $crate::wayland::protocols::workspace::CosmicWorkspaceV1Data
] => $crate::wayland::protocols::workspace::WorkspaceState<Self>);
smithay::reexports::wayland_server::delegate_global_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
@ -815,7 +805,7 @@ macro_rules! delegate_workspace {
cosmic_protocols::workspace::v2::server::zcosmic_workspace_manager_v2::ZcosmicWorkspaceManagerV2: ()
] => $crate::wayland::protocols::workspace::WorkspaceState<Self>);
smithay::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
cosmic_protocols::workspace::v2::server::zcosmic_workspace_handle_v2::ZcosmicWorkspaceHandleV2: $crate::wayland::protocols::workspace::CosmicWorkspaceData
cosmic_protocols::workspace::v2::server::zcosmic_workspace_handle_v2::ZcosmicWorkspaceHandleV2: $crate::wayland::protocols::workspace::CosmicWorkspaceV2Data
] => $crate::wayland::protocols::workspace::WorkspaceState<Self>);
};
}