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
.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<Action> {
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<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());
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(),