From 422c6b19878ed11ea446ebf5a887e510a0eec4c3 Mon Sep 17 00:00:00 2001 From: Shane Pearman Date: Fri, 27 Jan 2023 07:38:56 +0200 Subject: [PATCH] Allow introspection of WindowBuilder attributes Makes WindowAttributes public and adds window_attributes() getter to WindowBuilder. In version 0.27, the WindowAttributes struct was made private, but this removed the ability to introspect the default WindowBuilder values. --- CHANGELOG.md | 1 + src/platform_impl/ios/view.rs | 2 +- src/platform_impl/ios/window.rs | 3 ++- src/platform_impl/linux/wayland/window/mod.rs | 2 +- src/platform_impl/linux/x11/window.rs | 3 ++- src/platform_impl/macos/window.rs | 4 ++-- src/platform_impl/windows/window.rs | 2 +- src/window.rs | 11 ++++++++--- 8 files changed, 18 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b025fcb..25918f89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ And please only add new entries to the top of this list, right below the `# Unre - On macOS, fix the mouse buttons other than left/right/middle being reported as middle. - On Wayland, support fractional scaling via the wp-fractional-scale protocol. - On web, fix removal of mouse event listeners from the global object upon window distruction. +- Add WindowAttributes getter to WindowBuilder to allow introspection of default values. # 0.27.5 diff --git a/src/platform_impl/ios/view.rs b/src/platform_impl/ios/view.rs index 24925aa7..199daba7 100644 --- a/src/platform_impl/ios/view.rs +++ b/src/platform_impl/ios/view.rs @@ -455,7 +455,7 @@ impl WinitUIWindow { this.setRootViewController(Some(view_controller)); - match window_attributes.fullscreen { + match window_attributes.fullscreen.clone().map(Into::into) { Some(Fullscreen::Exclusive(ref video_mode)) => { let monitor = video_mode.monitor(); let screen = monitor.ui_screen(); diff --git a/src/platform_impl/ios/window.rs b/src/platform_impl/ios/window.rs index 5a82c532..22fbb2de 100644 --- a/src/platform_impl/ios/window.rs +++ b/src/platform_impl/ios/window.rs @@ -416,7 +416,8 @@ impl Window { // TODO: transparency, visible let main_screen = UIScreen::main(mtm); - let screen = match window_attributes.fullscreen { + let fullscreen = window_attributes.fullscreen.clone().map(Into::into); + let screen = match fullscreen { Some(Fullscreen::Exclusive(ref video_mode)) => video_mode.monitor.ui_screen(), Some(Fullscreen::Borderless(Some(ref monitor))) => monitor.ui_screen(), Some(Fullscreen::Borderless(None)) | None => &main_screen, diff --git a/src/platform_impl/linux/wayland/window/mod.rs b/src/platform_impl/linux/wayland/window/mod.rs index b6894556..c66f32f1 100644 --- a/src/platform_impl/linux/wayland/window/mod.rs +++ b/src/platform_impl/linux/wayland/window/mod.rs @@ -240,7 +240,7 @@ impl Window { window.set_title(attributes.title); // Set fullscreen/maximized if so was requested. - match attributes.fullscreen { + match attributes.fullscreen.map(Into::into) { Some(Fullscreen::Exclusive(_)) => { warn!("`Fullscreen::Exclusive` is ignored on Wayland") } diff --git a/src/platform_impl/linux/x11/window.rs b/src/platform_impl/linux/x11/window.rs index 60d7ce37..fd6d645e 100644 --- a/src/platform_impl/linux/x11/window.rs +++ b/src/platform_impl/linux/x11/window.rs @@ -484,7 +484,8 @@ impl UnownedWindow { window.set_maximized_inner(window_attrs.maximized).queue(); } if window_attrs.fullscreen.is_some() { - if let Some(flusher) = window.set_fullscreen_inner(window_attrs.fullscreen.clone()) + if let Some(flusher) = + window.set_fullscreen_inner(window_attrs.fullscreen.clone().map(Into::into)) { flusher.queue() } diff --git a/src/platform_impl/macos/window.rs b/src/platform_impl/macos/window.rs index 4b05d7c2..36b24e21 100644 --- a/src/platform_impl/macos/window.rs +++ b/src/platform_impl/macos/window.rs @@ -217,7 +217,7 @@ impl WinitWindow { } let this = autoreleasepool(|_| { - let screen = match &attrs.fullscreen { + let screen = match attrs.fullscreen.clone().map(Into::into) { Some(Fullscreen::Borderless(Some(monitor))) | Some(Fullscreen::Exclusive(VideoMode { monitor, .. })) => { monitor.ns_screen().or_else(NSScreen::main) @@ -459,7 +459,7 @@ impl WinitWindow { let delegate = WinitWindowDelegate::new(&this, attrs.fullscreen.is_some()); // Set fullscreen mode after we setup everything - this.set_fullscreen(attrs.fullscreen); + this.set_fullscreen(attrs.fullscreen.map(Into::into)); // Setting the window as key has to happen *after* we set the fullscreen // state, since otherwise we'll briefly see the window at normal size diff --git a/src/platform_impl/windows/window.rs b/src/platform_impl/windows/window.rs index b0d30e21..3c356b7c 100644 --- a/src/platform_impl/windows/window.rs +++ b/src/platform_impl/windows/window.rs @@ -1011,7 +1011,7 @@ impl<'a, T: 'static> InitData<'a, T> { win.set_enabled_buttons(attributes.enabled_buttons); if attributes.fullscreen.is_some() { - win.set_fullscreen(attributes.fullscreen); + win.set_fullscreen(attributes.fullscreen.map(Into::into)); force_window_active(win.window.0); } else { let size = attributes diff --git a/src/window.rs b/src/window.rs index b114d0b6..6790d4ee 100644 --- a/src/window.rs +++ b/src/window.rs @@ -120,7 +120,7 @@ impl fmt::Debug for WindowBuilder { /// Attributes to use when creating a window. #[derive(Debug, Clone)] -pub(crate) struct WindowAttributes { +pub struct WindowAttributes { pub inner_size: Option, pub min_inner_size: Option, pub max_inner_size: Option, @@ -128,7 +128,7 @@ pub(crate) struct WindowAttributes { pub resizable: bool, pub enabled_buttons: WindowButtons, pub title: String, - pub fullscreen: Option, + pub fullscreen: Option, pub maximized: bool, pub visible: bool, pub transparent: bool, @@ -176,6 +176,11 @@ impl WindowBuilder { Default::default() } + /// Get the current window attributes. + pub fn window_attributes(&self) -> &WindowAttributes { + &self.window + } + /// Requests the window to be of specific dimensions. /// /// If this is not set, some platform-specific dimensions will be used. @@ -279,7 +284,7 @@ impl WindowBuilder { /// See [`Window::set_fullscreen`] for details. #[inline] pub fn with_fullscreen(mut self, fullscreen: Option) -> Self { - self.window.fullscreen = fullscreen.map(|f| f.into()); + self.window.fullscreen = fullscreen; self }