mirror of
https://github.com/emilk/egui.git
synced 2026-06-26 22:53:14 -04:00
Fix pixels per point for multiples viewports
Fix ./scripts/check.sh errors
This commit is contained in:
@@ -553,10 +553,11 @@ impl EpiIntegration {
|
||||
pub fn handle_platform_output(
|
||||
&mut self,
|
||||
window: &winit::window::Window,
|
||||
viewport_id: ViewportId,
|
||||
platform_output: egui::PlatformOutput,
|
||||
egui_winit: &mut egui_winit::State,
|
||||
) {
|
||||
egui_winit.handle_platform_output(window, &self.egui_ctx, platform_output);
|
||||
egui_winit.handle_platform_output(window, viewport_id, &self.egui_ctx, platform_output);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
@@ -992,30 +992,6 @@ mod glow_integration {
|
||||
#[cfg(feature = "wgpu")]
|
||||
None,
|
||||
);
|
||||
#[cfg(feature = "accesskit")]
|
||||
{
|
||||
let window = &glutin_ctx.viewports[&ViewportId::MAIN];
|
||||
let window = &mut *window.write();
|
||||
integration.init_accesskit(
|
||||
window.egui_winit.as_mut().unwrap(),
|
||||
&window.window.as_ref().unwrap().read(),
|
||||
self.repaint_proxy.lock().clone(),
|
||||
);
|
||||
}
|
||||
let theme = system_theme.unwrap_or(self.native_options.default_theme);
|
||||
integration.egui_ctx.set_visuals(theme.egui_visuals());
|
||||
|
||||
if self.native_options.mouse_passthrough {
|
||||
glutin_ctx
|
||||
.window(ViewportId::MAIN)
|
||||
.read()
|
||||
.window
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.read()
|
||||
.set_cursor_hittest(false)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
{
|
||||
let event_loop_proxy = self.repaint_proxy.clone();
|
||||
@@ -1036,6 +1012,32 @@ mod glow_integration {
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(feature = "accesskit")]
|
||||
{
|
||||
let event_loop_proxy = self.repaint_proxy.lock().clone();
|
||||
let window = &glutin_ctx.viewports[&ViewportId::MAIN];
|
||||
let window = &mut *window.write();
|
||||
integration.init_accesskit(
|
||||
window.egui_winit.as_mut().unwrap(),
|
||||
&window.window.as_ref().unwrap().read(),
|
||||
event_loop_proxy,
|
||||
);
|
||||
}
|
||||
let theme = system_theme.unwrap_or(self.native_options.default_theme);
|
||||
integration.egui_ctx.set_visuals(theme.egui_visuals());
|
||||
|
||||
if self.native_options.mouse_passthrough {
|
||||
glutin_ctx
|
||||
.window(ViewportId::MAIN)
|
||||
.read()
|
||||
.window
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.read()
|
||||
.set_cursor_hittest(false)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
let app_creator = std::mem::take(&mut self.app_creator)
|
||||
.expect("Single-use AppCreator has unexpectedly already been taken");
|
||||
let mut app;
|
||||
@@ -1172,7 +1174,7 @@ mod glow_integration {
|
||||
|
||||
let screen_size_in_pixels: [u32; 2] = win.inner_size().into();
|
||||
|
||||
let clipped_primitives = egui_ctx.tessellate(output.shapes);
|
||||
let clipped_primitives = egui_ctx.tessellate(output.shapes, pair.this);
|
||||
|
||||
glutin.current_gl_context = Some(
|
||||
glutin
|
||||
@@ -1197,9 +1199,10 @@ mod glow_integration {
|
||||
|
||||
egui_glow::painter::clear(gl, screen_size_in_pixels, [0.0, 0.0, 0.0, 0.0]);
|
||||
|
||||
let pixels_per_point = egui_ctx.input_for(pair.this, |i| i.pixels_per_point());
|
||||
painter.write().paint_and_update_textures(
|
||||
screen_size_in_pixels,
|
||||
egui_ctx.pixels_per_point(),
|
||||
pixels_per_point,
|
||||
&clipped_primitives,
|
||||
&output.textures_delta,
|
||||
);
|
||||
@@ -1214,7 +1217,7 @@ mod glow_integration {
|
||||
.as_ref()
|
||||
.expect("failed to get current context to swap buffers"),
|
||||
);
|
||||
winit_state.handle_platform_output(&win, egui_ctx, output.platform_output);
|
||||
winit_state.handle_platform_output(&win, pair.this, egui_ctx, output.platform_output);
|
||||
}
|
||||
|
||||
fn process_viewport_builders(
|
||||
@@ -1422,7 +1425,6 @@ mod glow_integration {
|
||||
|
||||
let control_flow;
|
||||
{
|
||||
// let window = gl_window.window(window_index);
|
||||
let win = glutin.read().viewports.get(&viewport_id).cloned();
|
||||
let win = win.unwrap();
|
||||
|
||||
@@ -1453,6 +1455,7 @@ mod glow_integration {
|
||||
|
||||
integration.write().handle_platform_output(
|
||||
&win.window.as_ref().unwrap().read(),
|
||||
viewport_id,
|
||||
platform_output,
|
||||
win.egui_winit.as_mut().unwrap(),
|
||||
);
|
||||
@@ -1460,7 +1463,7 @@ mod glow_integration {
|
||||
|
||||
let clipped_primitives = {
|
||||
crate::profile_scope!("tessellate");
|
||||
integration.read().egui_ctx.tessellate(shapes)
|
||||
integration.read().egui_ctx.tessellate(shapes, viewport_id)
|
||||
};
|
||||
{
|
||||
let mut gl_window = glutin.write();
|
||||
@@ -1485,9 +1488,14 @@ mod glow_integration {
|
||||
.clear_color(&integration.read().egui_ctx.style().visuals),
|
||||
);
|
||||
|
||||
let pixels_per_point = integration
|
||||
.read()
|
||||
.egui_ctx
|
||||
.input_for(viewport_id, |i| i.pixels_per_point());
|
||||
|
||||
painter.write().paint_and_update_textures(
|
||||
screen_size_in_pixels,
|
||||
integration.read().egui_ctx.pixels_per_point(),
|
||||
pixels_per_point,
|
||||
&clipped_primitives,
|
||||
&textures_delta,
|
||||
);
|
||||
@@ -2020,14 +2028,6 @@ mod wgpu_integration {
|
||||
wgpu_render_state.clone(),
|
||||
);
|
||||
|
||||
let mut state = egui_winit::State::new(event_loop);
|
||||
#[cfg(feature = "accesskit")]
|
||||
{
|
||||
integration.init_accesskit(&mut state, &window, self.repaint_proxy.lock().clone());
|
||||
}
|
||||
let theme = system_theme.unwrap_or(self.native_options.default_theme);
|
||||
integration.egui_ctx.set_visuals(theme.egui_visuals());
|
||||
|
||||
{
|
||||
let event_loop_proxy = self.repaint_proxy.clone();
|
||||
|
||||
@@ -2049,6 +2049,15 @@ mod wgpu_integration {
|
||||
});
|
||||
}
|
||||
|
||||
let mut state = egui_winit::State::new(event_loop);
|
||||
#[cfg(feature = "accesskit")]
|
||||
{
|
||||
let event_loop_proxy = self.repaint_proxy.lock().clone();
|
||||
integration.init_accesskit(&mut state, &window, event_loop_proxy);
|
||||
}
|
||||
let theme = system_theme.unwrap_or(self.native_options.default_theme);
|
||||
integration.egui_ctx.set_visuals(theme.egui_visuals());
|
||||
|
||||
let app_creator = std::mem::take(&mut self.app_creator)
|
||||
.expect("Single-use AppCreator has unexpectedly already been taken");
|
||||
let cc = epi::CreationContext {
|
||||
@@ -2204,17 +2213,18 @@ mod wgpu_integration {
|
||||
);
|
||||
}
|
||||
|
||||
let clipped_primitives = egui_ctx.tessellate(output.shapes);
|
||||
let pixels_per_point = egui_ctx.input_for(pair.this, |i| i.pixels_per_point());
|
||||
let clipped_primitives = egui_ctx.tessellate(output.shapes, pair.this);
|
||||
c_painter.write().paint_and_update_textures(
|
||||
pair.this,
|
||||
egui_ctx.pixels_per_point(),
|
||||
pixels_per_point,
|
||||
[0.0, 0.0, 0.0, 0.0],
|
||||
&clipped_primitives,
|
||||
&output.textures_delta,
|
||||
false,
|
||||
);
|
||||
|
||||
winit_state.handle_platform_output(&win, egui_ctx, output.platform_output);
|
||||
winit_state.handle_platform_output(&win, pair.this, egui_ctx, output.platform_output);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2341,21 +2351,26 @@ mod wgpu_integration {
|
||||
|
||||
integration.write().handle_platform_output(
|
||||
&window.read(),
|
||||
viewport_id,
|
||||
platform_output,
|
||||
state.write().as_mut().unwrap(),
|
||||
);
|
||||
|
||||
let clipped_primitives = {
|
||||
crate::profile_scope!("tessellate");
|
||||
integration.read().egui_ctx.tessellate(shapes)
|
||||
integration.read().egui_ctx.tessellate(shapes, viewport_id)
|
||||
};
|
||||
|
||||
let integration = &mut *integration.write();
|
||||
let screenshot_requested = &mut integration.frame.output.screenshot_requested;
|
||||
|
||||
let pixels_per_point = integration
|
||||
.egui_ctx
|
||||
.input_for(viewport_id, |i| i.pixels_per_point());
|
||||
|
||||
let screenshot = painter.write().paint_and_update_textures(
|
||||
viewport_id,
|
||||
integration.egui_ctx.pixels_per_point(),
|
||||
pixels_per_point,
|
||||
app.clear_color(&integration.egui_ctx.style().visuals),
|
||||
&clipped_primitives,
|
||||
&textures_delta,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use egui::TexturesDelta;
|
||||
use egui::ViewportIdPair;
|
||||
use egui::{ViewportId, ViewportIdPair};
|
||||
use wasm_bindgen::JsValue;
|
||||
|
||||
use crate::{epi, App};
|
||||
@@ -195,7 +195,7 @@ impl AppRunner {
|
||||
|
||||
self.handle_platform_output(platform_output);
|
||||
self.textures_delta.append(textures_delta);
|
||||
let clipped_primitives = self.egui_ctx.tessellate(shapes);
|
||||
let clipped_primitives = self.egui_ctx.tessellate(shapes, ViewportId::MAIN);
|
||||
|
||||
{
|
||||
let app_output = self.frame.take_app_output();
|
||||
|
||||
@@ -49,10 +49,10 @@ puffin = ["dep:puffin", "egui/puffin"]
|
||||
serde = ["egui/serde", "dep:serde"]
|
||||
|
||||
## Enables Wayland support.
|
||||
wayland = ["winit/wayland"]
|
||||
wayland = ["winit/wayland", "bytemuck"]
|
||||
|
||||
## Enables compiling for x11.
|
||||
x11 = ["winit/x11"]
|
||||
x11 = ["winit/x11", "bytemuck"]
|
||||
|
||||
[dependencies]
|
||||
egui = { version = "0.23.0", path = "../egui", default-features = false, features = [
|
||||
|
||||
@@ -706,6 +706,7 @@ impl State {
|
||||
pub fn handle_platform_output(
|
||||
&mut self,
|
||||
window: &winit::window::Window,
|
||||
viewport_id: ViewportId,
|
||||
egui_ctx: &egui::Context,
|
||||
platform_output: egui::PlatformOutput,
|
||||
) {
|
||||
@@ -719,7 +720,7 @@ impl State {
|
||||
#[cfg(feature = "accesskit")]
|
||||
accesskit_update,
|
||||
} = platform_output;
|
||||
self.current_pixels_per_point = egui_ctx.pixels_per_point(); // someone can have changed it to scale the UI
|
||||
self.current_pixels_per_point = egui_ctx.input_for(viewport_id, |i| i.pixels_per_point); // someone can have changed it to scale the UI
|
||||
|
||||
self.set_cursor_icon(window, cursor_icon);
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ impl Repaint {
|
||||
};
|
||||
(callback)(info);
|
||||
} else {
|
||||
log::warn!("request_repaint_callback is not implemented by egui integration!\nIf is your integration you need to call `Context::set_request_repaint_callback`");
|
||||
eprint!("request_repaint_callback is not implemented by egui integration!\nIf is your integration you need to call `Context::set_request_repaint_callback`");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,15 +213,12 @@ impl ContextImpl {
|
||||
|
||||
if let Some(new_pixels_per_point) = self.memory.override_pixels_per_point {
|
||||
if self
|
||||
.memory
|
||||
.pixels_per_point_viewports
|
||||
.input
|
||||
.get(&pair)
|
||||
.map_or(true, |pixels| *pixels != new_pixels_per_point)
|
||||
.map(|input| input.pixels_per_point)
|
||||
.map_or(true, |pixels| pixels != new_pixels_per_point)
|
||||
{
|
||||
new_raw_input.pixels_per_point = Some(new_pixels_per_point);
|
||||
self.memory
|
||||
.pixels_per_point_viewports
|
||||
.insert(pair.this, new_pixels_per_point);
|
||||
|
||||
let input = self.input.entry(pair.this).or_default();
|
||||
// This is a bit hacky, but is required to avoid jitter:
|
||||
@@ -230,7 +227,6 @@ impl ContextImpl {
|
||||
rect.min = (ratio * rect.min.to_vec2()).to_pos2();
|
||||
rect.max = (ratio * rect.max.to_vec2()).to_pos2();
|
||||
new_raw_input.screen_rect = Some(rect);
|
||||
self.repaint.request_repaint_settle(pair.this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -409,7 +405,7 @@ impl ContextImpl {
|
||||
/// });
|
||||
/// });
|
||||
/// handle_platform_output(full_output.platform_output);
|
||||
/// let clipped_primitives = ctx.tessellate(full_output.shapes); // create triangles to paint
|
||||
/// let clipped_primitives = ctx.tessellate(full_output.shapes, egui::ViewportId::MAIN); // create triangles to paint
|
||||
/// paint(full_output.textures_delta, clipped_primitives);
|
||||
/// }
|
||||
/// ```
|
||||
@@ -1645,9 +1641,6 @@ impl Context {
|
||||
.retain(|id, _| avalibile_viewports.contains(id));
|
||||
ctx.graphics
|
||||
.retain(|id, _| avalibile_viewports.contains(id));
|
||||
ctx.memory
|
||||
.pixels_per_point_viewports
|
||||
.retain(|id, _| avalibile_viewports.contains(id));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1679,7 +1672,11 @@ impl Context {
|
||||
}
|
||||
|
||||
/// Tessellate the given shapes into triangle meshes.
|
||||
pub fn tessellate(&self, shapes: Vec<ClippedShape>) -> Vec<ClippedPrimitive> {
|
||||
pub fn tessellate(
|
||||
&self,
|
||||
shapes: Vec<ClippedShape>,
|
||||
viewport_id: ViewportId,
|
||||
) -> Vec<ClippedPrimitive> {
|
||||
crate::profile_function!();
|
||||
|
||||
// A tempting optimization is to reuse the tessellation from last frame if the
|
||||
@@ -1687,12 +1684,8 @@ impl Context {
|
||||
// it takes to tessellate them, so it is not a worth optimization.
|
||||
|
||||
// here we expect that we are the only user of context, since frame is ended
|
||||
let pixels_per_point = self.input_for(viewport_id, |i| i.pixels_per_point());
|
||||
self.write(|ctx| {
|
||||
let pixels_per_point = ctx
|
||||
.input
|
||||
.entry(ctx.viewport_id())
|
||||
.or_default()
|
||||
.pixels_per_point();
|
||||
let tessellation_options = ctx.memory.options.tessellation_options;
|
||||
let texture_atlas = ctx
|
||||
.fonts
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
//! });
|
||||
//! });
|
||||
//! handle_platform_output(full_output.platform_output);
|
||||
//! let clipped_primitives = ctx.tessellate(full_output.shapes); // create triangles to paint
|
||||
//! let clipped_primitives = ctx.tessellate(full_output.shapes, egui::ViewportId::MAIN); // create triangles to paint
|
||||
//! paint(full_output.textures_delta, clipped_primitives);
|
||||
//! }
|
||||
//! ```
|
||||
|
||||
@@ -72,9 +72,6 @@ pub struct Memory {
|
||||
#[cfg_attr(feature = "persistence", serde(skip))]
|
||||
pub(crate) override_pixels_per_point: Option<f32>,
|
||||
|
||||
#[cfg_attr(feature = "persistence", serde(skip))]
|
||||
pub(crate) pixels_per_point_viewports: HashMap<ViewportId, f32>,
|
||||
|
||||
/// new fonts that will be applied at the start of the next frame
|
||||
#[cfg_attr(feature = "persistence", serde(skip))]
|
||||
pub(crate) new_font_definitions: Option<epaint::text::FontDefinitions>,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use criterion::{criterion_group, criterion_main, Criterion};
|
||||
|
||||
use egui::{epaint::TextShape, ViewportIdPair};
|
||||
use egui::{epaint::TextShape, ViewportId, ViewportIdPair};
|
||||
use egui_demo_lib::LOREM_IPSUM_LONG;
|
||||
|
||||
pub fn criterion_benchmark(c: &mut Criterion) {
|
||||
@@ -16,7 +16,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
|
||||
let full_output = ctx.run(RawInput::default(), ViewportIdPair::MAIN, |ctx| {
|
||||
demo_windows.ui(ctx);
|
||||
});
|
||||
ctx.tessellate(full_output.shapes)
|
||||
ctx.tessellate(full_output.shapes, ViewportId::MAIN)
|
||||
});
|
||||
});
|
||||
|
||||
@@ -32,7 +32,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
|
||||
demo_windows.ui(ctx);
|
||||
});
|
||||
c.bench_function("demo_only_tessellate", |b| {
|
||||
b.iter(|| ctx.tessellate(full_output.shapes.clone()));
|
||||
b.iter(|| ctx.tessellate(full_output.shapes.clone(), ViewportId::MAIN));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ pub mod easy_mark;
|
||||
pub use color_test::ColorTest;
|
||||
pub use demo::DemoWindows;
|
||||
#[cfg(test)]
|
||||
use egui::ViewportIdPair;
|
||||
use egui::{ViewportId, ViewportIdPair};
|
||||
|
||||
/// View some Rust code with syntax highlighting and selection.
|
||||
pub(crate) fn rust_view_ui(ui: &mut egui::Ui, code: &str) {
|
||||
@@ -79,7 +79,7 @@ fn test_egui_e2e() {
|
||||
let full_output = ctx.run(raw_input.clone(), ViewportIdPair::MAIN, |ctx| {
|
||||
demo_windows.ui(ctx);
|
||||
});
|
||||
let clipped_primitives = ctx.tessellate(full_output.shapes);
|
||||
let clipped_primitives = ctx.tessellate(full_output.shapes, ViewportId::MAIN);
|
||||
assert!(!clipped_primitives.is_empty());
|
||||
}
|
||||
}
|
||||
@@ -98,7 +98,7 @@ fn test_egui_zero_window_size() {
|
||||
let full_output = ctx.run(raw_input.clone(), ViewportIdPair::MAIN, |ctx| {
|
||||
demo_windows.ui(ctx);
|
||||
});
|
||||
let clipped_primitives = ctx.tessellate(full_output.shapes);
|
||||
let clipped_primitives = ctx.tessellate(full_output.shapes, ViewportId::MAIN);
|
||||
assert!(
|
||||
clipped_primitives.is_empty(),
|
||||
"There should be nothing to show, has at least one primitive with clip_rect: {:?}",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use crate::shader_version::ShaderVersion;
|
||||
use egui::ViewportIdPair;
|
||||
use egui::{ViewportId, ViewportIdPair};
|
||||
pub use egui_winit;
|
||||
use egui_winit::winit;
|
||||
pub use egui_winit::EventResponse;
|
||||
@@ -52,8 +52,12 @@ impl EguiGlow {
|
||||
..
|
||||
} = self.egui_ctx.run(raw_input, ViewportIdPair::MAIN, run_ui);
|
||||
|
||||
self.egui_winit
|
||||
.handle_platform_output(window, &self.egui_ctx, platform_output);
|
||||
self.egui_winit.handle_platform_output(
|
||||
window,
|
||||
ViewportId::MAIN,
|
||||
&self.egui_ctx,
|
||||
platform_output,
|
||||
);
|
||||
|
||||
self.shapes = shapes;
|
||||
self.textures_delta.append(textures_delta);
|
||||
@@ -68,7 +72,7 @@ impl EguiGlow {
|
||||
self.painter.set_texture(id, &image_delta);
|
||||
}
|
||||
|
||||
let clipped_primitives = self.egui_ctx.tessellate(shapes);
|
||||
let clipped_primitives = self.egui_ctx.tessellate(shapes, ViewportId::MAIN);
|
||||
let dimensions: [u32; 2] = window.inner_size().into();
|
||||
self.painter.paint_primitives(
|
||||
dimensions,
|
||||
|
||||
@@ -37,7 +37,7 @@ cargo doc --document-private-items --no-deps --all-features
|
||||
(cd crates/egui_extras && cargo check --no-default-features)
|
||||
(cd crates/egui_glow && cargo check --no-default-features)
|
||||
(cd crates/egui-winit && cargo check --no-default-features --features "wayland")
|
||||
(cd crates/egui-winit && cargo check --no-default-features --features "winit/x11")
|
||||
(cd crates/egui-winit && cargo check --no-default-features --features "x11")
|
||||
(cd crates/emath && cargo check --no-default-features)
|
||||
(cd crates/epaint && cargo check --no-default-features --release)
|
||||
(cd crates/epaint && cargo check --no-default-features)
|
||||
|
||||
Reference in New Issue
Block a user