aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-03-31 14:21:33 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-03-31 14:33:02 +0300
commite10b968eb085a4db1493c349e5411421d59f88af (patch)
tree6485bbf33cb4809df8be0e72c044a5c122f9b009 /src/layout
parent3b1bf34e21652b2ba6ce621226c05f74dccbefbb (diff)
downloadniri-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.rs13
-rw-r--r--src/layout/tests.rs22
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;