shell: Move workspace on window move
This commit is contained in:
parent
38e3194331
commit
375d40e388
2 changed files with 26 additions and 11 deletions
|
|
@ -341,7 +341,8 @@ impl State {
|
||||||
0 => 9,
|
0 => 9,
|
||||||
x => x - 1,
|
x => x - 1,
|
||||||
};
|
};
|
||||||
self.common.shell.move_current_window(
|
Shell::move_current_window(
|
||||||
|
self,
|
||||||
seat,
|
seat,
|
||||||
¤t_output,
|
¤t_output,
|
||||||
workspace as usize,
|
workspace as usize,
|
||||||
|
|
|
||||||
|
|
@ -866,12 +866,12 @@ impl Shell {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn move_current_window(&mut self, seat: &Seat<State>, output: &Output, idx: usize) {
|
pub fn move_current_window(state: &mut State, seat: &Seat<State>, output: &Output, idx: usize) {
|
||||||
if idx == self.workspaces.active_num(output) {
|
if idx == state.common.shell.workspaces.active_num(output) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let old_workspace = self.workspaces.active_mut(output);
|
let old_workspace = state.common.shell.workspaces.active_mut(output);
|
||||||
let maybe_window = old_workspace.focus_stack.get(seat).last().cloned();
|
let maybe_window = old_workspace.focus_stack.get(seat).last().cloned();
|
||||||
if let Some(mapped) = maybe_window {
|
if let Some(mapped) = maybe_window {
|
||||||
let was_floating = old_workspace.floating_layer.unmap(&mapped);
|
let was_floating = old_workspace.floating_layer.unmap(&mapped);
|
||||||
|
|
@ -879,16 +879,19 @@ impl Shell {
|
||||||
assert!(was_floating != was_tiling);
|
assert!(was_floating != was_tiling);
|
||||||
|
|
||||||
for (toplevel, _) in mapped.windows() {
|
for (toplevel, _) in mapped.windows() {
|
||||||
self.toplevel_info_state
|
state
|
||||||
|
.common
|
||||||
|
.shell
|
||||||
|
.toplevel_info_state
|
||||||
.toplevel_leave_workspace(&toplevel, &old_workspace.handle);
|
.toplevel_leave_workspace(&toplevel, &old_workspace.handle);
|
||||||
}
|
}
|
||||||
let elements = old_workspace.mapped().cloned().collect::<Vec<_>>();
|
let elements = old_workspace.mapped().cloned().collect::<Vec<_>>();
|
||||||
std::mem::drop(old_workspace);
|
std::mem::drop(old_workspace);
|
||||||
for mapped in elements.into_iter() {
|
for mapped in elements.into_iter() {
|
||||||
self.update_reactive_popups(&mapped);
|
state.common.shell.update_reactive_popups(&mapped);
|
||||||
}
|
}
|
||||||
|
|
||||||
let new_workspace = self.workspaces.get_mut(idx, output).unwrap(); // checked above
|
let new_workspace = state.common.shell.workspaces.get_mut(idx, output).unwrap(); // checked above
|
||||||
let focus_stack = new_workspace.focus_stack.get(&seat);
|
let focus_stack = new_workspace.focus_stack.get(&seat);
|
||||||
if was_floating {
|
if was_floating {
|
||||||
new_workspace
|
new_workspace
|
||||||
|
|
@ -900,12 +903,24 @@ impl Shell {
|
||||||
.map(mapped.clone(), &seat, focus_stack.iter());
|
.map(mapped.clone(), &seat, focus_stack.iter());
|
||||||
}
|
}
|
||||||
for (toplevel, _) in mapped.windows() {
|
for (toplevel, _) in mapped.windows() {
|
||||||
self.toplevel_info_state
|
state
|
||||||
|
.common
|
||||||
|
.shell
|
||||||
|
.toplevel_info_state
|
||||||
.toplevel_enter_workspace(&toplevel, &new_workspace.handle);
|
.toplevel_enter_workspace(&toplevel, &new_workspace.handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut workspace_state = self.workspace_state.update();
|
for mapped in new_workspace
|
||||||
workspace_state.remove_workspace_state(&new_workspace.handle, WState::Hidden);
|
.mapped()
|
||||||
|
.cloned()
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.into_iter()
|
||||||
|
{
|
||||||
|
state.common.shell.update_reactive_popups(&mapped);
|
||||||
|
}
|
||||||
|
|
||||||
|
state.common.shell.activate(output, idx);
|
||||||
|
Common::set_focus(state, Some(&KeyboardFocusTarget::from(mapped)), &seat, None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -932,5 +947,4 @@ fn init_workspace_handle<'a>(
|
||||||
state.set_workspace_capabilities(&handle, [WorkspaceCapabilities::Activate].into_iter());
|
state.set_workspace_capabilities(&handle, [WorkspaceCapabilities::Activate].into_iter());
|
||||||
state.set_workspace_name(&handle, format!("{}", idx + 1));
|
state.set_workspace_name(&handle, format!("{}", idx + 1));
|
||||||
state.set_workspace_coordinates(&handle, [Some(idx as u32), None, None]);
|
state.set_workspace_coordinates(&handle, [Some(idx as u32), None, None]);
|
||||||
state.add_workspace_state(&handle, WState::Hidden);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue