From cdab8f90fb525c509e0a15bb1d0b3d7213e176f3 Mon Sep 17 00:00:00 2001 From: Cory Forsstrom Date: Thu, 8 Apr 2021 12:58:08 -0700 Subject: [PATCH] add window visibility --- src/application.rs | 11 +++++++++++ winit/src/application.rs | 8 ++++++++ winit/src/application/state.rs | 12 ++++++++++++ winit/src/settings.rs | 4 +++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/application.rs b/src/application.rs index 7b7de6d4..317f9801 100644 --- a/src/application.rs +++ b/src/application.rs @@ -191,6 +191,13 @@ pub trait Application: Sized { false } + /// Returns whether the [`Application`] should be visible or not + /// + /// By default, it returns `true`. + fn visible(&self) -> bool { + true + } + /// Runs the [`Application`]. /// /// On native platforms, this method will take control of the current thread @@ -295,6 +302,10 @@ where fn should_exit(&self) -> bool { self.0.should_exit() } + + fn visible(&self) -> bool { + self.0.visible() + } } #[cfg(target_arch = "wasm32")] diff --git a/winit/src/application.rs b/winit/src/application.rs index 106d5218..e73f3df1 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -98,6 +98,13 @@ pub trait Application: Program { fn should_exit(&self) -> bool { false } + + /// Returns whether the [`Application`] should be visible or not + /// + /// By default, it returns `true`. + fn visible(&self) -> bool { + true + } } /// Runs an [`Application`] with an executor, compositor, and the provided @@ -145,6 +152,7 @@ where .into_builder( &application.title(), application.mode(), + application.visible(), event_loop.primary_monitor(), ) .build(&event_loop) diff --git a/winit/src/application/state.rs b/winit/src/application/state.rs index 46297370..d157211a 100644 --- a/winit/src/application/state.rs +++ b/winit/src/application/state.rs @@ -12,6 +12,7 @@ pub struct State { mode: Mode, background_color: Color, scale_factor: f64, + visible: bool, viewport: Viewport, viewport_version: usize, cursor_position: winit::dpi::PhysicalPosition, @@ -26,6 +27,7 @@ impl State { let mode = application.mode(); let background_color = application.background_color(); let scale_factor = application.scale_factor(); + let visible = application.visible(); let viewport = { let physical_size = window.inner_size(); @@ -41,6 +43,7 @@ impl State { mode, background_color, scale_factor, + visible, viewport, viewport_version: 0, // TODO: Encode cursor availability in the type-system @@ -201,5 +204,14 @@ impl State { self.scale_factor = new_scale_factor; } + + // Update window visibility + let new_visible = application.visible(); + + if self.visible != new_visible { + window.set_visible(new_visible); + + self.visible = new_visible; + } } } diff --git a/winit/src/settings.rs b/winit/src/settings.rs index 9ce5cfc5..56be1e07 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -66,6 +66,7 @@ impl Window { self, title: &str, mode: Mode, + visible: bool, primary_monitor: Option, ) -> WindowBuilder { let mut window_builder = WindowBuilder::new(); @@ -80,7 +81,8 @@ impl Window { .with_transparent(self.transparent) .with_window_icon(self.icon) .with_always_on_top(self.always_on_top) - .with_fullscreen(conversion::fullscreen(primary_monitor, mode)); + .with_fullscreen(conversion::fullscreen(primary_monitor, mode)) + .with_visible(visible); if let Some((width, height)) = self.min_size { window_builder = window_builder