mirror of
https://github.com/emilk/egui.git
synced 2026-09-01 14:20:04 -04:00
Fix crash during shutdown
This commit is contained in:
@@ -1070,27 +1070,35 @@ mod glow_integration {
|
|||||||
let glutin_ctx = Rc::new(RefCell::new(glutin_ctx));
|
let glutin_ctx = Rc::new(RefCell::new(glutin_ctx));
|
||||||
let painter = Rc::new(RefCell::new(painter));
|
let painter = Rc::new(RefCell::new(painter));
|
||||||
|
|
||||||
// c_* means that will be taken by the next closure
|
{
|
||||||
|
// Create weak pointers so that we don't keep
|
||||||
|
// state alive for too long.
|
||||||
|
let glutin = Rc::downgrade(&glutin_ctx);
|
||||||
|
let gl = Arc::downgrade(&gl);
|
||||||
|
let painter = Rc::downgrade(&painter);
|
||||||
|
let beginning = integration.beginning;
|
||||||
|
|
||||||
let c_glutin = glutin_ctx.clone();
|
integration.egui_ctx.set_render_sync_callback(
|
||||||
let c_gl = gl.clone();
|
move |egui_ctx, viewport_builder, pair, render| {
|
||||||
let c_painter = painter.clone();
|
if let (Some(glutin), Some(gl), Some(painter)) =
|
||||||
let c_time = integration.beginning;
|
(glutin.upgrade(), gl.upgrade(), painter.upgrade())
|
||||||
|
{
|
||||||
integration.egui_ctx.set_render_sync_callback(
|
Self::render_sync_viewport(
|
||||||
move |egui_ctx, viewport_builder, pair, render| {
|
egui_ctx,
|
||||||
Self::render_sync_viewport(
|
viewport_builder,
|
||||||
egui_ctx,
|
pair,
|
||||||
viewport_builder,
|
render,
|
||||||
pair,
|
&glutin,
|
||||||
render,
|
&gl,
|
||||||
&c_glutin,
|
&painter,
|
||||||
&c_gl,
|
beginning,
|
||||||
&c_painter,
|
);
|
||||||
c_time,
|
} else {
|
||||||
);
|
log::warn!("render_sync_callback called after window closed");
|
||||||
},
|
}
|
||||||
);
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
*self.running.borrow_mut() = Some(GlowWinitRunning {
|
*self.running.borrow_mut() = Some(GlowWinitRunning {
|
||||||
glutin_ctx,
|
glutin_ctx,
|
||||||
@@ -2142,29 +2150,45 @@ mod wgpu_integration {
|
|||||||
|
|
||||||
let painter = Rc::new(RefCell::new(painter));
|
let painter = Rc::new(RefCell::new(painter));
|
||||||
|
|
||||||
// c_* means that will be taken by the next closure
|
{
|
||||||
|
// Create weak pointers so that we don't keep
|
||||||
|
// state alive for too long.
|
||||||
|
let viewports = Rc::downgrade(&viewports);
|
||||||
|
let builders = Rc::downgrade(&builders);
|
||||||
|
let painter = Rc::downgrade(&painter);
|
||||||
|
let viewport_maps = Rc::downgrade(&viewport_maps);
|
||||||
|
let beginning = integration.beginning;
|
||||||
|
|
||||||
let c_viewports = viewports.clone();
|
integration.egui_ctx.set_render_sync_callback(
|
||||||
let c_builders = builders.clone();
|
move |egui_ctx, viewport_builder, pair, render| {
|
||||||
let c_time = integration.beginning;
|
if let (
|
||||||
let c_painter = painter.clone();
|
Some(viewports),
|
||||||
let c_viewport_maps = viewport_maps.clone();
|
Some(builders),
|
||||||
|
Some(painter),
|
||||||
integration.egui_ctx.set_render_sync_callback(
|
Some(viewport_maps),
|
||||||
move |egui_ctx, viewport_builder, pair, render| {
|
) = (
|
||||||
Self::render_sync_viewport(
|
viewports.upgrade(),
|
||||||
egui_ctx,
|
builders.upgrade(),
|
||||||
viewport_builder,
|
painter.upgrade(),
|
||||||
pair,
|
viewport_maps.upgrade(),
|
||||||
render,
|
) {
|
||||||
&mut c_viewports.borrow_mut(),
|
Self::render_sync_viewport(
|
||||||
&c_builders,
|
egui_ctx,
|
||||||
c_time,
|
viewport_builder,
|
||||||
&c_painter,
|
pair,
|
||||||
&c_viewport_maps,
|
render,
|
||||||
);
|
&mut viewports.borrow_mut(),
|
||||||
},
|
&builders,
|
||||||
);
|
beginning,
|
||||||
|
&painter,
|
||||||
|
&viewport_maps,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
log::warn!("render_sync_callback called after window closed");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
self.running = Some(WgpuWinitRunning {
|
self.running = Some(WgpuWinitRunning {
|
||||||
painter,
|
painter,
|
||||||
|
|||||||
Reference in New Issue
Block a user