workspace-management: Implement move_to_workspace request
Needed for `cosmic-workspaces`.
This commit is contained in:
parent
75990ff056
commit
656996503c
6 changed files with 92 additions and 43 deletions
|
|
@ -12,8 +12,11 @@ use smithay::{
|
|||
};
|
||||
|
||||
pub use cosmic_protocols::toplevel_management::v1::server::zcosmic_toplevel_manager_v1::ZcosmicToplelevelManagementCapabilitiesV1 as ManagementCapabilities;
|
||||
use cosmic_protocols::toplevel_management::v1::server::zcosmic_toplevel_manager_v1::{
|
||||
self, ZcosmicToplevelManagerV1,
|
||||
use cosmic_protocols::{
|
||||
toplevel_management::v1::server::zcosmic_toplevel_manager_v1::{
|
||||
self, ZcosmicToplevelManagerV1,
|
||||
},
|
||||
workspace::v1::server::zcosmic_workspace_handle_v1::ZcosmicWorkspaceHandleV1,
|
||||
};
|
||||
|
||||
use super::toplevel_info::{window_from_handle, ToplevelInfoHandler, ToplevelState, Window};
|
||||
|
|
@ -58,6 +61,14 @@ where
|
|||
fn unmaximize(&mut self, dh: &DisplayHandle, window: &<Self as ToplevelInfoHandler>::Window) {}
|
||||
fn minimize(&mut self, dh: &DisplayHandle, window: &<Self as ToplevelInfoHandler>::Window) {}
|
||||
fn unminimize(&mut self, dh: &DisplayHandle, window: &<Self as ToplevelInfoHandler>::Window) {}
|
||||
fn move_to_workspace(
|
||||
&mut self,
|
||||
dh: &DisplayHandle,
|
||||
window: &<Self as ToplevelInfoHandler>::Window,
|
||||
workspace: ZcosmicWorkspaceHandleV1,
|
||||
output: Output,
|
||||
) {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ToplevelManagerGlobalData {
|
||||
|
|
@ -79,7 +90,7 @@ impl ToplevelManagementState {
|
|||
F: for<'a> Fn(&'a Client) -> bool + Send + Sync + 'static,
|
||||
{
|
||||
let global = dh.create_global::<D, ZcosmicToplevelManagerV1, _>(
|
||||
1,
|
||||
2,
|
||||
ToplevelManagerGlobalData {
|
||||
filter: Box::new(client_filter),
|
||||
},
|
||||
|
|
@ -221,6 +232,16 @@ where
|
|||
}
|
||||
}
|
||||
}
|
||||
zcosmic_toplevel_manager_v1::Request::MoveToWorkspace {
|
||||
toplevel,
|
||||
workspace,
|
||||
output,
|
||||
} => {
|
||||
let window = window_from_handle(toplevel).unwrap();
|
||||
if let Some(output) = Output::from_resource(&output) {
|
||||
state.move_to_workspace(dh, &window, workspace, output);
|
||||
}
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -307,58 +307,36 @@ where
|
|||
) {
|
||||
match request {
|
||||
zcosmic_workspace_handle_v1::Request::Activate => {
|
||||
if let Some(id) = state
|
||||
.workspace_state()
|
||||
.groups
|
||||
.iter()
|
||||
.find_map(|g| g.workspaces.iter().find(|w| w.instances.contains(obj)))
|
||||
.map(|w| w.id)
|
||||
{
|
||||
if let Some(workspace_handle) = state.workspace_state().get_workspace_handle(obj) {
|
||||
let mut state = client
|
||||
.get_data::<<D as WorkspaceHandler>::Client>()
|
||||
.unwrap()
|
||||
.workspace_state()
|
||||
.lock()
|
||||
.unwrap();
|
||||
state
|
||||
.requests
|
||||
.push(Request::Activate(WorkspaceHandle { id }));
|
||||
state.requests.push(Request::Activate(workspace_handle));
|
||||
}
|
||||
}
|
||||
zcosmic_workspace_handle_v1::Request::Deactivate => {
|
||||
if let Some(id) = state
|
||||
.workspace_state()
|
||||
.groups
|
||||
.iter()
|
||||
.find_map(|g| g.workspaces.iter().find(|w| w.instances.contains(obj)))
|
||||
.map(|w| w.id)
|
||||
{
|
||||
if let Some(workspace_handle) = state.workspace_state().get_workspace_handle(obj) {
|
||||
let mut state = client
|
||||
.get_data::<<D as WorkspaceHandler>::Client>()
|
||||
.unwrap()
|
||||
.workspace_state()
|
||||
.lock()
|
||||
.unwrap();
|
||||
state
|
||||
.requests
|
||||
.push(Request::Deactivate(WorkspaceHandle { id }));
|
||||
state.requests.push(Request::Deactivate(workspace_handle));
|
||||
}
|
||||
}
|
||||
zcosmic_workspace_handle_v1::Request::Remove => {
|
||||
if let Some(id) = state
|
||||
.workspace_state()
|
||||
.groups
|
||||
.iter()
|
||||
.find_map(|g| g.workspaces.iter().find(|w| w.instances.contains(obj)))
|
||||
.map(|w| w.id)
|
||||
{
|
||||
if let Some(workspace_handle) = state.workspace_state().get_workspace_handle(obj) {
|
||||
let mut state = client
|
||||
.get_data::<<D as WorkspaceHandler>::Client>()
|
||||
.unwrap()
|
||||
.workspace_state()
|
||||
.lock()
|
||||
.unwrap();
|
||||
state.requests.push(Request::Remove(WorkspaceHandle { id }));
|
||||
state.requests.push(Request::Remove(workspace_handle));
|
||||
}
|
||||
}
|
||||
zcosmic_workspace_handle_v1::Request::Destroy => {
|
||||
|
|
@ -556,6 +534,16 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
pub fn get_workspace_handle(
|
||||
&self,
|
||||
handle: &ZcosmicWorkspaceHandleV1,
|
||||
) -> Option<WorkspaceHandle> {
|
||||
self.groups
|
||||
.iter()
|
||||
.find_map(|g| g.workspaces.iter().find(|w| w.instances.contains(handle)))
|
||||
.map(|w| WorkspaceHandle { id: w.id })
|
||||
}
|
||||
|
||||
pub fn global_id(&self) -> GlobalId {
|
||||
self.global.clone()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue