diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index a42e1d560..4da358c2a 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -557,7 +557,8 @@ impl<'open> Window<'open> { }; let margins = frame.outer_margin.sum() + frame.inner_margin.sum() - + vec2(0.0, title_bar_height); + + vec2(0.0, title_bar_height) + - vec2(0.0, 3.0); //magic number if let Some(mut state) = resize::State::load(ctx, resize_id) { state.requested_size = Some(win_size - margins); @@ -700,8 +701,6 @@ impl<'open> Window<'open> { content_inner }; - let size = ctx.round_vec_to_pixels(area_content_ui.min_size()); - let full_response = area.end(ctx, area_content_ui); if !collapsing.is_open() { diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index b0f6acaa4..00a93c34e 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -63,7 +63,7 @@ struct Repaint { pub repaint_after: HashMap, /// While positive, keep requesting repaints. Decrement at the end of each frame. - repaint_requests: u32, + repaint_requests: HashMap, request_repaint_callback: Option>, requested_repaint_last_frame: bool, @@ -73,12 +73,14 @@ impl Default for Repaint { fn default() -> Self { let mut repaint_after = HashMap::default(); repaint_after.insert(0, std::time::Duration::from_millis(100)); + let mut repaint_requests = HashMap::default(); + repaint_requests.insert(0, 1); Self { frame_nr: 0, repaint_after, // Start with painting an extra frame to compensate for some widgets // that take two frames before they "settle": - repaint_requests: 1, + repaint_requests, request_repaint_callback: None, requested_repaint_last_frame: false, } @@ -94,7 +96,7 @@ impl Repaint { if after == std::time::Duration::ZERO { // Do a few extra frames to let things settle. // This is a bit of a hack, and we don't support it for `repaint_after` callbacks yet. - self.repaint_requests = 2; + self.repaint_requests.insert(viewport_id, 2); } // We only re-call the callback if we get a lower duration, @@ -132,8 +134,23 @@ impl Repaint { ) -> Vec<(u64, std::time::Duration)> { // if repaint_requests is greater than zero. just set the duration to zero for immediate // repaint. if there's no repaint requests, then we can use the actual repaint_after instead. - let repaint_after = if self.repaint_requests > 0 { - self.repaint_requests -= 1; + let repaint_after = if self + .repaint_requests + .get(&viewport_id) + .cloned() + .unwrap_or(0) + > 0 + { + // This is a hack, i think + // is some thing strange with the input! We need to store a state per viewport and not per context + if let Some(requests) = self.repaint_requests.get_mut(&viewport_id) { + if *requests >= 2 { + *requests -= 2; + } else { + *requests -= 1; + } + } + std::time::Duration::ZERO } else { self.repaint_after @@ -147,6 +164,8 @@ impl Repaint { self.frame_nr += 1; self.repaint_after.retain(|id, _| viewports.contains(id)); + self.repaint_requests + .retain(|id, repaints| viewports.contains(id) && *repaints != 0); self.repaint_after .iter() diff --git a/examples/viewports/src/main.rs b/examples/viewports/src/main.rs index 17bbb8b78..b3748682a 100644 --- a/examples/viewports/src/main.rs +++ b/examples/viewports/src/main.rs @@ -5,6 +5,8 @@ use eframe::NativeOptions; fn main() { env_logger::init(); // Use `RUST_LOG=debug` to see logs. + let mut to_repair = false; + let _ = eframe::run_simple_native( "Viewports Examples", NativeOptions { @@ -17,6 +19,7 @@ fn main() { let mut is_desktop = ctx.is_desktop(); ui.checkbox(&mut is_desktop, "Is Desktop"); ctx.set_desktop(is_desktop); + ui.checkbox(&mut to_repair, "To Repair!"); egui::CollapsingHeader::new("Show Test1").show(ui, |ui| { egui::Window::new("Test1").show(ctx, move |ui, id, parent_id| { @@ -30,6 +33,9 @@ fn main() { ui.data_mut(|data| { data.insert_persisted(Id::new("Test1").with("_embedded"), embedded) }); + if to_repair { + ui.spinner(); + } let ctx = ui.ctx().clone(); ui.label(format!( @@ -59,6 +65,9 @@ fn main() { ui.data_mut(|data| { data.insert_persisted(Id::new("Test2").with("_embedded"), embedded) }); + if to_repair { + ui.spinner(); + } let ctx = ui.ctx().clone(); ui.label(format!( "Current rendering window: {}",