diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/layout/mod.rs | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 571411fc..2e05392d 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1904,8 +1904,21 @@ impl<W: LayoutElement> Layout<W> { } } - let Some(monitor) = self.active_monitor() else { - return; + let monitor = if let Some(window) = window { + match &mut self.monitor_set { + MonitorSet::Normal { monitors, .. } => monitors + .iter_mut() + .find(|mon| mon.has_window(window)) + .unwrap(), + MonitorSet::NoOutputs { .. } => { + return; + } + } + } else { + let Some(monitor) = self.active_monitor() else { + return; + }; + monitor }; monitor.move_to_workspace(window, idx); } @@ -4935,11 +4948,7 @@ mod tests { window_id, workspace_idx, } => { - let window_id = window_id.filter(|id| { - layout - .active_monitor() - .map_or(false, |mon| mon.has_window(id)) - }); + let window_id = window_id.filter(|id| layout.has_window(id)); layout.move_to_workspace(window_id.as_ref(), workspace_idx); } Op::MoveColumnToWorkspaceDown => layout.move_column_to_workspace_down(), @@ -6708,6 +6717,24 @@ mod tests { check_ops(&ops); } + #[test] + fn move_window_to_workspace_with_different_active_output() { + let ops = [ + Op::AddOutput(0), + Op::AddOutput(1), + Op::AddWindow { + params: TestWindowParams::new(0), + }, + Op::FocusOutput(1), + Op::MoveWindowToWorkspace { + window_id: Some(0), + workspace_idx: 2, + }, + ]; + + check_ops(&ops); + } + fn parent_id_causes_loop(layout: &Layout<TestWindow>, id: usize, mut parent_id: usize) -> bool { if parent_id == id { return true; |
