diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-03-31 14:21:33 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-03-31 14:33:02 +0300 |
| commit | e10b968eb085a4db1493c349e5411421d59f88af (patch) | |
| tree | 6485bbf33cb4809df8be0e72c044a5c122f9b009 /src/layout | |
| parent | 3b1bf34e21652b2ba6ce621226c05f74dccbefbb (diff) | |
| download | niri-e10b968eb085a4db1493c349e5411421d59f88af.tar.gz niri-e10b968eb085a4db1493c349e5411421d59f88af.tar.bz2 niri-e10b968eb085a4db1493c349e5411421d59f88af.zip | |
layout: Reset unfullscreen view offset when starting interactive resize
Diffstat (limited to 'src/layout')
| -rw-r--r-- | src/layout/scrolling.rs | 13 | ||||
| -rw-r--r-- | src/layout/tests.rs | 22 |
2 files changed, 33 insertions, 2 deletions
diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index 9bb190a4..0fbf4037 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -3284,10 +3284,11 @@ impl<W: LayoutElement> ScrollingSpace<W> { return false; } - let col = self + let (col_idx, col) = self .columns .iter_mut() - .find(|col| col.contains(&window)) + .enumerate() + .find(|(_, col)| col.contains(&window)) .unwrap(); if col.is_fullscreen { @@ -3311,6 +3312,14 @@ impl<W: LayoutElement> ScrollingSpace<W> { self.view_offset.stop_anim_and_gesture(); + // If this is the active column, clear the stored unfullscreen view offset in case one of + // the tiles in the column is still pending unfullscreen. Normally it is cleared and + // applied in update_window(), but we skip that during interactive resize because the view + // is frozen. + if col_idx == self.active_column_idx { + self.view_offset_before_fullscreen = None; + } + true } diff --git a/src/layout/tests.rs b/src/layout/tests.rs index 89fbb96b..5d45ee98 100644 --- a/src/layout/tests.rs +++ b/src/layout/tests.rs @@ -3313,6 +3313,28 @@ fn move_unfocused_pending_unfullscreen_window_out_of_active_column() { check_ops(&ops); } +#[test] +fn interactive_resize_on_pending_unfullscreen_column() { + let ops = [ + Op::AddWindow { + params: TestWindowParams::new(2), + }, + Op::FullscreenWindow(2), + Op::Communicate(2), + Op::SetFullscreenWindow { + window: 2, + is_fullscreen: false, + }, + Op::InteractiveResizeBegin { + window: 2, + edges: ResizeEdge::RIGHT, + }, + Op::Communicate(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; |
