use client::ClientId; use insta::assert_snapshot; use wayland_client::protocol::wl_surface::WlSurface; use super::*; use crate::layout::LayoutElement as _; // Sets up a fixture with two outputs and 100×100 window. fn set_up() -> (Fixture, ClientId, WlSurface) { let mut f = Fixture::new(); f.add_output(1, (1920, 1080)); f.add_output(2, (1280, 720)); let id = f.add_client(); let window = f.client(id).create_window(); let surface = window.surface.clone(); window.commit(); f.roundtrip(id); let window = f.client(id).window(&surface); window.attach_new_buffer(); window.set_size(100, 100); window.ack_last_and_commit(); f.double_roundtrip(id); (f, id, surface) } #[test] fn windowed_fullscreen() { let (mut f, id, surface) = set_up(); let _ = f.client(id).window(&surface).recent_configures(); let niri = f.niri(); let mapped = niri.layout.windows().next().unwrap().1; let window_id = mapped.window.clone(); // Enable windowed fullscreen. niri.layout.toggle_windowed_fullscreen(&window_id); f.double_roundtrip(id); // Should request fullscreen state with the tiled size. let window = f.client(id).window(&surface); assert_snapshot!( window.format_recent_configures(), @"size: 936 × 1048, bounds: 1888 × 1048, states: [Activated, Fullscreen]" ); let mapped = f.niri().layout.windows().next().unwrap().1; // Not committed yet. assert!(!mapped.is_windowed_fullscreen()); // Commit in response. let window = f.client(id).window(&surface); window.ack_last_and_commit(); f.roundtrip(id); let mapped = f.niri().layout.windows().next().unwrap().1; // Now it is committed. assert!(mapped.is_windowed_fullscreen()); // Disable windowed fullscreen. f.niri().layout.toggle_windowed_fullscreen(&window_id); f.double_roundtrip(id); // Should request without fullscreen state with the tiled size. let window = f.client(id).window(&surface); assert_snapshot!( window.format_recent_configures(), @"size: 936 × 1048, bounds: 1888 × 1048, states: [Activated]" ); let mapped = f.niri().layout.windows().next().unwrap().1; // Not commited yet. assert!(mapped.is_windowed_fullscreen()); // Commit in response. let window = f.client(id).window(&surface); window.ack_last_and_commit(); f.roundtrip(id); let mapped = f.niri().layout.windows().next().unwrap().1; // Now it is committed. assert!(!mapped.is_windowed_fullscreen()); } #[test] fn windowed_fullscreen_chain() { let (mut f, id, surface) = set_up(); let _ = f.client(id).window(&surface).recent_configures(); let mapped = f.niri().layout.windows().next().unwrap().1; let window_id = mapped.window.clone(); f.niri().layout.toggle_windowed_fullscreen(&window_id); f.roundtrip(id); f.niri().layout.toggle_windowed_fullscreen(&window_id); f.roundtrip(id); f.niri().layout.toggle_windowed_fullscreen(&window_id); f.roundtrip(id); f.niri().layout.toggle_windowed_fullscreen(&window_id); f.double_roundtrip(id); // Should be four configures matching the four requests. let window = f.client(id).window(&surface); assert_snapshot!( window.format_recent_configures(), @r" size: 936 × 1048, bounds: 1888 × 1048, states: [Activated, Fullscreen] size: 936 × 1048, bounds: 1888 × 1048, states: [Activated] size: 936 × 1048, bounds: 1888 × 1048, states: [Activated, Fullscreen] size: 936 × 1048, bounds: 1888 × 1048, states: [Activated] " ); let window = f.client(id).window(&surface); let serials = Vec::from_iter( window.configures_received[window.configures_received.len() - 4..] .iter() .map(|(s, _c)| *s), ); let get_state = |f: &mut Fixture| { let mapped = f.niri().layout.windows().next().unwrap().1; format!( "fs {}, wfs {}", mapped.is_fullscreen(), mapped.is_windowed_fullscreen() ) }; let mut states = vec![get_state(&mut f)]; for serial in serials { let window = f.client(id).window(&surface); window.xdg_surface.ack_configure(serial); window.commit(); f.roundtrip(id); states.push(get_state(&mut f)); } // We expect fs to always be false (because each Fullscreen state request corresponded to a // windowed fullscreen), and wfs to toggle on and off. assert_snapshot!( states.join("\n"), @r" fs false, wfs false fs false, wfs true fs false, wfs false fs false, wfs true fs false, wfs false " ); }