diff --git a/CHANGELOG.md b/CHANGELOG.md index cbccefec..f86d1f31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ And please only add new entries to the top of this list, right below the `# Unre # Unreleased +- Added `Window::is_decorated`. - On X11, fix for repeated event loop iteration when `ControlFlow` was `Wait` - On Wayland, report unaccelerated mouse deltas in `DeviceEvent::MouseMotion`. - **Breaking:** Bump `ndk` version to 0.6, ndk-sys to `v0.3`, `ndk-glue` to `0.6`. diff --git a/src/platform_impl/android/mod.rs b/src/platform_impl/android/mod.rs index 0b3bcde7..300d5c32 100644 --- a/src/platform_impl/android/mod.rs +++ b/src/platform_impl/android/mod.rs @@ -561,6 +561,10 @@ impl Window { pub fn set_decorations(&self, _decorations: bool) {} + pub fn is_decorated(&self) -> bool { + true + } + pub fn set_always_on_top(&self, _always_on_top: bool) {} pub fn set_window_icon(&self, _window_icon: Option) {} diff --git a/src/platform_impl/ios/window.rs b/src/platform_impl/ios/window.rs index 2a06eda2..e1d3e150 100644 --- a/src/platform_impl/ios/window.rs +++ b/src/platform_impl/ios/window.rs @@ -260,6 +260,11 @@ impl Inner { warn!("`Window::set_decorations` is ignored on iOS") } + pub fn is_decorated(&self) -> bool { + warn!("`Window::is_decorated` is ignored on iOS"); + true + } + pub fn set_always_on_top(&self, _always_on_top: bool) { warn!("`Window::set_always_on_top` is ignored on iOS") } diff --git a/src/platform_impl/linux/mod.rs b/src/platform_impl/linux/mod.rs index ea9cd4ae..2ca74bda 100644 --- a/src/platform_impl/linux/mod.rs +++ b/src/platform_impl/linux/mod.rs @@ -426,6 +426,11 @@ impl Window { x11_or_wayland!(match self; Window(w) => w.set_decorations(decorations)) } + #[inline] + pub fn is_decorated(&self) -> bool { + x11_or_wayland!(match self; Window(w) => w.is_decorated()) + } + #[inline] pub fn set_always_on_top(&self, _always_on_top: bool) { match self { diff --git a/src/platform_impl/linux/wayland/window/mod.rs b/src/platform_impl/linux/wayland/window/mod.rs index 8af9ca20..0a81e2db 100644 --- a/src/platform_impl/linux/wayland/window/mod.rs +++ b/src/platform_impl/linux/wayland/window/mod.rs @@ -348,6 +348,11 @@ impl Window { self.send_request(WindowRequest::Decorate(decorate)); } + #[inline] + pub fn is_decorated(&self) -> bool { + true + } + #[inline] pub fn set_minimized(&self, minimized: bool) { // You can't unminimize the window on Wayland. diff --git a/src/platform_impl/linux/x11/window.rs b/src/platform_impl/linux/x11/window.rs index 45759b05..ebb69e93 100644 --- a/src/platform_impl/linux/x11/window.rs +++ b/src/platform_impl/linux/x11/window.rs @@ -895,6 +895,11 @@ impl UnownedWindow { self.invalidate_cached_frame_extents(); } + #[inline] + pub fn is_decorated(&self) -> bool { + true + } + fn set_maximizable_inner(&self, maximizable: bool) -> util::Flusher<'_> { let mut hints = self.xconn.get_motif_hints(self.xwindow); diff --git a/src/platform_impl/macos/window.rs b/src/platform_impl/macos/window.rs index 2d6c14a9..08eb0e46 100644 --- a/src/platform_impl/macos/window.rs +++ b/src/platform_impl/macos/window.rs @@ -1003,6 +1003,11 @@ impl UnownedWindow { } } + #[inline] + pub fn is_decorated(&self) -> bool { + self.decorations.load(Ordering::Acquire) + } + #[inline] pub fn set_always_on_top(&self, always_on_top: bool) { let level = if always_on_top { diff --git a/src/platform_impl/web/window.rs b/src/platform_impl/web/window.rs index 19fac1b9..02c6c07b 100644 --- a/src/platform_impl/web/window.rs +++ b/src/platform_impl/web/window.rs @@ -269,6 +269,10 @@ impl Window { // Intentionally a no-op, no canvas decorations } + pub fn is_decorated(&self) -> bool { + true + } + #[inline] pub fn set_always_on_top(&self, _always_on_top: bool) { // Intentionally a no-op, no window ordering diff --git a/src/platform_impl/windows/window.rs b/src/platform_impl/windows/window.rs index 06176304..b4e776c1 100644 --- a/src/platform_impl/windows/window.rs +++ b/src/platform_impl/windows/window.rs @@ -544,6 +544,12 @@ impl Window { }); } + #[inline] + pub fn is_decorated(&self) -> bool { + let window_state = self.window_state.lock(); + window_state.window_flags.contains(WindowFlags::DECORATIONS) + } + #[inline] pub fn set_always_on_top(&self, always_on_top: bool) { let window = self.window.clone(); diff --git a/src/window.rs b/src/window.rs index c9c9912a..f5806036 100644 --- a/src/window.rs +++ b/src/window.rs @@ -750,6 +750,17 @@ impl Window { self.window.set_decorations(decorations) } + /// Gets the window's current decorations state. + /// + /// ## Platform-specific + /// + /// - **Wayland / X11:** Not implemented. + /// - **iOS / Android / Web:** Unsupported. + #[inline] + pub fn is_decorated(&self) -> bool { + self.window.is_decorated() + } + /// Change whether or not the window will always be on top of other windows. /// /// ## Platform-specific