From 0b9bb5f494bb033b9db1a5576efb8dfe3288001e Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 5 Nov 2025 10:35:57 +0100 Subject: [PATCH] Make sure `native_pixels_per_point` is set during app creation (#7683) Useful for things like analytics --- crates/eframe/src/native/glow_integration.rs | 18 ++++++++++++++--- crates/eframe/src/native/wgpu_integration.rs | 21 ++++++++++++++++---- crates/eframe/src/web/app_runner.rs | 8 ++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/crates/eframe/src/native/glow_integration.rs b/crates/eframe/src/native/glow_integration.rs index 4a3bee46..b4267405 100644 --- a/crates/eframe/src/native/glow_integration.rs +++ b/crates/eframe/src/native/glow_integration.rs @@ -1041,11 +1041,23 @@ impl GlutinWindowContext { let mut viewport_from_window = HashMap::default(); let mut window_from_viewport = OrderedViewportIdMap::default(); - let mut info = ViewportInfo::default(); + let mut viewport_info = ViewportInfo::default(); if let Some(window) = &window { viewport_from_window.insert(window.id(), ViewportId::ROOT); window_from_viewport.insert(ViewportId::ROOT, window.id()); - egui_winit::update_viewport_info(&mut info, egui_ctx, window, true); + egui_winit::update_viewport_info(&mut viewport_info, egui_ctx, window, true); + + // Tell egui right away about native_pixels_per_point etc, + // so that the app knows about it during app creation: + let pixels_per_point = egui_winit::pixels_per_point(egui_ctx, window); + + egui_ctx.input_mut(|i| { + i.raw + .viewports + .insert(ViewportId::ROOT, viewport_info.clone()); + + i.pixels_per_point = pixels_per_point; + }); } let mut viewports = OrderedViewportIdMap::default(); @@ -1056,7 +1068,7 @@ impl GlutinWindowContext { class: ViewportClass::Root, builder: viewport_builder, deferred_commands: vec![], - info, + info: viewport_info, actions_requested: Default::default(), viewport_ui_cb: None, gl_surface: None, diff --git a/crates/eframe/src/native/wgpu_integration.rs b/crates/eframe/src/native/wgpu_integration.rs index b21b62ac..c6c715c8 100644 --- a/crates/eframe/src/native/wgpu_integration.rs +++ b/crates/eframe/src/native/wgpu_integration.rs @@ -199,6 +199,22 @@ impl<'app> WgpuWinitApp<'app> { }, )); + let mut viewport_info = ViewportInfo::default(); + egui_winit::update_viewport_info(&mut viewport_info, &egui_ctx, &window, true); + + { + // Tell egui right away about native_pixels_per_point etc, + // so that the app knows about it during app creation: + let pixels_per_point = egui_winit::pixels_per_point(&egui_ctx, &window); + + egui_ctx.input_mut(|i| { + i.raw + .viewports + .insert(ViewportId::ROOT, viewport_info.clone()); + i.pixels_per_point = pixels_per_point; + }); + } + let window = Arc::new(window); { @@ -278,9 +294,6 @@ impl<'app> WgpuWinitApp<'app> { let mut viewport_from_window = HashMap::default(); viewport_from_window.insert(window.id(), ViewportId::ROOT); - let mut info = ViewportInfo::default(); - egui_winit::update_viewport_info(&mut info, &egui_ctx, &window, true); - let mut viewports = Viewports::default(); viewports.insert( ViewportId::ROOT, @@ -289,7 +302,7 @@ impl<'app> WgpuWinitApp<'app> { class: ViewportClass::Root, builder, deferred_commands: vec![], - info, + info: viewport_info, actions_requested: Default::default(), viewport_ui_cb: None, window: Some(window), diff --git a/crates/eframe/src/web/app_runner.rs b/crates/eframe/src/web/app_runner.rs index bd245a1f..4a97235a 100644 --- a/crates/eframe/src/web/app_runner.rs +++ b/crates/eframe/src/web/app_runner.rs @@ -65,6 +65,14 @@ impl AppRunner { o.zoom_factor = 1.0; }); + // Tell egui right away about native_pixels_per_point + // so that the app knows about it during app creation: + egui_ctx.input_mut(|i| { + let viewport_info = i.raw.viewports.entry(egui::ViewportId::ROOT).or_default(); + viewport_info.native_pixels_per_point = Some(super::native_pixels_per_point()); + i.pixels_per_point = super::native_pixels_per_point(); + }); + let cc = epi::CreationContext { egui_ctx: egui_ctx.clone(), integration_info: info.clone(),