diff --git a/egui/src/containers/frame.rs b/egui/src/containers/frame.rs index e655c0ea..00146109 100644 --- a/egui/src/containers/frame.rs +++ b/egui/src/containers/frame.rs @@ -121,7 +121,12 @@ impl Frame { pub fn begin(self, ui: &mut Ui) -> Prepared { let where_to_put_background = ui.painter().add(Shape::Noop); let outer_rect_bounds = ui.available_rect_before_wrap(); - let inner_rect = outer_rect_bounds.shrink2(self.margin); + let mut inner_rect = outer_rect_bounds.shrink2(self.margin); + + // Make sure we don't shrink to the negative: + inner_rect.max.x = inner_rect.max.x.max(inner_rect.min.x); + inner_rect.max.y = inner_rect.max.y.max(inner_rect.min.y); + let content_ui = ui.child_ui(inner_rect, *ui.layout()); // content_ui.set_clip_rect(outer_rect_bounds.shrink(self.stroke.width * 0.5)); // Can't do this since we don't know final size yet diff --git a/egui_demo_lib/src/lib.rs b/egui_demo_lib/src/lib.rs index a9884452..eb3a5cc9 100644 --- a/egui_demo_lib/src/lib.rs +++ b/egui_demo_lib/src/lib.rs @@ -139,3 +139,22 @@ fn test_egui_e2e() { assert!(!clipped_meshes.is_empty()); } } + +#[test] +fn test_egui_zero_window_size() { + let mut demo_windows = crate::DemoWindows::default(); + let mut ctx = egui::CtxRef::default(); + let raw_input = egui::RawInput { + screen_rect: Some(egui::Rect::from_min_max(egui::Pos2::ZERO, egui::Pos2::ZERO)), + ..Default::default() + }; + + const NUM_FRAMES: usize = 5; + for _ in 0..NUM_FRAMES { + ctx.begin_frame(raw_input.clone()); + demo_windows.ui(&ctx); + let (_output, shapes) = ctx.end_frame(); + let clipped_meshes = ctx.tessellate(shapes); + assert!(clipped_meshes.is_empty(), "There should be nothing to show"); + } +}