diff options
Diffstat (limited to 'src/tests')
| -rw-r--r-- | src/tests/fullscreen.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/tests/fullscreen.rs b/src/tests/fullscreen.rs index 6ab97001..68ed7aeb 100644 --- a/src/tests/fullscreen.rs +++ b/src/tests/fullscreen.rs @@ -153,3 +153,65 @@ fn windowed_fullscreen_chain() { " ); } + +#[test] +fn unfullscreen_before_fullscreen_ack_doesnt_prevent_view_offset_save_restore() { + let (mut f, id, _surface) = set_up(); + + let window2 = f.client(id).create_window(); + let surface2 = window2.surface.clone(); + window2.commit(); + f.roundtrip(id); + + let window2 = f.client(id).window(&surface2); + window2.attach_new_buffer(); + window2.set_size(200, 200); + window2.ack_last_and_commit(); + f.double_roundtrip(id); + + let _ = f.client(id).window(&surface2).recent_configures(); + + let niri = f.niri(); + let mapped2 = niri.layout.windows().last().unwrap().1; + let window2_id = mapped2.window.clone(); + + // The view position is at the first window. + assert_snapshot!(niri.layout.active_workspace().unwrap().scrolling().view_pos(), @"-16"); + + // Fullscreen window2 and send the configure so we can clear pending. + niri.layout.set_fullscreen(&window2_id, true); + f.double_roundtrip(id); + + // Before acking, unfullscreen the column, clearing the pending fullscreen flag. + f.niri().layout.set_fullscreen(&window2_id, false); + + // Now, window2 receives the fullscreen configure and resizes in response. + let window2 = f.client(id).window(&surface2); + assert_snapshot!( + window2.format_recent_configures(), + @"size: 1920 × 1080, bounds: 1888 × 1048, states: [Activated, Fullscreen]" + ); + let (_, configure) = window2.configures_received.last().unwrap(); + window2.set_size(configure.size.0 as u16, configure.size.1 as u16); + window2.ack_last_and_commit(); + f.double_roundtrip(id); + f.niri_complete_animations(); + + // The view position is now at the fullscreen-sized window2. + assert_snapshot!(f.niri().layout.active_workspace().unwrap().scrolling().view_pos(), @"116"); + + // Now, window2 receives the unfullscreen configure and resizes in response. + let window2 = f.client(id).window(&surface2); + assert_snapshot!( + window2.format_recent_configures(), + @"size: 936 × 1048, bounds: 1888 × 1048, states: [Activated]" + ); + window2.set_size(200, 200); + window2.ack_last_and_commit(); + f.roundtrip(id); + f.niri_complete_animations(); + + // The view position should restore to the first window. + // FIXME: this currently doesn't work and sets the view position to the second window. + assert_snapshot!(f.niri().layout.active_workspace().unwrap().scrolling().view_pos(), @"100"); +} |
