diff --git a/src/state.rs b/src/state.rs index c2e12306..4ad82dd2 100644 --- a/src/state.rs +++ b/src/state.rs @@ -24,7 +24,7 @@ use crate::{ screencopy::ScreencopyState, toplevel_info::ToplevelInfoState, toplevel_management::{ManagementCapabilities, ToplevelManagementState}, - workspace::{WorkspaceClientState, WorkspaceState, WorkspaceUpdateGuard}, + workspace::{WorkspaceState, WorkspaceUpdateGuard}, }, }, xwayland::XWaylandState, @@ -141,7 +141,6 @@ macro_rules! fl { pub struct ClientState { pub compositor_client_state: CompositorClientState, - pub workspace_client_state: WorkspaceClientState, pub advertised_drm_node: Option, pub privileged: bool, pub evls: LoopSignal, @@ -679,7 +678,6 @@ impl State { pub fn new_client_state(&self) -> ClientState { ClientState { compositor_client_state: CompositorClientState::default(), - workspace_client_state: WorkspaceClientState::default(), advertised_drm_node: match &self.backend { BackendData::Kms(kms_state) => kms_state.primary_node, _ => None, diff --git a/src/wayland/handlers/workspace.rs b/src/wayland/handlers/workspace.rs index 4231571d..a839970f 100644 --- a/src/wayland/handlers/workspace.rs +++ b/src/wayland/handlers/workspace.rs @@ -2,24 +2,15 @@ use crate::{ shell::WorkspaceDelta, - state::ClientState, utils::prelude::*, wayland::protocols::workspace::{ - delegate_workspace, Request, WorkspaceClientHandler, WorkspaceClientState, - WorkspaceHandler, WorkspaceState, + delegate_workspace, Request, WorkspaceHandler, WorkspaceState, }, }; use cosmic_protocols::workspace::v2::server::zcosmic_workspace_handle_v2::TilingState; use smithay::reexports::wayland_server::DisplayHandle; -impl WorkspaceClientHandler for ClientState { - fn workspace_state(&self) -> &WorkspaceClientState { - &self.workspace_client_state - } -} - impl WorkspaceHandler for State { - type Client = ClientState; fn workspace_state(&self) -> &WorkspaceState { &self.common.workspace_state } diff --git a/src/wayland/protocols/workspace/cosmic_v2.rs b/src/wayland/protocols/workspace/cosmic_v2.rs index 6b4c3060..fa6b4396 100644 --- a/src/wayland/protocols/workspace/cosmic_v2.rs +++ b/src/wayland/protocols/workspace/cosmic_v2.rs @@ -13,8 +13,8 @@ use smithay::reexports::{ use std::sync::Mutex; use super::{ - Request, Workspace, WorkspaceCapabilities, WorkspaceClientHandler, WorkspaceData, - WorkspaceGlobalData, WorkspaceHandler, WorkspaceState, + Request, Workspace, WorkspaceCapabilities, WorkspaceData, WorkspaceGlobalData, + WorkspaceHandler, WorkspaceManagerData, WorkspaceState, }; #[derive(Default)] @@ -113,7 +113,7 @@ where { fn request( state: &mut D, - client: &Client, + _client: &Client, _obj: &ZcosmicWorkspaceHandleV2, request: zcosmic_workspace_handle_v2::Request, data: &CosmicWorkspaceV2Data, @@ -128,16 +128,19 @@ where if let Some(workspace_handle) = state.workspace_state().get_ext_workspace_handle(&workspace) { - let mut state = client - .get_data::<::Client>() - .unwrap() - .workspace_state() - .lock() - .unwrap(); - state.requests.push(Request::Rename { - workspace: workspace_handle, - name, - }); + if let Ok(manager) = + workspace.data::().unwrap().manager.upgrade() + { + let mut state = manager + .data::() + .unwrap() + .lock() + .unwrap(); + state.requests.push(Request::Rename { + workspace: workspace_handle, + name, + }); + } } } zcosmic_workspace_handle_v2::Request::SetTilingState { @@ -146,16 +149,19 @@ where if let Some(workspace_handle) = state.workspace_state().get_ext_workspace_handle(&workspace) { - let mut state = client - .get_data::<::Client>() - .unwrap() - .workspace_state() - .lock() - .unwrap(); - state.requests.push(Request::SetTilingState { - workspace: workspace_handle, - state: tiling_state, - }); + if let Ok(manager) = + workspace.data::().unwrap().manager.upgrade() + { + let mut state = manager + .data::() + .unwrap() + .lock() + .unwrap(); + state.requests.push(Request::SetTilingState { + workspace: workspace_handle, + state: tiling_state, + }); + } } } zcosmic_workspace_handle_v2::Request::Destroy => {} diff --git a/src/wayland/protocols/workspace/ext.rs b/src/wayland/protocols/workspace/ext.rs index 50a6871d..bc33560b 100644 --- a/src/wayland/protocols/workspace/ext.rs +++ b/src/wayland/protocols/workspace/ext.rs @@ -20,10 +20,17 @@ use smithay::{ use std::{collections::HashSet, sync::Mutex}; use super::{ - Request, Workspace, WorkspaceCapabilities, WorkspaceClientHandler, WorkspaceGlobalData, - WorkspaceGroup, WorkspaceGroupHandle, WorkspaceHandler, WorkspaceState, + Request, Workspace, WorkspaceCapabilities, WorkspaceGlobalData, WorkspaceGroup, + WorkspaceGroupHandle, WorkspaceHandler, WorkspaceState, }; +#[derive(Debug, Default)] +pub struct WorkspaceManagerDataInner { + pub(super) requests: Vec, +} + +pub type WorkspaceManagerData = Mutex; + #[derive(Default)] pub struct WorkspaceGroupDataInner { outputs: Vec, @@ -64,7 +71,7 @@ where data_init: &mut DataInit<'_, D>, ) { let state = state.workspace_state_mut(); - let instance = data_init.init(resource, ()); + let instance = data_init.init(resource, WorkspaceManagerData::default()); for group in &mut state.groups { send_group_to_client::(dh, &instance, group); } @@ -77,29 +84,24 @@ where } } -impl Dispatch for WorkspaceState +impl Dispatch for WorkspaceState where D: WorkspaceHandler, { fn request( state: &mut D, - client: &Client, + _client: &Client, obj: &ExtWorkspaceManagerV1, request: ext_workspace_manager_v1::Request, - _data: &(), + data: &WorkspaceManagerData, dh: &DisplayHandle, _data_init: &mut DataInit<'_, D>, ) { match request { ext_workspace_manager_v1::Request::Commit => { if state.workspace_state().ext_instances.contains(obj) { - let mut client_state = client - .get_data::<::Client>() - .unwrap() - .workspace_state() - .lock() - .unwrap(); - state.commit_requests(dh, std::mem::take(&mut client_state.requests)); + let mut data = data.lock().unwrap(); + state.commit_requests(dh, std::mem::take(&mut data.requests)); } } ext_workspace_manager_v1::Request::Stop => { @@ -114,7 +116,12 @@ where } } - fn destroyed(state: &mut D, _client: ClientId, resource: &ExtWorkspaceManagerV1, _data: &()) { + fn destroyed( + state: &mut D, + _client: ClientId, + resource: &ExtWorkspaceManagerV1, + _data: &WorkspaceManagerData, + ) { state .workspace_state_mut() .ext_instances @@ -128,10 +135,10 @@ where { fn request( state: &mut D, - client: &Client, + _client: &Client, obj: &ExtWorkspaceGroupHandleV1, request: ext_workspace_group_handle_v1::Request, - _data: &WorkspaceGroupData, + data: &WorkspaceGroupData, _dh: &DisplayHandle, _data_init: &mut DataInit<'_, D>, ) { @@ -144,16 +151,17 @@ where .find(|g| g.ext_instances.contains(obj)) .map(|g| g.id) { - let mut state = client - .get_data::<::Client>() - .unwrap() - .workspace_state() - .lock() - .unwrap(); - state.requests.push(Request::Create { - in_group: WorkspaceGroupHandle { id }, - name: workspace, - }); + if let Ok(manager) = data.manager.upgrade() { + let mut state = manager + .data::() + .unwrap() + .lock() + .unwrap(); + state.requests.push(Request::Create { + in_group: WorkspaceGroupHandle { id }, + name: workspace, + }); + } } } ext_workspace_group_handle_v1::Request::Destroy => { @@ -183,10 +191,10 @@ where { fn request( state: &mut D, - client: &Client, + _client: &Client, obj: &ExtWorkspaceHandleV1, request: ext_workspace_handle_v1::Request, - _data: &WorkspaceData, + data: &WorkspaceData, _dh: &DisplayHandle, _data_init: &mut DataInit<'_, D>, ) { @@ -195,39 +203,42 @@ where if let Some(workspace_handle) = state.workspace_state().get_ext_workspace_handle(obj) { - let mut state = client - .get_data::<::Client>() - .unwrap() - .workspace_state() - .lock() - .unwrap(); - state.requests.push(Request::Activate(workspace_handle)); + if let Ok(manager) = data.manager.upgrade() { + let mut state = manager + .data::() + .unwrap() + .lock() + .unwrap(); + state.requests.push(Request::Activate(workspace_handle)); + } } } ext_workspace_handle_v1::Request::Deactivate => { if let Some(workspace_handle) = state.workspace_state().get_ext_workspace_handle(obj) { - let mut state = client - .get_data::<::Client>() - .unwrap() - .workspace_state() - .lock() - .unwrap(); - state.requests.push(Request::Deactivate(workspace_handle)); + if let Ok(manager) = data.manager.upgrade() { + let mut state = manager + .data::() + .unwrap() + .lock() + .unwrap(); + state.requests.push(Request::Deactivate(workspace_handle)); + } } } ext_workspace_handle_v1::Request::Remove => { if let Some(workspace_handle) = state.workspace_state().get_ext_workspace_handle(obj) { - let mut state = client - .get_data::<::Client>() - .unwrap() - .workspace_state() - .lock() - .unwrap(); - state.requests.push(Request::Remove(workspace_handle)); + if let Ok(manager) = data.manager.upgrade() { + let mut state = manager + .data::() + .unwrap() + .lock() + .unwrap(); + state.requests.push(Request::Remove(workspace_handle)); + } } } ext_workspace_handle_v1::Request::Assign { workspace_group } => { @@ -241,16 +252,17 @@ where .find(|g| g.ext_instances.contains(&workspace_group)) .map(|g| g.id) { - let mut state = client - .get_data::<::Client>() - .unwrap() - .workspace_state() - .lock() - .unwrap(); - state.requests.push(Request::Assign { - workspace: workspace_handle, - group: WorkspaceGroupHandle { id: group_id }, - }); + if let Ok(manager) = data.manager.upgrade() { + let mut state = manager + .data::() + .unwrap() + .lock() + .unwrap(); + state.requests.push(Request::Assign { + workspace: workspace_handle, + group: WorkspaceGroupHandle { id: group_id }, + }); + } } } } diff --git a/src/wayland/protocols/workspace/mod.rs b/src/wayland/protocols/workspace/mod.rs index 752541b5..18170d37 100644 --- a/src/wayland/protocols/workspace/mod.rs +++ b/src/wayland/protocols/workspace/mod.rs @@ -1,7 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-only -use std::sync::Mutex; - use smithay::{ output::Output, reexports::{ @@ -11,7 +9,7 @@ use smithay::{ ext_workspace_manager_v1::ExtWorkspaceManagerV1, }, wayland_server::{ - backend::{ClientData, GlobalId, ObjectId}, + backend::{GlobalId, ObjectId}, Client, Dispatch, DisplayHandle, GlobalDispatch, Resource, }, }, @@ -26,7 +24,7 @@ use cosmic_protocols::workspace::v2::server::{ mod cosmic_v2; pub use cosmic_v2::CosmicWorkspaceV2Data; mod ext; -pub use ext::{WorkspaceData, WorkspaceGroupData}; +pub use ext::{WorkspaceData, WorkspaceGroupData, WorkspaceManagerData}; bitflags::bitflags! { #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] @@ -111,7 +109,7 @@ pub struct WorkspaceHandle { pub trait WorkspaceHandler where Self: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + GlobalDispatch @@ -120,8 +118,6 @@ where + Sized + 'static, { - type Client: ClientData + WorkspaceClientHandler + 'static; - fn workspace_state(&self) -> &WorkspaceState; fn workspace_state_mut(&mut self) -> &mut WorkspaceState; fn commit_requests(&mut self, dh: &DisplayHandle, requests: Vec); @@ -154,16 +150,6 @@ pub enum Request { }, } -#[derive(Debug, Default)] -pub struct WorkspaceClientStateInner { - requests: Vec, -} -pub type WorkspaceClientState = Mutex; - -pub trait WorkspaceClientHandler { - fn workspace_state(&self) -> &WorkspaceClientState; -} - impl WorkspaceState where D: WorkspaceHandler, @@ -580,7 +566,7 @@ macro_rules! delegate_workspace { smithay::reexports::wayland_protocols::ext::workspace::v1::server::ext_workspace_manager_v1::ExtWorkspaceManagerV1: $crate::wayland::protocols::workspace::WorkspaceGlobalData ] => $crate::wayland::protocols::workspace::WorkspaceState); smithay::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [ - smithay::reexports::wayland_protocols::ext::workspace::v1::server::ext_workspace_manager_v1::ExtWorkspaceManagerV1: () + smithay::reexports::wayland_protocols::ext::workspace::v1::server::ext_workspace_manager_v1::ExtWorkspaceManagerV1: $crate::wayland::protocols::workspace::WorkspaceManagerData ] => $crate::wayland::protocols::workspace::WorkspaceState); smithay::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [ smithay::reexports::wayland_protocols::ext::workspace::v1::server::ext_workspace_group_handle_v1::ExtWorkspaceGroupHandleV1: $crate::wayland::protocols::workspace::WorkspaceGroupData