diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/layout/scrolling.rs | 8 | ||||
| -rw-r--r-- | src/layout/tests.rs | 25 |
2 files changed, 32 insertions, 1 deletions
diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index da193e0d..3153ed0c 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -984,7 +984,13 @@ impl<W: LayoutElement> ScrollingSpace<W> { is_floating: false, }; - column.active_tile_idx = min(column.active_tile_idx, column.tiles.len() - 1); + if tile_idx < column.active_tile_idx { + // A tile above was removed; preserve the current position. + column.active_tile_idx -= 1; + } else { + column.active_tile_idx = min(column.active_tile_idx, column.tiles.len() - 1); + } + column.update_tile_sizes_with_transaction(true, transaction); self.data[column_idx].update(column); let offset = prev_width - column.width(); diff --git a/src/layout/tests.rs b/src/layout/tests.rs index 05178f01..e688c8bd 100644 --- a/src/layout/tests.rs +++ b/src/layout/tests.rs @@ -3013,6 +3013,31 @@ fn move_workspace_to_same_monitor_doesnt_reorder() { } #[test] +fn removing_window_above_preserves_focused_window() { + let ops = [ + Op::AddOutput(0), + Op::AddWindow { + params: TestWindowParams::new(0), + }, + Op::AddWindow { + params: TestWindowParams::new(1), + }, + Op::AddWindow { + params: TestWindowParams::new(2), + }, + Op::FocusColumnFirst, + Op::ConsumeWindowIntoColumn, + Op::ConsumeWindowIntoColumn, + Op::FocusWindowDown, + Op::CloseWindow(0), + ]; + + let layout = check_ops(&ops); + let win = layout.focus().unwrap(); + assert_eq!(win.0.id, 1); +} + +#[test] fn preset_column_width_fixed_correct_with_border() { let ops = [ Op::AddOutput(0), |
