ext_workspace: Utilize 2d-coords for workspace outputs

This commit is contained in:
Victoria Brekenfeld 2022-11-22 17:09:49 +01:00
parent 57f15da85d
commit aa2e7c0a02

View file

@ -66,7 +66,8 @@ pub struct WorkspaceSet {
active: usize, active: usize,
amount: WorkspaceAmount, amount: WorkspaceAmount,
group: WorkspaceGroupHandle, group: WorkspaceGroupHandle,
workspaces: Vec<Workspace>, idx: usize,
pub(crate) workspaces: Vec<Workspace>,
} }
#[derive(Debug, Clone, Copy, Serialize, Deserialize)] #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
@ -92,13 +93,17 @@ fn create_workspace(
} }
impl WorkspaceSet { impl WorkspaceSet {
fn new(state: &mut WorkspaceUpdateGuard<'_, State>, amount: WorkspaceAmount) -> WorkspaceSet { fn new(
state: &mut WorkspaceUpdateGuard<'_, State>,
amount: WorkspaceAmount,
idx: usize,
) -> WorkspaceSet {
let group_handle = state.create_workspace_group(); let group_handle = state.create_workspace_group();
let workspaces = match amount { let workspaces = match amount {
WorkspaceAmount::Dynamic => { WorkspaceAmount::Dynamic => {
let workspace = create_workspace(state, &group_handle, true); let workspace = create_workspace(state, &group_handle, true);
workspace_set_idx(state, 1, &workspace.handle); workspace_set_idx(state, 1, idx, &workspace.handle);
state.set_workspace_capabilities( state.set_workspace_capabilities(
&workspace.handle, &workspace.handle,
[WorkspaceCapabilities::Activate].into_iter(), [WorkspaceCapabilities::Activate].into_iter(),
@ -108,7 +113,7 @@ impl WorkspaceSet {
WorkspaceAmount::Static(len) => (0..len) WorkspaceAmount::Static(len) => (0..len)
.map(|i| { .map(|i| {
let workspace = create_workspace(state, &group_handle, i == 0); let workspace = create_workspace(state, &group_handle, i == 0);
workspace_set_idx(state, i + 1, &workspace.handle); workspace_set_idx(state, i + 1, idx, &workspace.handle);
state.set_workspace_capabilities( state.set_workspace_capabilities(
&workspace.handle, &workspace.handle,
[WorkspaceCapabilities::Activate].into_iter(), [WorkspaceCapabilities::Activate].into_iter(),
@ -122,6 +127,7 @@ impl WorkspaceSet {
active: 0, active: 0,
amount, amount,
group: group_handle, group: group_handle,
idx,
workspaces, workspaces,
} }
} }
@ -192,7 +198,7 @@ impl WorkspaceSet {
if keep.iter().any(|val| *val == false) { if keep.iter().any(|val| *val == false) {
for (i, workspace) in self.workspaces.iter().enumerate() { for (i, workspace) in self.workspaces.iter().enumerate() {
workspace_set_idx(&mut state, i as u8 + 1, &workspace.handle); workspace_set_idx(&mut state, i as u8 + 1, self.idx, &workspace.handle);
} }
} }
} }
@ -240,6 +246,7 @@ impl WorkspaceSet {
workspace_set_idx( workspace_set_idx(
&mut state, &mut state,
self.workspaces.len() as u8 + 1, self.workspaces.len() as u8 + 1,
self.idx,
&workspace.handle, &workspace.handle,
); );
state.set_workspace_capabilities( state.set_workspace_capabilities(
@ -253,6 +260,13 @@ impl WorkspaceSet {
} }
} }
} }
fn update_idx(&mut self, state: &mut WorkspaceUpdateGuard<'_, State>, idx: usize) {
self.idx = idx;
for (i, workspace) in self.workspaces.iter().enumerate() {
workspace_set_idx(state, i as u8, idx, &workspace.handle);
}
}
} }
#[derive(Debug)] #[derive(Debug)]
@ -269,7 +283,7 @@ impl WorkspaceMode {
) -> WorkspaceMode { ) -> WorkspaceMode {
match config { match config {
crate::config::WorkspaceMode::Global => { crate::config::WorkspaceMode::Global => {
WorkspaceMode::Global(WorkspaceSet::new(state, amount)) WorkspaceMode::Global(WorkspaceSet::new(state, amount, 0))
} }
crate::config::WorkspaceMode::OutputBound => { crate::config::WorkspaceMode::OutputBound => {
WorkspaceMode::OutputBound(HashMap::new(), amount) WorkspaceMode::OutputBound(HashMap::new(), amount)
@ -432,7 +446,10 @@ impl Shell {
WorkspaceMode::OutputBound(sets, amount) => { WorkspaceMode::OutputBound(sets, amount) => {
// TODO: Restore previously assigned workspaces, if possible! // TODO: Restore previously assigned workspaces, if possible!
if !sets.contains_key(output) { if !sets.contains_key(output) {
sets.insert(output.clone(), WorkspaceSet::new(&mut state, *amount)); sets.insert(
output.clone(),
WorkspaceSet::new(&mut state, *amount, sets.len()),
);
} }
for workspace in &mut sets.get_mut(output).unwrap().workspaces { for workspace in &mut sets.get_mut(output).unwrap().workspaces {
workspace.map_output(output, (0, 0).into()); workspace.map_output(output, (0, 0).into());
@ -482,11 +499,6 @@ impl Shell {
&workspace_handle, &workspace_handle,
[WorkspaceCapabilities::Activate].into_iter(), [WorkspaceCapabilities::Activate].into_iter(),
); );
workspace_set_idx(
&mut state,
new_set.workspaces.len() as u8 + 1,
&workspace_handle,
);
workspace.handle = workspace_handle; workspace.handle = workspace_handle;
// update mapping // update mapping
@ -497,11 +509,14 @@ impl Shell {
new_set.workspaces.push(workspace); new_set.workspaces.push(workspace);
} }
state.remove_workspace_group(set.group); state.remove_workspace_group(set.group);
std::mem::drop(state);
self.refresh(); // cleans up excess of workspaces and empty workspaces
} }
// if there is no output, we are going to quit anyway, just drop the workspace set // if there is no output, we are going to quit anyway, just drop the workspace set
} }
for (i, set) in sets.values_mut().enumerate() {
set.update_idx(&mut state, i);
}
std::mem::drop(state);
self.refresh(); // cleans up excess of workspaces and empty workspaces
} }
WorkspaceMode::Global(set) => { WorkspaceMode::Global(set) => {
state.remove_group_output(&set.group, output); state.remove_group_output(&set.group, output);
@ -537,7 +552,7 @@ impl Shell {
}; };
// in this case we have to merge our sets, preserving placing of windows as nicely as possible // in this case we have to merge our sets, preserving placing of windows as nicely as possible
let mut new_set = WorkspaceSet::new(&mut state, WorkspaceAmount::Static(0)); let mut new_set = WorkspaceSet::new(&mut state, WorkspaceAmount::Static(0), 0);
// lets construct an iterator of all the pairs of workspaces we have to merge // lets construct an iterator of all the pairs of workspaces we have to merge
// we first split of the part of the workspaces that contain the currently active one // we first split of the part of the workspaces that contain the currently active one
@ -593,7 +608,7 @@ impl Shell {
&workspace_handle, &workspace_handle,
[WorkspaceCapabilities::Activate].into_iter(), [WorkspaceCapabilities::Activate].into_iter(),
); );
workspace_set_idx(&mut state, i as u8 + 1, &workspace_handle); workspace_set_idx(&mut state, i as u8 + 1, 0, &workspace_handle);
let mut new_workspace = Workspace::new(workspace_handle); let mut new_workspace = Workspace::new(workspace_handle);
for output in self.outputs.iter() { for output in self.outputs.iter() {
@ -639,14 +654,14 @@ impl Shell {
// split workspaces apart, preserving window positions relative to their outputs // split workspaces apart, preserving window positions relative to their outputs
let mut sets = HashMap::new(); let mut sets = HashMap::new();
for output in &self.outputs { for (i, output) in self.outputs.iter().enumerate() {
sets.insert( sets.insert(
output.clone(), output.clone(),
WorkspaceSet::new(&mut state, WorkspaceAmount::Static(0)), WorkspaceSet::new(&mut state, WorkspaceAmount::Static(0), i),
); );
} }
for (i, workspace) in set.workspaces.drain(..).enumerate() { for (i, workspace) in set.workspaces.drain(..).enumerate() {
for output in &self.outputs { for (idx, output) in self.outputs.iter().enumerate() {
// copy over everything and then remove other outputs to preserve state // copy over everything and then remove other outputs to preserve state
let new_set = sets.get_mut(output).unwrap(); let new_set = sets.get_mut(output).unwrap();
let new_workspace_handle = state.create_workspace(&new_set.group).unwrap(); let new_workspace_handle = state.create_workspace(&new_set.group).unwrap();
@ -654,7 +669,7 @@ impl Shell {
&new_workspace_handle, &new_workspace_handle,
[WorkspaceCapabilities::Activate].into_iter(), [WorkspaceCapabilities::Activate].into_iter(),
); );
workspace_set_idx(&mut state, i as u8 + 1, &new_workspace_handle); workspace_set_idx(&mut state, i as u8 + 1, idx, &new_workspace_handle);
let mut old_tiling_layer = workspace.tiling_layer.clone(); let mut old_tiling_layer = workspace.tiling_layer.clone();
let mut new_floating_layer = FloatingLayout::new(); let mut new_floating_layer = FloatingLayout::new();
@ -1086,8 +1101,9 @@ impl Shell {
fn workspace_set_idx<'a>( fn workspace_set_idx<'a>(
state: &mut WorkspaceUpdateGuard<'a, State>, state: &mut WorkspaceUpdateGuard<'a, State>,
idx: u8, idx: u8,
output_pos: usize,
handle: &WorkspaceHandle, handle: &WorkspaceHandle,
) { ) {
state.set_workspace_name(&handle, format!("{}", idx)); state.set_workspace_name(&handle, format!("{}", idx));
state.set_workspace_coordinates(&handle, [Some(idx as u32), None, None]); state.set_workspace_coordinates(&handle, [Some(idx as u32), Some(output_pos as u32), None]);
} }