From 9089c3fb0224a7f8d425a02fa299f6a5ea607b17 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Sun, 29 Dec 2024 22:52:13 +0300 Subject: Fix move-window-to-workspace panic when wrong monitor is active --- src/layout/mod.rs | 41 ++++++++++++++++++++++++++++++++++------- 1 file 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 Layout { } } - 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, id: usize, mut parent_id: usize) -> bool { if parent_id == id { return true; -- cgit