shell: Fix workspaces without mapped outputs

This commit is contained in:
Victoria Brekenfeld 2022-10-25 17:25:22 +02:00
parent 4bafce880c
commit 38e3194331

View file

@ -116,24 +116,34 @@ impl WorkspaceSet {
} }
} }
fn refresh( fn refresh<'a>(
&mut self, &mut self,
amount: WorkspaceAmount, amount: WorkspaceAmount,
state: &mut WorkspaceState<State>, state: &mut WorkspaceState<State>,
toplevel_info: &mut ToplevelInfoState<State>, toplevel_info: &mut ToplevelInfoState<State>,
outputs: impl Iterator<Item = (&'a Output, Point<i32, Logical>)>,
) { ) {
match amount { match amount {
WorkspaceAmount::Dynamic => self.ensure_last_empty(state), WorkspaceAmount::Dynamic => self.ensure_last_empty(state, outputs),
WorkspaceAmount::Static(len) => self.ensure_static(len as usize, state, toplevel_info), WorkspaceAmount::Static(len) => {
self.ensure_static(len as usize, state, toplevel_info, outputs)
}
} }
self.workspaces[self.active].refresh(); self.workspaces[self.active].refresh();
} }
fn ensure_last_empty(&mut self, state: &mut WorkspaceState<State>) { fn ensure_last_empty<'a>(
&mut self,
state: &mut WorkspaceState<State>,
outputs: impl Iterator<Item = (&'a Output, Point<i32, Logical>)>,
) {
// add empty at the end, if necessary // add empty at the end, if necessary
if self.workspaces.last().unwrap().windows().next().is_some() { if self.workspaces.last().unwrap().windows().next().is_some() {
self.workspaces let mut workspace = create_workspace(&mut state.update(), &self.group, false);
.push(create_workspace(&mut state.update(), &self.group, false)); for (output, location) in outputs {
workspace.map_output(output, location);
}
self.workspaces.push(workspace);
} }
let len = self.workspaces.len(); let len = self.workspaces.len();
@ -153,11 +163,12 @@ impl WorkspaceSet {
self.workspaces.retain(|_| *iter.next().unwrap()); self.workspaces.retain(|_| *iter.next().unwrap());
} }
fn ensure_static( fn ensure_static<'a>(
&mut self, &mut self,
amount: usize, amount: usize,
state: &mut WorkspaceState<State>, state: &mut WorkspaceState<State>,
toplevel_info: &mut ToplevelInfoState<State>, toplevel_info: &mut ToplevelInfoState<State>,
outputs: impl Iterator<Item = (&'a Output, Point<i32, Logical>)>,
) { ) {
if amount < self.workspaces.len() { if amount < self.workspaces.len() {
let mut state = state.update(); let mut state = state.update();
@ -189,9 +200,13 @@ impl WorkspaceSet {
} else if amount > self.workspaces.len() { } else if amount > self.workspaces.len() {
let mut state = state.update(); let mut state = state.update();
// add empty ones // add empty ones
let outputs = outputs.collect::<Vec<_>>();
while amount > self.workspaces.len() { while amount > self.workspaces.len() {
self.workspaces let mut workspace = create_workspace(&mut state, &self.group, false);
.push(create_workspace(&mut state, &self.group, false)); for &(output, location) in outputs.iter() {
workspace.map_output(output, location);
}
self.workspaces.push(workspace);
} }
} }
} }
@ -759,11 +774,12 @@ impl Shell {
match &mut self.workspaces { match &mut self.workspaces {
WorkspaceMode::OutputBound(sets) => { WorkspaceMode::OutputBound(sets) => {
for set in sets.values_mut() { for (output, set) in sets.iter_mut() {
set.refresh( set.refresh(
self.workspace_amount, self.workspace_amount,
&mut self.workspace_state, &mut self.workspace_state,
&mut self.toplevel_info_state, &mut self.toplevel_info_state,
std::iter::once((output, (0, 0).into())),
); );
} }
} }
@ -771,6 +787,7 @@ impl Shell {
self.workspace_amount, self.workspace_amount,
&mut self.workspace_state, &mut self.workspace_state,
&mut self.toplevel_info_state, &mut self.toplevel_info_state,
self.outputs.iter().map(|o| (o, o.current_location())),
), ),
} }