From 10f985b84cdbcc3bbf35b3e7e43d1b2a84fa9ce2 Mon Sep 17 00:00:00 2001 From: awsms <48278661+awsms@users.noreply.github.com> Date: Thu, 26 Feb 2026 19:20:40 +0100 Subject: [PATCH] fix: avoid panic when no outputs are present Replace `unwrap()` on the output scale query with conditional handling. This prevents a panic when the last output is removed and the query temporarily returns no results + add test to cover removing all outputs. --- src/server/mod.rs | 30 +++++++++++++++--------------- src/server/tests.rs | 11 +++++++++++ 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index 2c42887..ab6f7a4 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -701,25 +701,25 @@ impl ServerState { let mut scale; let mut outputs = self.world.query_mut::<&OutputScaleFactor>().into_iter(); - let (_, output_scale) = outputs.next().unwrap(); + if let Some((_, output_scale)) = outputs.next() { + scale = output_scale.get(); - scale = output_scale.get(); - - for (_, output_scale) in outputs { - if output_scale.get() != scale { - mixed_scale = true; - scale = scale.min(output_scale.get()); + for (_, output_scale) in outputs { + if output_scale.get() != scale { + mixed_scale = true; + scale = scale.min(output_scale.get()); + } } - } - if mixed_scale { - warn!( - "Mixed output scales detected, choosing to give apps the smallest detected scale ({scale}x)" - ); - } + if mixed_scale { + warn!( + "Mixed output scales detected, choosing to give apps the smallest detected scale ({scale}x)" + ); + } - debug!("Using new scale {scale}"); - self.new_scale = Some(scale); + debug!("Using new scale {scale}"); + self.new_scale = Some(scale); + } } { diff --git a/src/server/tests.rs b/src/server/tests.rs index 317b4b4..25db5b7 100644 --- a/src/server/tests.rs +++ b/src/server/tests.rs @@ -1773,6 +1773,17 @@ fn output_offset_remove_output() { check_output_position_event(&output_main_c, (0, 0)); } +#[test] +fn remove_all_outputs() { + let (mut f, _) = TestFixture::new_with_compositor(); + + let (_, output) = f.new_output(0, 0); + f.run(); + + f.remove_output(output); + f.run(); +} + #[test] fn output_offset_surface_positioning() { let (mut f, comp) = TestFixture::new_with_compositor();