diff --git a/crates/eframe/src/native/epi_integration.rs b/crates/eframe/src/native/epi_integration.rs index 42ca275a1..f6800bebb 100644 --- a/crates/eframe/src/native/epi_integration.rs +++ b/crates/eframe/src/native/epi_integration.rs @@ -333,10 +333,11 @@ impl EpiIntegration { app_name: &str, native_options: &crate::NativeOptions, storage: Option>, + desktop: bool, #[cfg(feature = "glow")] gl: Option>, #[cfg(feature = "wgpu")] wgpu_render_state: Option, ) -> Self { - let egui_ctx = egui::Context::default(); + let egui_ctx = egui::Context::new(desktop); let memory = load_egui_memory(storage.as_deref()).unwrap_or_default(); egui_ctx.memory_mut(|mem| *mem = memory); diff --git a/crates/eframe/src/native/run.rs b/crates/eframe/src/native/run.rs index 3ce42d9d4..b3a56bea5 100644 --- a/crates/eframe/src/native/run.rs +++ b/crates/eframe/src/native/run.rs @@ -19,6 +19,16 @@ use super::epi_integration::{self, EpiIntegration}; // ---------------------------------------------------------------------------- +pub const IS_DESKTOP: bool = cfg!(any( + target_os = "windows", + target_os = "linux", + target_os = "macos", + target_os = "freebsd", + target_os = "openbsd" +)); + +// ---------------------------------------------------------------------------- + #[derive(Debug)] pub enum UserEvent { RequestRepaint { @@ -891,6 +901,7 @@ mod glow_integration { &self.app_name, &self.native_options, storage, + IS_DESKTOP, Some(gl.clone()), #[cfg(feature = "wgpu")] None, @@ -908,12 +919,6 @@ mod glow_integration { let theme = system_theme.unwrap_or(self.native_options.default_theme); integration.egui_ctx.set_visuals(theme.egui_visuals()); - // !!! WARNING This is needed to be improved !!! - // I don't really know not to detect if is on desktop or web/mobile - // This allows to have multiples windows - - integration.egui_ctx.set_desktop(true); - gl_window .window(ViewportId::MAIN) .read() @@ -1885,6 +1890,7 @@ mod wgpu_integration { &self.app_name, &self.native_options, storage, + IS_DESKTOP, #[cfg(feature = "glow")] None, wgpu_render_state.clone(), diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index f03973e62..41b320908 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -365,7 +365,7 @@ impl<'open> Window<'open> { let show_close_button = open.is_some(); 'create_viewport: { - if !is_embedded && ctx.is_desktop() { + if !is_embedded && !ctx.force_embedding() { if let Some(size) = ctx.data(|data| data.get_temp::(area.id.with("size"))) { let size = size.round() + ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point(); @@ -822,7 +822,7 @@ impl<'open> Window<'open> { let show_close_button = open.is_some(); 'create_viewport: { - if !is_embedded && ctx.is_desktop() { + if !is_embedded && !ctx.force_embedding() { if let Some(size) = ctx.data(|data| data.get_temp::(area.id.with("size"))) { let size = size.round() + ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point(); diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 53f5394ce..ac418f9f0 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -224,6 +224,7 @@ struct ContextImpl { viewport_counter: u64, is_desktop: bool, + force_embedding: bool, /// Written to during the frame. layer_rects_this_frame: ahash::HashMap>, @@ -469,6 +470,7 @@ impl Default for Context { let clone = s.clone(); s.write(|ctx| { + ctx.force_embedding = true; ctx.render_sync = Some(Arc::new(Box::new( move |_builder, _viewport_id, _parent_viewport_id, render| render(&clone), ))); @@ -549,6 +551,15 @@ impl Context { ) { self.write(|ctx| ctx.begin_frame_mut(new_input, viewport_id, parent_viewport_id)); } + + pub fn new(desktop: bool) -> Context { + let context = Context::default(); + context.write(|ctx| { + ctx.is_desktop = desktop; + ctx.force_embedding = !desktop; + }); + context + } } /// ## Borrows parts of [`Context`] @@ -2202,16 +2213,15 @@ impl Context { self.write(|ctx| ctx.render_sync = Some(Arc::new(callback))); } - /// This will tell you if the app can create multiples native windows - pub fn is_desktop(&self) -> bool { - self.read(|ctx| ctx.is_desktop) + /// If this is true no other native windows will be created + pub fn force_embedding(&self) -> bool { + self.read(|ctx| ctx.force_embedding) } - /// This should only be called with value true by the backend! - /// - /// With this you can tell egui that is able to open multiples native windows - pub fn set_desktop(&self, value: bool) { - self.write(|ctx| ctx.is_desktop = value); + /// If this is true no other native windows, will not be created for a ```egui::Window``` or Viewport + /// You will always be able to set to false + pub fn set_force_embedding(&self, value: bool) { + self.write(|ctx| ctx.force_embedding = value || !ctx.is_desktop); } /// With this you can send a command to a viewport @@ -2230,7 +2240,7 @@ impl Context { viewport_builder: ViewportBuilder, render: impl Fn(&Context) + Send + Sync + 'static, ) { - if self.is_desktop() { + if !self.force_embedding() { self.write(|ctx| { let viewport_id = ctx.get_viewport_id(); if let Some(window) = ctx.viewports.get_mut(&viewport_builder.title) { @@ -2269,7 +2279,7 @@ impl Context { viewport_builder: ViewportBuilder, func: impl FnOnce(&Context) -> T, ) -> T { - if self.is_desktop() { + if !self.force_embedding() { let mut viewport_id = ViewportId::MAIN; let mut parent_viewport_id = ViewportId::MAIN; let render_sync = self.write(|ctx| { diff --git a/crates/egui_demo_app/src/backend_panel.rs b/crates/egui_demo_app/src/backend_panel.rs index a7653a0af..64b08a7aa 100644 --- a/crates/egui_demo_app/src/backend_panel.rs +++ b/crates/egui_demo_app/src/backend_panel.rs @@ -172,9 +172,9 @@ impl BackendPanel { } } { - let mut is_desktop = ui.ctx().is_desktop(); - ui.checkbox(&mut is_desktop, "Is Desktop"); - ui.ctx().set_desktop(is_desktop); + let mut force_embedding = ui.ctx().force_embedding(); + ui.checkbox(&mut force_embedding, "Force Embedding"); + ui.ctx().set_force_embedding(force_embedding); } if ui diff --git a/docs/egui_demo_app_bg.wasm b/docs/egui_demo_app_bg.wasm index 14e095cb6..1127e3f2e 100644 Binary files a/docs/egui_demo_app_bg.wasm and b/docs/egui_demo_app_bg.wasm differ diff --git a/examples/viewports/src/main.rs b/examples/viewports/src/main.rs index bad2d93ea..3216bf790 100644 --- a/examples/viewports/src/main.rs +++ b/examples/viewports/src/main.rs @@ -48,9 +48,9 @@ impl eframe::App for App { ui.label(format!("Size: {:?}", ctx.screen_rect().max)); ui.label("Look at the \"Frame: \" will tell you, what viewport is rendering!"); { - let mut desktop = ctx.is_desktop(); - ui.checkbox(&mut desktop, "Desktop"); - ctx.set_desktop(desktop); + let mut force_embedding = ctx.force_embedding(); + ui.checkbox(&mut force_embedding, "Force embedding!"); + ctx.set_force_embedding(force_embedding); } ui.checkbox(&mut self.show_async_viewport, "Show Async Viewport"); ui.checkbox(&mut self.show_sync_viewport, "Show Sync Viewport");