diff --git a/crates/eframe/src/native/epi_integration.rs b/crates/eframe/src/native/epi_integration.rs index 5d02e2386e9..6ca5b639648 100644 --- a/crates/eframe/src/native/epi_integration.rs +++ b/crates/eframe/src/native/epi_integration.rs @@ -242,10 +242,6 @@ impl EpiIntegration { use winit::event::{ElementState, MouseButton, WindowEvent}; match event { - WindowEvent::Destroyed => { - log::debug!("Received WindowEvent::Destroyed"); - self.close = true; - } WindowEvent::MouseInput { button: MouseButton::Left, state: ElementState::Pressed, diff --git a/crates/eframe/src/native/glow_integration.rs b/crates/eframe/src/native/glow_integration.rs index 366b71cfd7a..18e14aec6b6 100644 --- a/crates/eframe/src/native/glow_integration.rs +++ b/crates/eframe/src/native/glow_integration.rs @@ -809,6 +809,18 @@ impl GlowWinitRunning { } } + winit::event::WindowEvent::Destroyed => { + log::debug!( + "Received WindowEvent::Destroyed for viewport {:?}", + viewport_id + ); + if viewport_id == Some(ViewportId::ROOT) { + return EventResult::Exit; + } else { + return EventResult::Wait; + } + } + _ => {} } @@ -1365,6 +1377,7 @@ fn initialize_or_update_viewport( ); viewport.window = None; viewport.egui_winit = None; + viewport.gl_surface = None; } viewport.deferred_commands.append(&mut delta_commands); diff --git a/crates/eframe/src/native/wgpu_integration.rs b/crates/eframe/src/native/wgpu_integration.rs index 74f4e957c70..c408cf39101 100644 --- a/crates/eframe/src/native/wgpu_integration.rs +++ b/crates/eframe/src/native/wgpu_integration.rs @@ -158,6 +158,7 @@ impl WgpuWinitApp { ViewportClass::Root, self.native_options.viewport.clone(), None, + painter, ) .initialize_window(event_loop, egui_ctx, viewport_from_window, painter); } @@ -929,8 +930,14 @@ fn render_immediate_viewport( .. } = &mut *shared.borrow_mut(); - let viewport = - initialize_or_update_viewport(viewports, ids, ViewportClass::Immediate, builder, None); + let viewport = initialize_or_update_viewport( + viewports, + ids, + ViewportClass::Immediate, + builder, + None, + painter, + ); if viewport.window.is_none() { event_loop_context::with_current_event_loop(|event_loop| { viewport.initialize_window(event_loop, egui_ctx, viewport_from_window, painter); @@ -1053,7 +1060,7 @@ fn handle_viewport_output( let ids = ViewportIdPair::from_self_and_parent(viewport_id, parent); let viewport = - initialize_or_update_viewport(viewports, ids, class, builder, viewport_ui_cb); + initialize_or_update_viewport(viewports, ids, class, builder, viewport_ui_cb, painter); if let Some(window) = viewport.window.as_ref() { let old_inner_size = window.inner_size(); @@ -1086,13 +1093,14 @@ fn handle_viewport_output( remove_viewports_not_in(viewports, painter, viewport_from_window, viewport_output); } -fn initialize_or_update_viewport( - viewports: &mut Viewports, +fn initialize_or_update_viewport<'a>( + viewports: &'a mut Viewports, ids: ViewportIdPair, class: ViewportClass, mut builder: ViewportBuilder, viewport_ui_cb: Option>, -) -> &mut Viewport { + painter: &mut egui_wgpu::winit::Painter, +) -> &'a mut Viewport { crate::profile_function!(); if builder.icon.is_none() { @@ -1137,6 +1145,12 @@ fn initialize_or_update_viewport( ); viewport.window = None; viewport.egui_winit = None; + if let Err(err) = pollster::block_on(painter.set_window(viewport.ids.this, None)) { + log::error!( + "when rendering viewport_id={:?}, set_window Error {err}", + viewport.ids.this + ); + } } viewport.deferred_commands.append(&mut delta_commands);