diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-12-29 22:52:13 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-12-30 20:12:37 +0300 |
| commit | 9089c3fb0224a7f8d425a02fa299f6a5ea607b17 (patch) | |
| tree | 5ac6175236da510566c8928f68d8ba1aa69f9ad0 | |
| parent | 6c897d520165bfcaf3833b6e3d4bdbd836d26063 (diff) | |
| download | niri-9089c3fb0224a7f8d425a02fa299f6a5ea607b17.tar.gz niri-9089c3fb0224a7f8d425a02fa299f6a5ea607b17.tar.bz2 niri-9089c3fb0224a7f8d425a02fa299f6a5ea607b17.zip | |
Fix move-window-to-workspace panic when wrong monitor is active
| -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; |
