aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/scrolling.rs8
-rw-r--r--src/layout/tests.rs25
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),