diff --git a/src/app.rs b/src/app.rs index db0b309..f17e5b2 100644 --- a/src/app.rs +++ b/src/app.rs @@ -240,13 +240,17 @@ impl ApplicationHandler for Application { } self.viewports .retain(|k, _| !inactive_viewports.contains(k)); - match self.viewports.get(&ViewportId::ROOT) { + match self.viewports.get(&viewport_id) { Some(viewport) => { if queue_redraw { viewport.window.request_redraw(); } } - None => event_loop.exit(), + None => { + if viewport_id == ViewportId::ROOT { + event_loop.exit(); + } + } } } @@ -480,7 +484,9 @@ impl Viewport { if let Some(icon) = icon { builder = builder.with_icon(icon); } - let (window, state) = create_window_and_state(&ctx, event_loop, &builder, &mut painter); + let viewport_id = app.viewport_id(); + let (window, state) = + create_window_and_state(&ctx, viewport_id, event_loop, &builder, &mut painter); egui_winit::update_viewport_info(&mut info, &ctx, &window, true); let render_state = painter.render_state(); @@ -522,7 +528,7 @@ impl Viewport { (NonZero::new(size.width), NonZero::new(size.height)) { self.painter - .on_window_resized(ViewportId::ROOT, width, height); + .on_window_resized(self.app.viewport_id(), width, height); } None } @@ -533,14 +539,16 @@ impl Viewport { } fn redraw(&mut self, event_loop: &ActiveEventLoop) -> Option { + let viewport_id = self.app.viewport_id(); let mut input = self.state.take_egui_input(&self.window); - input.viewports = std::iter::once((ViewportId::ROOT, self.info.clone())).collect(); + input.viewports = std::iter::once((viewport_id, self.info.clone())).collect(); + input.viewport_id = viewport_id; let mut output = self.ctx.run_ui(input, |ui| { self.app.show(ui); }); let clipped_primitives = self.ctx.tessellate(output.shapes, output.pixels_per_point); self.painter.paint_and_update_textures( - ViewportId::ROOT, + viewport_id, output.pixels_per_point, [0.0, 0.0, 0.0, 0.0], &clipped_primitives, @@ -551,14 +559,19 @@ impl Viewport { self.state .handle_platform_output(&self.window, output.platform_output); - let Some(mut viewport_output) = output.viewport_output.remove(&ViewportId::ROOT) else { + let Some(mut viewport_output) = output.viewport_output.remove(&viewport_id) else { return Some(Action::Close); }; let (mut deferred_commands, recreate) = self.builder.patch(viewport_output.builder); if recreate { - let (window, state) = - create_window_and_state(&self.ctx, event_loop, &self.builder, &mut self.painter); + let (window, state) = create_window_and_state( + &self.ctx, + viewport_id, + event_loop, + &self.builder, + &mut self.painter, + ); egui_winit::update_viewport_info(&mut self.info, &self.ctx, &window, true); self.window = window; self.state = state; @@ -613,16 +626,17 @@ pub enum Action { fn create_window_and_state( ctx: &Context, + viewport_id: ViewportId, event_loop: &ActiveEventLoop, builder: &ViewportBuilder, painter: &mut egui_wgpu::winit::Painter, ) -> (Arc, egui_winit::State) { - pollster::block_on(painter.set_window(ViewportId::ROOT, None)).unwrap(); + pollster::block_on(painter.set_window(viewport_id, None)).unwrap(); let window = Arc::new(egui_winit::create_window(ctx, event_loop, builder).unwrap()); - pollster::block_on(painter.set_window(ViewportId::ROOT, Some(window.clone()))).unwrap(); + pollster::block_on(painter.set_window(viewport_id, Some(window.clone()))).unwrap(); let state = egui_winit::State::new( ctx.clone(), - ViewportId::ROOT, + viewport_id, event_loop, Some(window.scale_factor() as f32), event_loop.system_theme(),