diff --git a/crates/eframe/src/epi/mod.rs b/crates/eframe/src/epi/mod.rs index fab7f43c1..524ae7306 100644 --- a/crates/eframe/src/epi/mod.rs +++ b/crates/eframe/src/epi/mod.rs @@ -113,12 +113,7 @@ pub trait App { /// The [`egui::Context`] can be cloned and saved if you like. /// /// To force a repaint, call [`egui::Context::request_repaint`] at any time (e.g. from another thread). - fn update( - &mut self, - ctx: &egui::Context, - frame: &mut Frame, - render_function: Option<&ViewportRender>, - ); + fn update(&mut self, ctx: &egui::Context, frame: &mut Frame, render: Option<&ViewportRender>); /// Get a handle to the app. /// @@ -818,7 +813,7 @@ impl Frame { /// struct MyApp; /// /// impl eframe::App for MyApp { - /// fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { + /// fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame, _render: Option<&egui::ViewportRender>) { /// // In real code the app would render something here /// frame.request_screenshot(); /// // Things that are added to the frame after the call to diff --git a/crates/eframe/src/lib.rs b/crates/eframe/src/lib.rs index 70ee336f4..44e7bdb3c 100644 --- a/crates/eframe/src/lib.rs +++ b/crates/eframe/src/lib.rs @@ -32,7 +32,7 @@ //! } //! //! impl eframe::App for MyEguiApp { -//! fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { +//! fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame, _render: Option<&egui::ViewportRender>) { //! egui::CentralPanel::default().show(ctx, |ui| { //! ui.heading("Hello World!"); //! }); @@ -187,7 +187,7 @@ mod native; /// } /// /// impl eframe::App for MyEguiApp { -/// fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { +/// fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame, _render: Option<&egui::ViewportRender>) { /// egui::CentralPanel::default().show(ctx, |ui| { /// ui.heading("Hello World!"); /// }); diff --git a/crates/eframe/src/native/epi_integration.rs b/crates/eframe/src/native/epi_integration.rs index 51d337e52..0765cb8b1 100644 --- a/crates/eframe/src/native/epi_integration.rs +++ b/crates/eframe/src/native/epi_integration.rs @@ -7,8 +7,6 @@ use winit::platform::macos::WindowBuilderExtMacOS as _; use raw_window_handle::{HasRawDisplayHandle as _, HasRawWindowHandle as _}; -#[cfg(feature = "accesskit")] -use egui::accesskit; use egui::{mutex::RwLock, NumExt as _, ViewportBuilder, ViewportId, ViewportRender}; #[cfg(feature = "accesskit")] use egui_winit::accesskit_winit; @@ -24,13 +22,6 @@ pub struct WindowState { pub maximized: bool, } -pub fn points_to_size(points: egui::Vec2) -> winit::dpi::LogicalSize { - winit::dpi::LogicalSize { - width: points.x as f64, - height: points.y as f64, - } -} - pub fn read_window_info( window: &winit::window::Window, pixels_per_point: f32, @@ -126,7 +117,6 @@ pub fn window_builder( #[cfg(all(feature = "wayland", target_os = "linux"))] { - use winit::platform::wayland::WindowBuilderExtWayland as _; match &native_options.app_id { Some(app_id) => window_builder = window_builder.with_name(app_id, ""), None => window_builder = window_builder.with_name(title, ""), @@ -217,28 +207,6 @@ fn largest_monitor_point_size(event_loop: &EventLoopWindowTarget) -> egui: } } -pub fn load_icon(icon_data: epi::IconData) -> Option { - winit::window::Icon::from_rgba(icon_data.rgba, icon_data.width, icon_data.height).ok() -} - -#[cfg(target_os = "windows")] -fn window_builder_drag_and_drop( - window_builder: winit::window::WindowBuilder, - enable: bool, -) -> winit::window::WindowBuilder { - use winit::platform::windows::WindowBuilderExtWindows as _; - window_builder.with_drag_and_drop(enable) -} - -#[cfg(not(target_os = "windows"))] -fn window_builder_drag_and_drop( - window_builder: winit::window::WindowBuilder, - _enable: bool, -) -> winit::window::WindowBuilder { - // drag and drop can only be disabled on windows - window_builder -} - pub fn handle_app_output( window: &winit::window::Window, current_pixels_per_point: f32, @@ -359,9 +327,7 @@ pub struct EpiIntegration { impl EpiIntegration { #[allow(clippy::too_many_arguments)] - pub fn new( - event_loop: &EventLoopWindowTarget, - max_texture_side: usize, + pub fn new( window: &winit::window::Window, system_theme: Option, app_name: &str, @@ -455,7 +421,7 @@ impl EpiIntegration { app, window, egui_winit, - None, + &None, ViewportId::MAIN, ViewportId::MAIN, ); @@ -473,7 +439,6 @@ impl EpiIntegration { &mut self, app: &mut dyn epi::App, event: &winit::event::WindowEvent<'_>, - window_id: &winit::window::WindowId, egui_winit: &mut egui_winit::State, viewport_id: ViewportId, ) -> EventResponse { @@ -508,22 +473,12 @@ impl EpiIntegration { egui_winit.on_event(&self.egui_ctx, event) } - #[cfg(feature = "accesskit")] - pub fn on_accesskit_action_request( - &mut self, - request: accesskit::ActionRequest, - window_id: &winit::window::WindowId, - egui_winit: &mut egui_winit::State, - ) { - egui_winit.on_accesskit_action_request(request); - } - pub fn update( &mut self, app: &mut dyn epi::App, window: &winit::window::Window, egui_winit: &mut egui_winit::State, - render: Option>>, + render: &Option>>, viewport_id: egui::ViewportId, parent_id: egui::ViewportId, ) -> egui::FullOutput { diff --git a/crates/eframe/src/native/run.rs b/crates/eframe/src/native/run.rs index 3547722f8..ecd487038 100644 --- a/crates/eframe/src/native/run.rs +++ b/crates/eframe/src/native/run.rs @@ -413,9 +413,7 @@ fn run_and_exit(event_loop: EventLoop, mut winit_app: impl WinitApp + mod glow_integration { use std::sync::Arc; - use egui::{ - epaint::ahash::HashMap, mutex::RwLock, NumExt as _, ViewportBuilder, ViewportRender, - }; + use egui::{epaint::ahash::HashMap, mutex::RwLock, NumExt as _, ViewportRender}; use egui_winit::{ changes_between_builders, create_winit_window_builder, process_viewport_commands, EventResponse, @@ -882,8 +880,6 @@ mod glow_integration { &self.native_options, ); let mut integration = epi_integration::EpiIntegration::new( - event_loop, - painter.max_texture_side(), &gl_window .window(ViewportId::MAIN) .read() @@ -996,7 +992,8 @@ mod glow_integration { // Sync Rendering integration.egui_ctx.set_render_sync_callback( - move |viewport_builder, viewport_id, parent_viewport_id, render| { + move |_viewport_builder, viewport_id, parent_viewport_id, render| { + // TODO: we should use `_viewport_builder` to create a new window in this frame! 'try_render: { let window = glutin.read().windows.get(&viewport_id).cloned(); if let Some(window) = window { @@ -1121,7 +1118,7 @@ mod glow_integration { w.parent_id = *id; } if let Some(w) = w.window.clone() { - process_viewport_commands(commands, *id, None, w); + process_viewport_commands(commands, *id, None, &w); } active_viewports_ids.push(*id); false @@ -1302,7 +1299,7 @@ mod glow_integration { app.write().as_mut(), &win.window.as_ref().unwrap().read(), win.egui_winit.as_mut().unwrap(), - win.render.clone(), + &win.render.clone(), win.window_id, win.parent_id, ); @@ -1623,7 +1620,6 @@ mod glow_integration { break 'res running.integration.write().on_event( running.app.write().as_mut(), event, - window_id, viewport.egui_winit.as_mut().unwrap(), viewport.window_id, ); @@ -1660,11 +1656,11 @@ mod glow_integration { if let Some(viewport_id) = glutin_ctx.window_maps.get(window_id).copied() { if let Some(viewport) = glutin_ctx.windows.get(&viewport_id).cloned() { let mut viewport = viewport.write(); - running.integration.write().on_accesskit_action_request( - request.clone(), - window_id, - viewport.egui_winit.as_mut().unwrap(), - ); + viewport + .egui_winit + .as_mut() + .unwrap() + .on_accesskit_action_request(request.clone()); } } // As a form of user input, accessibility actions should @@ -1884,8 +1880,6 @@ mod wgpu_integration { let system_theme = system_theme(&window, &self.native_options); let mut integration = epi_integration::EpiIntegration::new( - event_loop, - painter.max_texture_side().unwrap_or(2048), &window, system_theme, &self.app_name, @@ -1972,7 +1966,8 @@ mod wgpu_integration { let _painter = painter.clone(); integration.egui_ctx.set_render_sync_callback( - move |viewport_builder, viewport_id, parent_viewport_id, render| { + move |_viewport_builder, viewport_id, parent_viewport_id, render| { + // TODO: we should use `_viewport_builder` to create a new window in this frame! 'try_render: { let window = _windows.read().get(&viewport_id).cloned(); if let Some(window) = window { @@ -2179,7 +2174,7 @@ mod wgpu_integration { app.as_mut(), &window.read(), state.write().as_mut().unwrap(), - render.clone(), + &render.clone(), viewport_id, parent_viewport_id, ); @@ -2424,7 +2419,6 @@ mod wgpu_integration { Some(running.integration.write().on_event( running.app.as_mut(), event, - window_id, state, id, )) @@ -2465,11 +2459,7 @@ mod wgpu_integration { .and_then(|id| running.windows.read().get(id).cloned()) { if let Some(state) = &mut *state.write() { - running.integration.write().on_accesskit_action_request( - request.clone(), - window_id, - state, - ); + state.on_accesskit_action_request(request.clone()); } } // As a form of user input, accessibility actions should @@ -2523,9 +2513,3 @@ fn system_theme(window: &winit::window::Window, options: &NativeOptions) -> Opti None } } - -// ---------------------------------------------------------------------------- - -fn extremely_far_future() -> std::time::Instant { - std::time::Instant::now() + std::time::Duration::from_secs(10_000_000_000) -} diff --git a/crates/eframe/src/web/app_runner.rs b/crates/eframe/src/web/app_runner.rs index 7359bae4a..0981b59c9 100644 --- a/crates/eframe/src/web/app_runner.rs +++ b/crates/eframe/src/web/app_runner.rs @@ -1,4 +1,5 @@ use egui::TexturesDelta; +use egui::ViewportId; use wasm_bindgen::JsValue; use crate::{epi, App}; @@ -178,9 +179,11 @@ impl AppRunner { let canvas_size = super::canvas_size_in_points(self.canvas_id()); let raw_input = self.input.new_frame(canvas_size); - let full_output = self.egui_ctx.run(raw_input, 0, 0, |egui_ctx| { - self.app.update(egui_ctx, &mut self.frame, None); - }); + let full_output = + self.egui_ctx + .run(raw_input, ViewportId::MAIN, ViewportId::MAIN, |egui_ctx| { + self.app.update(egui_ctx, &mut self.frame, None); + }); let egui::FullOutput { platform_output, repaint_after, diff --git a/crates/egui-wgpu/src/winit.rs b/crates/egui-wgpu/src/winit.rs index 66f60b08a..f4a6b0741 100644 --- a/crates/egui-wgpu/src/winit.rs +++ b/crates/egui-wgpu/src/winit.rs @@ -194,70 +194,66 @@ impl Painter { viewport_id: ViewportId, window: Option<&winit::window::Window>, ) -> Result<(), crate::WgpuError> { - match window { - Some(window) => { - let size = window.inner_size(); - if self.surfaces.get(&viewport_id).is_none() { - let surface = unsafe { self.instance.create_surface(&window)? }; + if let Some(window) = window { + let size = window.inner_size(); + if self.surfaces.get(&viewport_id).is_none() { + let surface = unsafe { self.instance.create_surface(&window)? }; - let render_state = if let Some(render_state) = &self.render_state { - render_state - } else { - let render_state = RenderState::create( - &self.configuration, - &self.instance, - &surface, - self.depth_format, - self.msaa_samples, - ) - .await?; - self.render_state.get_or_insert(render_state) - }; - - let alpha_mode = if self.support_transparent_backbuffer { - let supported_alpha_modes = - surface.get_capabilities(&render_state.adapter).alpha_modes; - - // Prefer pre multiplied over post multiplied! - if supported_alpha_modes.contains(&wgpu::CompositeAlphaMode::PreMultiplied) - { - wgpu::CompositeAlphaMode::PreMultiplied - } else if supported_alpha_modes - .contains(&wgpu::CompositeAlphaMode::PostMultiplied) - { - wgpu::CompositeAlphaMode::PostMultiplied - } else { - log::warn!("Transparent window was requested, but the active wgpu surface does not support a `CompositeAlphaMode` with transparency."); - wgpu::CompositeAlphaMode::Auto - } + let render_state = if let Some(render_state) = &self.render_state { + render_state + } else { + let render_state = RenderState::create( + &self.configuration, + &self.instance, + &surface, + self.depth_format, + self.msaa_samples, + ) + .await?; + self.render_state.get_or_insert(render_state) + }; + + let alpha_mode = if self.support_transparent_backbuffer { + let supported_alpha_modes = + surface.get_capabilities(&render_state.adapter).alpha_modes; + + // Prefer pre multiplied over post multiplied! + if supported_alpha_modes.contains(&wgpu::CompositeAlphaMode::PreMultiplied) { + wgpu::CompositeAlphaMode::PreMultiplied + } else if supported_alpha_modes + .contains(&wgpu::CompositeAlphaMode::PostMultiplied) + { + wgpu::CompositeAlphaMode::PostMultiplied } else { + log::warn!("Transparent window was requested, but the active wgpu surface does not support a `CompositeAlphaMode` with transparency."); wgpu::CompositeAlphaMode::Auto - }; + } + } else { + wgpu::CompositeAlphaMode::Auto + }; - let supports_screenshot = - !matches!(render_state.adapter.get_info().backend, wgpu::Backend::Gl); + let supports_screenshot = + !matches!(render_state.adapter.get_info().backend, wgpu::Backend::Gl); - self.surfaces.insert( - viewport_id, - SurfaceState { - surface, - width: size.width, - height: size.height, - alpha_mode, - supports_screenshot, - }, - ); - } - self.resize_and_generate_depth_texture_view_and_msaa_view( + self.surfaces.insert( viewport_id, - size.width, - size.height, + SurfaceState { + surface, + width: size.width, + height: size.height, + alpha_mode, + supports_screenshot, + }, ); } - None => { - log::warn!("All surfaces was deleted!"); - self.surfaces.clear(); - } + self.resize_and_generate_depth_texture_view_and_msaa_view( + viewport_id, + size.width, + size.height, + ); + } else { + log::warn!("All surfaces was deleted!"); + self.surfaces.clear(); } Ok(()) } diff --git a/crates/egui-winit/src/lib.rs b/crates/egui-winit/src/lib.rs index 2c124b985..c09329d16 100644 --- a/crates/egui-winit/src/lib.rs +++ b/crates/egui-winit/src/lib.rs @@ -915,7 +915,7 @@ pub fn process_viewport_commands( commands: Vec, viewport_id: ViewportId, focused: Option, - window: Arc>, + window: &Arc>, ) { use winit::dpi::PhysicalSize; use winit::window::ResizeDirection; @@ -1025,14 +1025,18 @@ pub fn process_viewport_commands( })), ViewportCommand::ContentProtected(v) => win.set_content_protected(v), ViewportCommand::CursorPosition(x, y) => { - win.set_cursor_position(LogicalPosition::new(x, y)); + if let Err(err) = win.set_cursor_position(LogicalPosition::new(x, y)) { + log::error!("{err}"); + } } ViewportCommand::CursorGrab(o) => { - win.set_cursor_grab(match o { + if let Err(err) = win.set_cursor_grab(match o { 1 => CursorGrabMode::Confined, 2 => CursorGrabMode::Locked, _ => CursorGrabMode::None, - }); + }) { + log::error!("{err}"); + } } ViewportCommand::CursorVisible(v) => win.set_cursor_visible(v), ViewportCommand::CursorHitTest(v) => { @@ -1051,7 +1055,7 @@ pub fn process_viewports_commands( ) { for (viewport_id, command) in commands { if let Some(window) = get_window(viewport_id) { - process_viewport_commands(vec![command], viewport_id, focused, window); + process_viewport_commands(vec![command], viewport_id, focused, &window); } } } @@ -1113,6 +1117,18 @@ pub fn create_winit_window_builder(builder: &ViewportBuilder) -> winit::window:: )); } + #[cfg(all(feature = "wayland", target_os = "linux"))] + if let Some(name) = builder.name.clone() { + use winit::platform::wayland::WindowBuilderExtWayland as _; + window_builder = window_builder.with_name(name.0, name.1); + } + + #[cfg(target_os = "windows")] + if let Some(drag_and_drop) = builder.drag_and_drop { + use winit::platform::windows::WindowBuilderExtWindows as _; + window_builder = window_builder.with_drag_and_drop(enable); + } + // TODO: implement `ViewportBuilder::hittest` // Is not implemented because winit in his current state will not allow to set cursor_hittest on a `WindowBuilder` diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index 63a24a258..5354da7fc 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -987,7 +987,7 @@ impl<'open> Window<'open> { } }); }) - .map_or((None, None), |ir| (Some(ir.inner), Some(ir.response))); + .map_or((None, None), |ir| (Some(()), Some(ir.response))); if let Some(content_response) = &content_response { size = content_response.rect.size(); } @@ -1167,7 +1167,7 @@ impl<'open> Window<'open> { } }); }) - .map_or((None, None), |ir| (Some(ir.inner), Some(ir.response))); + .map_or((None, None), |ir| (Some(()), Some(ir.response))); if let Some(content_response) = &content_response { size = content_response.rect.size(); } diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 398934438..53f5394ce 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -435,7 +435,7 @@ impl ContextImpl { /// // Game loop: /// loop { /// let raw_input = egui::RawInput::default(); -/// let full_output = ctx.run(raw_input, |ctx| { +/// let full_output = ctx.run(raw_input, egui::ViewportId::MAIN, egui::ViewportId::MAIN, |ctx| { /// egui::CentralPanel::default().show(&ctx, |ui| { /// ui.label("Hello world!"); /// if ui.button("Click me").clicked() { @@ -504,7 +504,7 @@ impl Context { /// /// // Each frame: /// let input = egui::RawInput::default(); - /// let full_output = ctx.run(input, |ctx| { + /// let full_output = ctx.run(input, egui::ViewportId::MAIN, egui::ViewportId::MAIN, |ctx| { /// egui::CentralPanel::default().show(&ctx, |ui| { /// ui.label("Hello egui!"); /// }); @@ -532,7 +532,7 @@ impl Context { /// /// // Each frame: /// let input = egui::RawInput::default(); - /// ctx.begin_frame(input); + /// ctx.begin_frame(input, egui::ViewportId::MAIN, egui::ViewportId::MAIN); /// /// egui::CentralPanel::default().show(&ctx, |ui| { /// ui.label("Hello egui!"); diff --git a/crates/egui/src/lib.rs b/crates/egui/src/lib.rs index 0c22ea194..dd6a989c9 100644 --- a/crates/egui/src/lib.rs +++ b/crates/egui/src/lib.rs @@ -119,7 +119,7 @@ //! loop { //! let raw_input: egui::RawInput = gather_input(); //! -//! let full_output = ctx.run(raw_input, |ctx| { +//! let full_output = ctx.run(raw_input, egui::ViewportId::MAIN, egui::ViewportId::MAIN, |ctx| { //! egui::CentralPanel::default().show(&ctx, |ui| { //! ui.label("Hello world!"); //! if ui.button("Click me").clicked() { diff --git a/crates/egui_demo_app/src/apps/custom3d_wgpu.rs b/crates/egui_demo_app/src/apps/custom3d_wgpu.rs index 059330f5c..a3b193865 100644 --- a/crates/egui_demo_app/src/apps/custom3d_wgpu.rs +++ b/crates/egui_demo_app/src/apps/custom3d_wgpu.rs @@ -100,11 +100,11 @@ impl eframe::App for Custom3d { fn update( &mut self, ctx: &egui::Context, - frame: &mut eframe::Frame, + _frame: &mut eframe::Frame, render: Option<&ViewportRender>, ) { if let Some(render) = render { - render(ctx, ctx.get_viewport_id(), ctx.get_parent_viewport_id()); + render(ctx); return; } egui::CentralPanel::default().show(ctx, |ui| { diff --git a/crates/egui_demo_app/src/backend_panel.rs b/crates/egui_demo_app/src/backend_panel.rs index 40d79e3fc..a7653a0af 100644 --- a/crates/egui_demo_app/src/backend_panel.rs +++ b/crates/egui_demo_app/src/backend_panel.rs @@ -433,7 +433,6 @@ impl EguiWindows { tmp_ctx.memory_ui(ui); }); - let tmp_output_event_history = output_event_history.clone(); egui::Window::new("📤 Output Events") .open(output_events) .resizable(true) diff --git a/crates/egui_glow/src/winit.rs b/crates/egui_glow/src/winit.rs index 3185c7d03..561259b9d 100644 --- a/crates/egui_glow/src/winit.rs +++ b/crates/egui_glow/src/winit.rs @@ -1,4 +1,5 @@ use crate::shader_version::ShaderVersion; +use egui::ViewportId; pub use egui_winit; use egui_winit::winit; pub use egui_winit::EventResponse; @@ -53,14 +54,17 @@ impl EguiGlow { repaint_after, textures_delta, shapes, - } = self.egui_ctx.run(raw_input, run_ui); + .. + } = self + .egui_ctx + .run(raw_input, ViewportId::MAIN, ViewportId::MAIN, run_ui); self.egui_winit .handle_platform_output(window, &self.egui_ctx, platform_output); self.shapes = shapes; self.textures_delta.append(textures_delta); - repaint_after + repaint_after.last().map(|(_, t)| *t).unwrap_or_default() } /// Paint the results of the last call to [`Self::run`]. diff --git a/examples/viewports/src/main.rs b/examples/viewports/src/main.rs index 50cf85519..bad2d93ea 100644 --- a/examples/viewports/src/main.rs +++ b/examples/viewports/src/main.rs @@ -162,6 +162,6 @@ fn main() { initial_window_size: Some(egui::Vec2::new(400.0, 220.0)), ..NativeOptions::default() }, - Box::new(|_| Box::new(App::default())), + Box::new(|_| Box::::default()), ); }