Update viewports to stop overloading root

This commit is contained in:
Simon Gellis 2026-03-29 23:59:03 -04:00
parent 0d2d6bf863
commit 615b0ab9a1
No known key found for this signature in database
GPG Key ID: DA576912FED9577B
1 changed files with 26 additions and 12 deletions

View File

@ -240,13 +240,17 @@ impl ApplicationHandler<UserEvent> for Application {
} }
self.viewports self.viewports
.retain(|k, _| !inactive_viewports.contains(k)); .retain(|k, _| !inactive_viewports.contains(k));
match self.viewports.get(&ViewportId::ROOT) { match self.viewports.get(&viewport_id) {
Some(viewport) => { Some(viewport) => {
if queue_redraw { if queue_redraw {
viewport.window.request_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 { if let Some(icon) = icon {
builder = builder.with_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); egui_winit::update_viewport_info(&mut info, &ctx, &window, true);
let render_state = painter.render_state(); let render_state = painter.render_state();
@ -522,7 +528,7 @@ impl Viewport {
(NonZero::new(size.width), NonZero::new(size.height)) (NonZero::new(size.width), NonZero::new(size.height))
{ {
self.painter self.painter
.on_window_resized(ViewportId::ROOT, width, height); .on_window_resized(self.app.viewport_id(), width, height);
} }
None None
} }
@ -533,14 +539,16 @@ impl Viewport {
} }
fn redraw(&mut self, event_loop: &ActiveEventLoop) -> Option<Action> { fn redraw(&mut self, event_loop: &ActiveEventLoop) -> Option<Action> {
let viewport_id = self.app.viewport_id();
let mut input = self.state.take_egui_input(&self.window); 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| { let mut output = self.ctx.run_ui(input, |ui| {
self.app.show(ui); self.app.show(ui);
}); });
let clipped_primitives = self.ctx.tessellate(output.shapes, output.pixels_per_point); let clipped_primitives = self.ctx.tessellate(output.shapes, output.pixels_per_point);
self.painter.paint_and_update_textures( self.painter.paint_and_update_textures(
ViewportId::ROOT, viewport_id,
output.pixels_per_point, output.pixels_per_point,
[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0],
&clipped_primitives, &clipped_primitives,
@ -551,14 +559,19 @@ impl Viewport {
self.state self.state
.handle_platform_output(&self.window, output.platform_output); .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); return Some(Action::Close);
}; };
let (mut deferred_commands, recreate) = self.builder.patch(viewport_output.builder); let (mut deferred_commands, recreate) = self.builder.patch(viewport_output.builder);
if recreate { if recreate {
let (window, state) = let (window, state) = create_window_and_state(
create_window_and_state(&self.ctx, event_loop, &self.builder, &mut self.painter); &self.ctx,
viewport_id,
event_loop,
&self.builder,
&mut self.painter,
);
egui_winit::update_viewport_info(&mut self.info, &self.ctx, &window, true); egui_winit::update_viewport_info(&mut self.info, &self.ctx, &window, true);
self.window = window; self.window = window;
self.state = state; self.state = state;
@ -613,16 +626,17 @@ pub enum Action {
fn create_window_and_state( fn create_window_and_state(
ctx: &Context, ctx: &Context,
viewport_id: ViewportId,
event_loop: &ActiveEventLoop, event_loop: &ActiveEventLoop,
builder: &ViewportBuilder, builder: &ViewportBuilder,
painter: &mut egui_wgpu::winit::Painter, painter: &mut egui_wgpu::winit::Painter,
) -> (Arc<Window>, egui_winit::State) { ) -> (Arc<Window>, 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()); 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( let state = egui_winit::State::new(
ctx.clone(), ctx.clone(),
ViewportId::ROOT, viewport_id,
event_loop, event_loop,
Some(window.scale_factor() as f32), Some(window.scale_factor() as f32),
event_loop.system_theme(), event_loop.system_theme(),