feat: add Window::is_visible (#2169)

* feat: add `Window::is_visible`

* use `Option<bool>`

* update doc

* move it right after `set_visible`
This commit is contained in:
Amr Bashir 2022-02-17 20:44:14 +02:00 committed by GitHub
parent ac1c9b1218
commit f9643917d3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 54 additions and 0 deletions

View file

@ -8,6 +8,7 @@ And please only add new entries to the top of this list, right below the `# Unre
# Unreleased # Unreleased
- Added `Window::is_visible`.
- Added `Window::is_resizable`. - Added `Window::is_resizable`.
- Added `Window::is_decorated`. - Added `Window::is_decorated`.
- On X11, fix for repeated event loop iteration when `ControlFlow` was `Wait` - On X11, fix for repeated event loop iteration when `ControlFlow` was `Wait`

View file

@ -543,6 +543,10 @@ impl Window {
pub fn set_visible(&self, _visibility: bool) {} pub fn set_visible(&self, _visibility: bool) {}
pub fn is_visible(&self) -> Option<bool> {
None
}
pub fn set_resizable(&self, _resizeable: bool) {} pub fn set_resizable(&self, _resizeable: bool) {}
pub fn is_resizable(&self) -> bool { pub fn is_resizable(&self) -> bool {

View file

@ -60,6 +60,11 @@ impl Inner {
} }
} }
pub fn is_visible(&self) -> Option<bool> {
warn!("`Window::is_visible` is ignored on iOS");
None
}
pub fn request_redraw(&self) { pub fn request_redraw(&self) {
unsafe { unsafe {
if self.gl_or_metal_backed { if self.gl_or_metal_backed {

View file

@ -321,6 +321,11 @@ impl Window {
x11_or_wayland!(match self; Window(w) => w.set_visible(visible)) x11_or_wayland!(match self; Window(w) => w.set_visible(visible))
} }
#[inline]
pub fn is_visible(&self) -> Option<bool> {
x11_or_wayland!(match self; Window(w) => w.is_visible())
}
#[inline] #[inline]
pub fn outer_position(&self) -> Result<PhysicalPosition<i32>, NotSupportedError> { pub fn outer_position(&self) -> Result<PhysicalPosition<i32>, NotSupportedError> {
x11_or_wayland!(match self; Window(w) => w.outer_position()) x11_or_wayland!(match self; Window(w) => w.outer_position())

View file

@ -270,6 +270,11 @@ impl Window {
// Not possible on Wayland. // Not possible on Wayland.
} }
#[inline]
pub fn is_visible(&self) -> Option<bool> {
None
}
#[inline] #[inline]
pub fn outer_position(&self) -> Result<PhysicalPosition<i32>, NotSupportedError> { pub fn outer_position(&self) -> Result<PhysicalPosition<i32>, NotSupportedError> {
Err(NotSupportedError::new()) Err(NotSupportedError::new())

View file

@ -984,6 +984,11 @@ impl UnownedWindow {
} }
} }
#[inline]
pub fn is_visible(&self) -> Option<bool> {
None
}
fn update_cached_frame_extents(&self) { fn update_cached_frame_extents(&self) {
let extents = self let extents = self
.xconn .xconn

View file

@ -502,6 +502,12 @@ impl UnownedWindow {
} }
} }
#[inline]
pub fn is_visible(&self) -> Option<bool> {
let is_visible: BOOL = unsafe { msg_send![*self.ns_window, isVisible] };
Some(is_visible == YES)
}
pub fn request_redraw(&self) { pub fn request_redraw(&self) {
AppState::queue_redraw(RootWindowId(self.id())); AppState::queue_redraw(RootWindowId(self.id()));
} }

View file

@ -89,6 +89,11 @@ impl Window {
// Intentionally a no-op // Intentionally a no-op
} }
#[inline]
pub fn is_visible(&self) -> Option<bool> {
None
}
pub fn request_redraw(&self) { pub fn request_redraw(&self) {
(self.register_redraw_request)(); (self.register_redraw_request)();
} }

View file

@ -97,6 +97,11 @@ impl Window {
}); });
} }
#[inline]
pub fn is_visible(&self) -> Option<bool> {
Some(unsafe { winuser::IsWindowVisible(self.window.0) == 1 })
}
#[inline] #[inline]
pub fn request_redraw(&self) { pub fn request_redraw(&self) {
unsafe { unsafe {

View file

@ -650,6 +650,19 @@ impl Window {
self.window.set_visible(visible) self.window.set_visible(visible)
} }
/// Gets the window's current vibility state.
///
/// If `None` means it couldn't be determined so it is not recommended to use this to drive your rendering backend.
///
/// ## Platform-specific
///
/// - **X11:** Not implemented.
/// - **Wayland / iOS / Android / Web:** Unsupported.
#[inline]
pub fn is_visible(&self) -> Option<bool> {
self.window.is_visible()
}
/// Sets whether the window is resizable or not. /// Sets whether the window is resizable or not.
/// ///
/// Note that making the window unresizable doesn't exempt you from handling `Resized`, as that event can still be /// Note that making the window unresizable doesn't exempt you from handling `Resized`, as that event can still be