2022-06-12 02:57:19 +10:00
|
|
|
//! The [`Window`] struct and associated types.
|
2019-05-30 11:29:54 +10:00
|
|
|
use std::fmt;
|
2019-02-06 02:30:33 +11:00
|
|
|
|
2019-06-22 01:33:15 +10:00
|
|
|
use crate::{
|
2019-06-20 06:49:43 +10:00
|
|
|
dpi::{PhysicalPosition, PhysicalSize, Position, Size},
|
2019-06-22 01:33:15 +10:00
|
|
|
error::{ExternalError, NotSupportedError, OsError},
|
|
|
|
event_loop::EventLoopWindowTarget,
|
2019-10-06 00:49:24 +10:00
|
|
|
monitor::{MonitorHandle, VideoMode},
|
2019-06-22 01:33:15 +10:00
|
|
|
platform_impl,
|
|
|
|
};
|
2019-02-06 02:30:33 +11:00
|
|
|
|
2020-03-08 06:42:21 +11:00
|
|
|
pub use crate::icon::{BadIcon, Icon};
|
2019-02-06 02:30:33 +11:00
|
|
|
|
|
|
|
/// Represents a window.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
2019-06-22 01:33:15 +10:00
|
|
|
/// use winit::{
|
|
|
|
/// event::{Event, WindowEvent},
|
2022-04-10 11:32:02 +10:00
|
|
|
/// event_loop::EventLoop,
|
2019-06-22 01:33:15 +10:00
|
|
|
/// window::Window,
|
|
|
|
/// };
|
2019-02-06 02:30:33 +11:00
|
|
|
///
|
|
|
|
/// let mut event_loop = EventLoop::new();
|
|
|
|
/// let window = Window::new(&event_loop).unwrap();
|
|
|
|
///
|
|
|
|
/// event_loop.run(move |event, _, control_flow| {
|
2022-04-10 11:32:02 +10:00
|
|
|
/// control_flow.set_wait();
|
2020-01-08 14:55:18 +11:00
|
|
|
///
|
2019-02-06 02:30:33 +11:00
|
|
|
/// match event {
|
2019-06-22 01:33:15 +10:00
|
|
|
/// Event::WindowEvent {
|
|
|
|
/// event: WindowEvent::CloseRequested,
|
|
|
|
/// ..
|
2022-04-10 11:32:02 +10:00
|
|
|
/// } => control_flow.set_exit(),
|
2020-01-08 14:55:18 +11:00
|
|
|
/// _ => (),
|
2019-02-06 02:30:33 +11:00
|
|
|
/// }
|
|
|
|
/// });
|
|
|
|
/// ```
|
|
|
|
pub struct Window {
|
|
|
|
pub(crate) window: platform_impl::Window,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Debug for Window {
|
2019-06-18 04:27:00 +10:00
|
|
|
fn fmt(&self, fmtr: &mut fmt::Formatter<'_>) -> fmt::Result {
|
2019-02-06 02:30:33 +11:00
|
|
|
fmtr.pad("Window { .. }")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-30 04:16:14 +10:00
|
|
|
impl Drop for Window {
|
|
|
|
fn drop(&mut self) {
|
|
|
|
// If the window is in exclusive fullscreen, we must restore the desktop
|
|
|
|
// video mode (generally this would be done on application exit, but
|
|
|
|
// closing the window doesn't necessarily always mean application exit,
|
|
|
|
// such as when there are multiple windows)
|
|
|
|
if let Some(Fullscreen::Exclusive(_)) = self.fullscreen() {
|
|
|
|
self.set_fullscreen(None);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-06 02:30:33 +11:00
|
|
|
/// Identifier of a window. Unique for each window.
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// Can be obtained with [`window.id()`](`Window::id`).
|
2019-02-06 02:30:33 +11:00
|
|
|
///
|
|
|
|
/// Whenever you receive an event specific to a window, this event contains a `WindowId` which you
|
|
|
|
/// can then compare to the ids of your windows.
|
|
|
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
|
|
|
pub struct WindowId(pub(crate) platform_impl::WindowId);
|
|
|
|
|
|
|
|
impl WindowId {
|
2022-06-12 02:57:19 +10:00
|
|
|
/// Returns a dummy id, useful for unit testing.
|
2021-08-31 03:40:02 +10:00
|
|
|
///
|
|
|
|
/// # Safety
|
|
|
|
///
|
|
|
|
/// The only guarantee made about the return value of this function is that
|
|
|
|
/// it will always be equal to itself and to future values returned by this function.
|
2022-06-12 02:57:19 +10:00
|
|
|
/// No other guarantees are made. This may be equal to a real [`WindowId`].
|
2019-02-06 02:30:33 +11:00
|
|
|
///
|
|
|
|
/// **Passing this into a winit function will result in undefined behavior.**
|
2021-08-31 03:40:02 +10:00
|
|
|
pub const unsafe fn dummy() -> Self {
|
2019-02-06 02:30:33 +11:00
|
|
|
WindowId(platform_impl::WindowId::dummy())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-17 08:09:03 +11:00
|
|
|
/// Object that allows building windows.
|
2020-01-08 06:33:56 +11:00
|
|
|
#[derive(Clone, Default)]
|
2022-06-08 06:55:57 +10:00
|
|
|
#[must_use]
|
2019-02-06 02:30:33 +11:00
|
|
|
pub struct WindowBuilder {
|
|
|
|
/// The attributes to use to create the window.
|
2022-06-11 03:05:28 +10:00
|
|
|
pub(crate) window: WindowAttributes,
|
2019-02-06 02:30:33 +11:00
|
|
|
|
2019-06-29 05:32:27 +10:00
|
|
|
// Platform-specific configuration.
|
2019-02-06 02:30:33 +11:00
|
|
|
pub(crate) platform_specific: platform_impl::PlatformSpecificWindowBuilderAttributes,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Debug for WindowBuilder {
|
2019-06-18 04:27:00 +10:00
|
|
|
fn fmt(&self, fmtr: &mut fmt::Formatter<'_>) -> fmt::Result {
|
2019-02-06 02:30:33 +11:00
|
|
|
fmtr.debug_struct("WindowBuilder")
|
|
|
|
.field("window", &self.window)
|
|
|
|
.finish()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Attributes to use when creating a window.
|
|
|
|
#[derive(Debug, Clone)]
|
2022-06-11 03:05:28 +10:00
|
|
|
pub(crate) struct WindowAttributes {
|
2019-06-20 06:49:43 +10:00
|
|
|
pub inner_size: Option<Size>,
|
|
|
|
pub min_inner_size: Option<Size>,
|
|
|
|
pub max_inner_size: Option<Size>,
|
2021-03-26 05:18:51 +11:00
|
|
|
pub position: Option<Position>,
|
2019-02-06 02:30:33 +11:00
|
|
|
pub resizable: bool,
|
|
|
|
pub title: String,
|
2022-06-11 03:05:28 +10:00
|
|
|
pub fullscreen: Option<Fullscreen>,
|
2019-02-06 02:30:33 +11:00
|
|
|
pub maximized: bool,
|
|
|
|
pub visible: bool,
|
|
|
|
pub transparent: bool,
|
|
|
|
pub decorations: bool,
|
|
|
|
pub always_on_top: bool,
|
|
|
|
pub window_icon: Option<Icon>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for WindowAttributes {
|
|
|
|
#[inline]
|
|
|
|
fn default() -> WindowAttributes {
|
|
|
|
WindowAttributes {
|
2019-05-30 11:29:54 +10:00
|
|
|
inner_size: None,
|
|
|
|
min_inner_size: None,
|
|
|
|
max_inner_size: None,
|
2021-03-26 05:18:51 +11:00
|
|
|
position: None,
|
2019-02-06 02:30:33 +11:00
|
|
|
resizable: true,
|
|
|
|
title: "winit window".to_owned(),
|
|
|
|
maximized: false,
|
|
|
|
fullscreen: None,
|
|
|
|
visible: true,
|
|
|
|
transparent: false,
|
|
|
|
decorations: true,
|
|
|
|
always_on_top: false,
|
|
|
|
window_icon: None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-09-24 00:10:33 +10:00
|
|
|
|
2016-02-23 22:56:23 +11:00
|
|
|
impl WindowBuilder {
|
2022-06-12 02:57:19 +10:00
|
|
|
/// Initializes a new builder with default values.
|
2015-09-21 22:42:05 +10:00
|
|
|
#[inline]
|
2019-09-24 00:10:33 +10:00
|
|
|
pub fn new() -> Self {
|
2020-01-08 06:33:56 +11:00
|
|
|
Default::default()
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Requests the window to be of specific dimensions.
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
2022-06-11 03:05:28 +10:00
|
|
|
/// If this is not set, some platform-specific dimensions will be used.
|
|
|
|
///
|
2019-10-17 03:18:02 +11:00
|
|
|
/// See [`Window::set_inner_size`] for details.
|
2015-09-21 22:42:05 +10:00
|
|
|
#[inline]
|
2019-06-20 06:49:43 +10:00
|
|
|
pub fn with_inner_size<S: Into<Size>>(mut self, size: S) -> Self {
|
|
|
|
self.window.inner_size = Some(size.into());
|
2015-02-16 19:29:37 +11:00
|
|
|
self
|
|
|
|
}
|
2017-06-22 05:10:23 +10:00
|
|
|
|
2022-06-11 03:05:28 +10:00
|
|
|
/// Sets the minimum dimensions a window can have.
|
|
|
|
///
|
|
|
|
/// If this is not set, the window will have no minimum dimensions (aside
|
|
|
|
/// from reserved).
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
|
|
|
/// See [`Window::set_min_inner_size`] for details.
|
2015-11-09 20:42:54 +11:00
|
|
|
#[inline]
|
2019-06-20 06:49:43 +10:00
|
|
|
pub fn with_min_inner_size<S: Into<Size>>(mut self, min_size: S) -> Self {
|
|
|
|
self.window.min_inner_size = Some(min_size.into());
|
2015-11-09 20:42:54 +11:00
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2022-06-11 03:05:28 +10:00
|
|
|
/// Sets the maximum dimensions a window can have.
|
|
|
|
///
|
|
|
|
/// If this is not set, the window will have no maximum or will be set to
|
|
|
|
/// the primary monitor's dimensions by the platform.
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
|
|
|
/// See [`Window::set_max_inner_size`] for details.
|
2015-11-09 20:42:54 +11:00
|
|
|
#[inline]
|
2019-06-20 06:49:43 +10:00
|
|
|
pub fn with_max_inner_size<S: Into<Size>>(mut self, max_size: S) -> Self {
|
|
|
|
self.window.max_inner_size = Some(max_size.into());
|
2015-11-09 20:42:54 +11:00
|
|
|
self
|
|
|
|
}
|
2015-02-16 19:29:37 +11:00
|
|
|
|
2021-03-26 05:18:51 +11:00
|
|
|
/// Sets a desired initial position for the window.
|
|
|
|
///
|
2022-06-11 03:05:28 +10:00
|
|
|
/// If this is not set, some platform-specific position will be chosen.
|
2021-03-26 05:18:51 +11:00
|
|
|
///
|
2022-06-11 03:05:28 +10:00
|
|
|
/// See [`Window::set_outer_position`] for details.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **macOS**: The top left corner position of the window content, the
|
|
|
|
/// window's "inner" position. The window title bar will be placed above
|
|
|
|
/// it. The window will be positioned such that it fits on screen,
|
|
|
|
/// maintaining set `inner_size` if any.
|
|
|
|
/// If you need to precisely position the top left corner of the whole
|
|
|
|
/// window you have to use [`Window::set_outer_position`] after creating
|
|
|
|
/// the window.
|
|
|
|
/// - **Windows**: The top left corner position of the window title bar,
|
|
|
|
/// the window's "outer" position.
|
|
|
|
/// There may be a small gap between this position and the window due to
|
|
|
|
/// the specifics of the Window Manager.
|
|
|
|
/// - **X11**: The top left corner of the window, the window's "outer"
|
|
|
|
/// position.
|
|
|
|
/// - **Others**: Ignored.
|
2021-03-26 05:18:51 +11:00
|
|
|
#[inline]
|
|
|
|
pub fn with_position<P: Into<Position>>(mut self, position: P) -> Self {
|
|
|
|
self.window.position = Some(position.into());
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2019-10-17 03:18:02 +11:00
|
|
|
/// Sets whether the window is resizable or not.
|
2018-06-03 00:51:24 +10:00
|
|
|
///
|
2022-06-11 03:05:28 +10:00
|
|
|
/// The default is `true`.
|
|
|
|
///
|
2019-10-17 03:18:02 +11:00
|
|
|
/// See [`Window::set_resizable`] for details.
|
2018-06-03 00:51:24 +10:00
|
|
|
#[inline]
|
2019-09-24 00:10:33 +10:00
|
|
|
pub fn with_resizable(mut self, resizable: bool) -> Self {
|
2018-06-03 00:51:24 +10:00
|
|
|
self.window.resizable = resizable;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2022-06-11 03:05:28 +10:00
|
|
|
/// Sets the initial title of the window in the title bar.
|
|
|
|
///
|
|
|
|
/// The default is `"winit window"`.
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
|
|
|
/// See [`Window::set_title`] for details.
|
2015-09-21 22:42:05 +10:00
|
|
|
#[inline]
|
2019-09-24 00:10:33 +10:00
|
|
|
pub fn with_title<T: Into<String>>(mut self, title: T) -> Self {
|
2016-05-08 17:28:42 +10:00
|
|
|
self.window.title = title.into();
|
2015-02-16 19:29:37 +11:00
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2022-06-11 03:05:28 +10:00
|
|
|
/// Sets whether the window should be put into fullscreen upon creation.
|
|
|
|
///
|
|
|
|
/// The default is `None`.
|
2019-07-29 19:18:23 +10:00
|
|
|
///
|
2019-10-17 03:18:02 +11:00
|
|
|
/// See [`Window::set_fullscreen`] for details.
|
2015-09-21 22:42:05 +10:00
|
|
|
#[inline]
|
2020-08-02 09:10:33 +10:00
|
|
|
pub fn with_fullscreen(mut self, fullscreen: Option<Fullscreen>) -> Self {
|
|
|
|
self.window.fullscreen = fullscreen;
|
2015-02-16 19:29:37 +11:00
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2022-06-11 03:05:28 +10:00
|
|
|
/// Request that the window is maximized upon creation.
|
|
|
|
///
|
|
|
|
/// The default is `false`.
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
|
|
|
/// See [`Window::set_maximized`] for details.
|
2017-08-28 09:19:26 +10:00
|
|
|
#[inline]
|
2019-09-24 00:10:33 +10:00
|
|
|
pub fn with_maximized(mut self, maximized: bool) -> Self {
|
2017-08-28 09:19:26 +10:00
|
|
|
self.window.maximized = maximized;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2022-06-11 03:05:28 +10:00
|
|
|
/// Sets whether the window will be initially visible or hidden.
|
|
|
|
///
|
|
|
|
/// The default is to show the window.
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
|
|
|
/// See [`Window::set_visible`] for details.
|
2015-09-21 22:42:05 +10:00
|
|
|
#[inline]
|
2019-09-24 00:10:33 +10:00
|
|
|
pub fn with_visible(mut self, visible: bool) -> Self {
|
2015-09-21 21:15:43 +10:00
|
|
|
self.window.visible = visible;
|
2015-02-16 19:29:37 +11:00
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2015-05-15 23:19:33 +10:00
|
|
|
/// Sets whether the background of the window should be transparent.
|
2022-06-11 03:05:28 +10:00
|
|
|
///
|
|
|
|
/// If this is `true`, writing colors with alpha values different than
|
|
|
|
/// `1.0` will produce a transparent window.
|
|
|
|
///
|
|
|
|
/// The default is `false`.
|
2015-09-21 22:42:05 +10:00
|
|
|
#[inline]
|
2019-09-24 00:10:33 +10:00
|
|
|
pub fn with_transparent(mut self, transparent: bool) -> Self {
|
2015-09-21 21:15:43 +10:00
|
|
|
self.window.transparent = transparent;
|
2015-05-15 23:19:33 +10:00
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2022-06-12 16:53:28 +10:00
|
|
|
/// Get whether the window will support transparency.
|
|
|
|
#[inline]
|
|
|
|
pub fn transparent(&self) -> bool {
|
|
|
|
self.window.transparent
|
|
|
|
}
|
|
|
|
|
2015-05-15 23:19:33 +10:00
|
|
|
/// Sets whether the window should have a border, a title bar, etc.
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
2022-06-11 03:05:28 +10:00
|
|
|
/// The default is `true`.
|
|
|
|
///
|
2019-10-17 03:18:02 +11:00
|
|
|
/// See [`Window::set_decorations`] for details.
|
2015-09-21 22:42:05 +10:00
|
|
|
#[inline]
|
2019-09-24 00:10:33 +10:00
|
|
|
pub fn with_decorations(mut self, decorations: bool) -> Self {
|
2015-09-21 21:15:43 +10:00
|
|
|
self.window.decorations = decorations;
|
2015-05-15 23:19:33 +10:00
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2018-05-21 00:24:05 +10:00
|
|
|
/// Sets whether or not the window will always be on top of other windows.
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
2022-06-11 03:05:28 +10:00
|
|
|
/// The default is `false`.
|
|
|
|
///
|
2019-10-17 03:18:02 +11:00
|
|
|
/// See [`Window::set_always_on_top`] for details.
|
2018-05-21 00:24:05 +10:00
|
|
|
#[inline]
|
2019-09-24 00:10:33 +10:00
|
|
|
pub fn with_always_on_top(mut self, always_on_top: bool) -> Self {
|
2018-05-21 00:24:05 +10:00
|
|
|
self.window.always_on_top = always_on_top;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2019-10-17 03:18:02 +11:00
|
|
|
/// Sets the window icon.
|
2018-05-08 07:36:21 +10:00
|
|
|
///
|
2022-06-11 03:05:28 +10:00
|
|
|
/// The default is `None`.
|
|
|
|
///
|
2019-10-17 03:18:02 +11:00
|
|
|
/// See [`Window::set_window_icon`] for details.
|
2018-05-08 07:36:21 +10:00
|
|
|
#[inline]
|
2019-09-24 00:10:33 +10:00
|
|
|
pub fn with_window_icon(mut self, window_icon: Option<Icon>) -> Self {
|
2018-05-08 07:36:21 +10:00
|
|
|
self.window.window_icon = window_icon;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2015-02-16 19:29:37 +11:00
|
|
|
/// Builds the window.
|
|
|
|
///
|
2019-06-22 09:35:08 +10:00
|
|
|
/// Possible causes of error include denied permission, incompatible system, and lack of memory.
|
2019-09-25 09:33:32 +10:00
|
|
|
///
|
|
|
|
/// Platform-specific behavior:
|
|
|
|
/// - **Web**: The window is created but not inserted into the web page automatically. Please
|
2022-06-12 02:57:19 +10:00
|
|
|
/// see the web platform module for more information.
|
2018-06-15 09:42:18 +10:00
|
|
|
#[inline]
|
2019-06-22 01:33:15 +10:00
|
|
|
pub fn build<T: 'static>(
|
2019-07-07 03:28:50 +10:00
|
|
|
self,
|
2019-06-22 01:33:15 +10:00
|
|
|
window_target: &EventLoopWindowTarget<T>,
|
|
|
|
) -> Result<Window, OsError> {
|
2019-10-18 01:59:07 +11:00
|
|
|
platform_impl::Window::new(&window_target.p, self.window, self.platform_specific).map(
|
|
|
|
|window| {
|
|
|
|
window.request_redraw();
|
|
|
|
Window { window }
|
|
|
|
},
|
|
|
|
)
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Base Window functions.
|
2015-02-16 19:29:37 +11:00
|
|
|
impl Window {
|
2017-05-11 10:10:07 +10:00
|
|
|
/// Creates a new Window for platforms where this is appropriate.
|
2015-02-16 19:29:37 +11:00
|
|
|
///
|
2019-10-17 03:18:02 +11:00
|
|
|
/// This function is equivalent to [`WindowBuilder::new().build(event_loop)`].
|
2015-02-16 19:29:37 +11:00
|
|
|
///
|
|
|
|
/// Error should be very rare and only occur in case of permission denied, incompatible system,
|
|
|
|
/// out of memory, etc.
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
2019-09-25 09:33:32 +10:00
|
|
|
/// Platform-specific behavior:
|
|
|
|
/// - **Web**: The window is created but not inserted into the web page automatically. Please
|
2022-06-12 02:57:19 +10:00
|
|
|
/// see the web platform module for more information.
|
2019-10-17 07:09:39 +11:00
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// [`WindowBuilder::new().build(event_loop)`]: WindowBuilder::build
|
2015-02-16 19:29:37 +11:00
|
|
|
#[inline]
|
2019-05-30 11:29:54 +10:00
|
|
|
pub fn new<T: 'static>(event_loop: &EventLoopWindowTarget<T>) -> Result<Window, OsError> {
|
2015-02-16 19:29:37 +11:00
|
|
|
let builder = WindowBuilder::new();
|
2019-02-06 02:30:33 +11:00
|
|
|
builder.build(event_loop)
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Returns an identifier unique to the window.
|
2015-02-16 19:29:37 +11:00
|
|
|
#[inline]
|
2019-05-30 11:29:54 +10:00
|
|
|
pub fn id(&self) -> WindowId {
|
|
|
|
WindowId(self.window.id())
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
|
|
|
|
2020-01-04 06:52:27 +11:00
|
|
|
/// Returns the scale factor that can be used to map logical pixels to physical pixels, and vice versa.
|
2015-02-16 19:29:37 +11:00
|
|
|
///
|
2019-11-12 10:05:59 +11:00
|
|
|
/// See the [`dpi`](crate::dpi) module for more information.
|
2015-02-16 19:29:37 +11:00
|
|
|
///
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Note that this value can change depending on user action (for example if the window is
|
2022-06-12 02:57:19 +10:00
|
|
|
/// moved to another screen); as such, tracking [`WindowEvent::ScaleFactorChanged`] events is
|
2019-05-30 11:29:54 +10:00
|
|
|
/// the most robust way to track the DPI you need to use to draw.
|
2015-02-16 19:29:37 +11:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-01-04 06:52:27 +11:00
|
|
|
/// - **X11:** This respects Xft.dpi, and can be overridden using the `WINIT_X11_SCALE_FACTOR` environment variable.
|
2019-05-30 11:29:54 +10:00
|
|
|
/// - **Android:** Always returns 1.0.
|
|
|
|
/// - **iOS:** Can only be called on the main thread. Returns the underlying `UIView`'s
|
|
|
|
/// [`contentScaleFactor`].
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// [`WindowEvent::ScaleFactorChanged`]: crate::event::WindowEvent::ScaleFactorChanged
|
2019-05-30 11:29:54 +10:00
|
|
|
/// [`contentScaleFactor`]: https://developer.apple.com/documentation/uikit/uiview/1622657-contentscalefactor?language=objc
|
2015-02-16 19:29:37 +11:00
|
|
|
#[inline]
|
2020-01-04 06:52:27 +11:00
|
|
|
pub fn scale_factor(&self) -> f64 {
|
|
|
|
self.window.scale_factor()
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
|
|
|
|
2022-06-12 02:57:19 +10:00
|
|
|
/// Emits a [`Event::RedrawRequested`] event in the associated event loop after all OS
|
2019-02-06 02:30:33 +11:00
|
|
|
/// events have been processed by the event loop.
|
|
|
|
///
|
2019-06-18 08:22:01 +10:00
|
|
|
/// This is the **strongly encouraged** method of redrawing windows, as it can integrate with
|
2019-02-06 02:30:33 +11:00
|
|
|
/// OS-requested redraws (e.g. when a window gets resized).
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// This function can cause `RedrawRequested` events to be emitted after [`Event::MainEventsCleared`]
|
2019-02-06 02:30:33 +11:00
|
|
|
/// but before `Event::NewEvents` if called in the following circumstances:
|
2020-01-14 06:15:44 +11:00
|
|
|
/// * While processing `MainEventsCleared`.
|
|
|
|
/// * While processing a `RedrawRequested` event that was sent during `MainEventsCleared` or any
|
2019-02-06 02:30:33 +11:00
|
|
|
/// directly subsequent `RedrawRequested` event.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **iOS:** Can only be called on the main thread.
|
2021-06-05 20:47:08 +10:00
|
|
|
/// - **Android:** Subsequent calls after `MainEventsCleared` are not handled.
|
2022-06-12 02:57:19 +10:00
|
|
|
///
|
|
|
|
/// [`Event::RedrawRequested`]: crate::event::Event::RedrawRequested
|
|
|
|
/// [`Event::MainEventsCleared`]: crate::event::Event::MainEventsCleared
|
2019-05-30 11:29:54 +10:00
|
|
|
#[inline]
|
2019-02-06 02:30:33 +11:00
|
|
|
pub fn request_redraw(&self) {
|
|
|
|
self.window.request_redraw()
|
|
|
|
}
|
2019-05-30 11:29:54 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Position and size functions.
|
|
|
|
impl Window {
|
|
|
|
/// Returns the position of the top-left hand corner of the window's client area relative to the
|
|
|
|
/// top-left hand corner of the desktop.
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// The same conditions that apply to [`Window::outer_position`] apply to this method.
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **iOS:** Can only be called on the main thread. Returns the top left coordinates of the
|
|
|
|
/// window's [safe area] in the screen space coordinate system.
|
2020-01-01 09:39:33 +11:00
|
|
|
/// - **Web:** Returns the top-left coordinates relative to the viewport. _Note: this returns the
|
2022-06-12 02:57:19 +10:00
|
|
|
/// same value as [`Window::outer_position`]._
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **Android / Wayland:** Always returns [`NotSupportedError`].
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
|
|
|
/// [safe area]: https://developer.apple.com/documentation/uikit/uiview/2891103-safeareainsets?language=objc
|
|
|
|
#[inline]
|
2020-01-04 17:33:07 +11:00
|
|
|
pub fn inner_position(&self) -> Result<PhysicalPosition<i32>, NotSupportedError> {
|
2019-05-30 11:29:54 +10:00
|
|
|
self.window.inner_position()
|
|
|
|
}
|
2019-02-06 02:30:33 +11:00
|
|
|
|
2015-02-16 19:29:37 +11:00
|
|
|
/// Returns the position of the top-left hand corner of the window relative to the
|
2022-06-12 02:57:19 +10:00
|
|
|
/// top-left hand corner of the desktop.
|
2015-02-16 19:29:37 +11:00
|
|
|
///
|
2015-03-26 14:44:21 +11:00
|
|
|
/// Note that the top-left hand corner of the desktop is not necessarily the same as
|
2022-06-12 02:57:19 +10:00
|
|
|
/// the screen. If the user uses a desktop with multiple monitors, the top-left hand corner
|
|
|
|
/// of the desktop is the top-left hand corner of the monitor at the top-left of the desktop.
|
2015-02-16 19:29:37 +11:00
|
|
|
///
|
|
|
|
/// The coordinates can be negative if the top-left hand corner of the window is outside
|
2022-06-12 02:57:19 +10:00
|
|
|
/// of the visible screen region.
|
2015-02-16 19:29:37 +11:00
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **iOS:** Can only be called on the main thread. Returns the top left coordinates of the
|
|
|
|
/// window in the screen space coordinate system.
|
2020-01-01 09:39:33 +11:00
|
|
|
/// - **Web:** Returns the top-left coordinates relative to the viewport.
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **Android / Wayland:** Always returns [`NotSupportedError`].
|
2015-02-16 19:29:37 +11:00
|
|
|
#[inline]
|
2020-01-04 17:33:07 +11:00
|
|
|
pub fn outer_position(&self) -> Result<PhysicalPosition<i32>, NotSupportedError> {
|
2019-05-30 11:29:54 +10:00
|
|
|
self.window.outer_position()
|
2018-04-17 11:40:30 +10:00
|
|
|
}
|
|
|
|
|
2015-02-16 19:29:37 +11:00
|
|
|
/// Modifies the position of the window.
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// See [`Window::outer_position`] for more information about the coordinates.
|
|
|
|
/// This automatically un-maximizes the window if it's maximized.
|
2015-02-16 19:29:37 +11:00
|
|
|
///
|
2022-01-02 14:56:13 +11:00
|
|
|
/// ```no_run
|
|
|
|
/// # use winit::dpi::{LogicalPosition, PhysicalPosition};
|
|
|
|
/// # use winit::event_loop::EventLoop;
|
|
|
|
/// # use winit::window::Window;
|
|
|
|
/// # let mut event_loop = EventLoop::new();
|
|
|
|
/// # let window = Window::new(&event_loop).unwrap();
|
|
|
|
/// // Specify the position in logical dimensions like this:
|
|
|
|
/// window.set_outer_position(LogicalPosition::new(400.0, 200.0));
|
|
|
|
///
|
|
|
|
/// // Or specify the position in physical dimensions like this:
|
|
|
|
/// window.set_outer_position(PhysicalPosition::new(400, 200));
|
|
|
|
/// ```
|
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **iOS:** Can only be called on the main thread. Sets the top left coordinates of the
|
|
|
|
/// window in the screen space coordinate system.
|
2020-01-01 09:39:33 +11:00
|
|
|
/// - **Web:** Sets the top-left coordinates relative to the viewport.
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **Android / Wayland:** Unsupported.
|
2015-02-16 19:29:37 +11:00
|
|
|
#[inline]
|
2019-06-20 06:49:43 +10:00
|
|
|
pub fn set_outer_position<P: Into<Position>>(&self, position: P) {
|
|
|
|
self.window.set_outer_position(position.into())
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
|
|
|
|
2020-01-04 17:31:23 +11:00
|
|
|
/// Returns the physical size of the window's client area.
|
2015-07-25 21:57:52 +10:00
|
|
|
///
|
|
|
|
/// The client area is the content of the window, excluding the title bar and borders.
|
2015-02-16 19:29:37 +11:00
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2019-06-20 06:49:43 +10:00
|
|
|
/// - **iOS:** Can only be called on the main thread. Returns the `PhysicalSize` of the window's
|
2019-05-26 11:10:41 +10:00
|
|
|
/// [safe area] in screen space coordinates.
|
2020-01-01 09:39:33 +11:00
|
|
|
/// - **Web:** Returns the size of the canvas element.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
2019-05-30 11:29:54 +10:00
|
|
|
/// [safe area]: https://developer.apple.com/documentation/uikit/uiview/2891103-safeareainsets?language=objc
|
2015-02-16 19:29:37 +11:00
|
|
|
#[inline]
|
2020-01-04 17:33:07 +11:00
|
|
|
pub fn inner_size(&self) -> PhysicalSize<u32> {
|
2019-05-30 11:29:54 +10:00
|
|
|
self.window.inner_size()
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Modifies the inner size of the window.
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// See [`Window::inner_size`] for more information about the values.
|
|
|
|
/// This automatically un-maximizes the window if it's maximized.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
2022-01-02 14:56:13 +11:00
|
|
|
/// ```no_run
|
|
|
|
/// # use winit::dpi::{LogicalSize, PhysicalSize};
|
|
|
|
/// # use winit::event_loop::EventLoop;
|
|
|
|
/// # use winit::window::Window;
|
|
|
|
/// # let mut event_loop = EventLoop::new();
|
|
|
|
/// # let window = Window::new(&event_loop).unwrap();
|
|
|
|
/// // Specify the size in logical dimensions like this:
|
|
|
|
/// window.set_inner_size(LogicalSize::new(400.0, 200.0));
|
|
|
|
///
|
|
|
|
/// // Or specify the size in physical dimensions like this:
|
|
|
|
/// window.set_inner_size(PhysicalSize::new(400, 200));
|
|
|
|
/// ```
|
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android:** Unsupported.
|
2020-01-01 09:39:33 +11:00
|
|
|
/// - **Web:** Sets the size of the canvas element.
|
2015-02-16 19:29:37 +11:00
|
|
|
#[inline]
|
2019-06-20 06:49:43 +10:00
|
|
|
pub fn set_inner_size<S: Into<Size>>(&self, size: S) {
|
|
|
|
self.window.set_inner_size(size.into())
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
|
|
|
|
2020-01-04 17:31:23 +11:00
|
|
|
/// Returns the physical size of the entire window.
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
|
|
|
/// These dimensions include the title bar and borders. If you don't want that (and you usually don't),
|
2022-06-12 02:57:19 +10:00
|
|
|
/// use [`Window::inner_size`] instead.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// - **iOS:** Can only be called on the main thread. Returns the [`PhysicalSize`] of the window in
|
2019-05-30 11:29:54 +10:00
|
|
|
/// screen space coordinates.
|
2020-01-01 09:39:33 +11:00
|
|
|
/// - **Web:** Returns the size of the canvas element. _Note: this returns the same value as
|
2022-06-12 02:57:19 +10:00
|
|
|
/// [`Window::inner_size`]._
|
2018-03-23 20:35:35 +11:00
|
|
|
#[inline]
|
2020-01-04 17:33:07 +11:00
|
|
|
pub fn outer_size(&self) -> PhysicalSize<u32> {
|
2019-05-30 11:29:54 +10:00
|
|
|
self.window.outer_size()
|
2018-03-23 20:35:35 +11:00
|
|
|
}
|
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Sets a minimum dimension size for the window.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
2022-01-02 14:56:13 +11:00
|
|
|
/// ```no_run
|
|
|
|
/// # use winit::dpi::{LogicalSize, PhysicalSize};
|
|
|
|
/// # use winit::event_loop::EventLoop;
|
|
|
|
/// # use winit::window::Window;
|
|
|
|
/// # let mut event_loop = EventLoop::new();
|
|
|
|
/// # let window = Window::new(&event_loop).unwrap();
|
|
|
|
/// // Specify the size in logical dimensions like this:
|
|
|
|
/// window.set_min_inner_size(Some(LogicalSize::new(400.0, 200.0)));
|
|
|
|
///
|
|
|
|
/// // Or specify the size in physical dimensions like this:
|
|
|
|
/// window.set_min_inner_size(Some(PhysicalSize::new(400, 200)));
|
|
|
|
/// ```
|
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android / Web:** Unsupported.
|
2018-03-23 20:35:35 +11:00
|
|
|
#[inline]
|
2019-06-20 06:49:43 +10:00
|
|
|
pub fn set_min_inner_size<S: Into<Size>>(&self, min_size: Option<S>) {
|
|
|
|
self.window.set_min_inner_size(min_size.map(|s| s.into()))
|
2018-03-23 20:35:35 +11:00
|
|
|
}
|
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Sets a maximum dimension size for the window.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
2022-01-02 14:56:13 +11:00
|
|
|
/// ```no_run
|
|
|
|
/// # use winit::dpi::{LogicalSize, PhysicalSize};
|
|
|
|
/// # use winit::event_loop::EventLoop;
|
|
|
|
/// # use winit::window::Window;
|
|
|
|
/// # let mut event_loop = EventLoop::new();
|
|
|
|
/// # let window = Window::new(&event_loop).unwrap();
|
|
|
|
/// // Specify the size in logical dimensions like this:
|
|
|
|
/// window.set_max_inner_size(Some(LogicalSize::new(400.0, 200.0)));
|
|
|
|
///
|
|
|
|
/// // Or specify the size in physical dimensions like this:
|
|
|
|
/// window.set_max_inner_size(Some(PhysicalSize::new(400, 200)));
|
|
|
|
/// ```
|
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2021-02-28 07:25:26 +11:00
|
|
|
/// - **iOS / Android / Web:** Unsupported.
|
2018-06-12 08:47:50 +10:00
|
|
|
#[inline]
|
2019-06-20 06:49:43 +10:00
|
|
|
pub fn set_max_inner_size<S: Into<Size>>(&self, max_size: Option<S>) {
|
|
|
|
self.window.set_max_inner_size(max_size.map(|s| s.into()))
|
2018-06-12 08:47:50 +10:00
|
|
|
}
|
2019-05-30 11:29:54 +10:00
|
|
|
}
|
2018-06-12 08:47:50 +10:00
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Misc. attribute functions.
|
|
|
|
impl Window {
|
|
|
|
/// Modifies the title of the window.
|
2018-07-17 00:44:29 +10:00
|
|
|
///
|
2018-06-15 09:42:18 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android:** Unsupported.
|
2015-02-21 07:32:40 +11:00
|
|
|
#[inline]
|
2019-05-30 11:29:54 +10:00
|
|
|
pub fn set_title(&self, title: &str) {
|
|
|
|
self.window.set_title(title)
|
2015-02-21 07:32:40 +11:00
|
|
|
}
|
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Modifies the window's visibility.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
2019-05-30 11:29:54 +10:00
|
|
|
/// If `false`, this will hide the window. If `true`, this will show the window.
|
2022-06-12 02:57:19 +10:00
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **Android / Wayland / Web:** Unsupported.
|
2019-05-30 11:29:54 +10:00
|
|
|
/// - **iOS:** Can only be called on the main thread.
|
2018-06-15 09:42:18 +10:00
|
|
|
#[inline]
|
2019-05-30 11:29:54 +10:00
|
|
|
pub fn set_visible(&self, visible: bool) {
|
|
|
|
self.window.set_visible(visible)
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
|
|
|
|
2022-02-18 05:44:14 +11:00
|
|
|
/// Gets the window's current vibility state.
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// `None` means it couldn't be determined, so it is not recommended to use this to drive your rendering backend.
|
2022-02-18 05:44:14 +11:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **X11:** Not implemented.
|
|
|
|
/// - **Wayland / iOS / Android / Web:** Unsupported.
|
|
|
|
#[inline]
|
|
|
|
pub fn is_visible(&self) -> Option<bool> {
|
|
|
|
self.window.is_visible()
|
|
|
|
}
|
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Sets whether the window is resizable or not.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// Note that making the window unresizable doesn't exempt you from handling [`WindowEvent::Resized`], as that
|
2022-04-25 06:35:18 +10:00
|
|
|
/// event can still be triggered by DPI scaling, entering fullscreen mode, etc. Also, the
|
2022-06-12 02:57:19 +10:00
|
|
|
/// window could still be resized by calling [`Window::set_inner_size`].
|
2015-03-27 03:04:01 +11:00
|
|
|
///
|
2018-06-19 02:32:18 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2019-05-30 11:29:54 +10:00
|
|
|
/// This only has an effect on desktop platforms.
|
|
|
|
///
|
|
|
|
/// Due to a bug in XFCE, this has no effect on Xfwm.
|
2018-06-19 02:32:18 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android / Web:** Unsupported.
|
2022-06-12 02:57:19 +10:00
|
|
|
///
|
|
|
|
/// [`WindowEvent::Resized`]: crate::event::WindowEvent::Resized
|
2015-09-21 22:42:05 +10:00
|
|
|
#[inline]
|
2019-05-30 11:29:54 +10:00
|
|
|
pub fn set_resizable(&self, resizable: bool) {
|
|
|
|
self.window.set_resizable(resizable)
|
2015-01-25 22:06:50 +11:00
|
|
|
}
|
2017-01-29 01:05:36 +11:00
|
|
|
|
2022-02-18 02:03:17 +11:00
|
|
|
/// Gets the window's current resizable state.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2022-04-07 10:05:11 +10:00
|
|
|
/// - **X11:** Not implemented.
|
2022-02-18 02:03:17 +11:00
|
|
|
/// - **iOS / Android / Web:** Unsupported.
|
|
|
|
#[inline]
|
|
|
|
pub fn is_resizable(&self) -> bool {
|
|
|
|
self.window.is_resizable()
|
|
|
|
}
|
|
|
|
|
2019-12-22 17:04:11 +11:00
|
|
|
/// Sets the window to minimized or back
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android / Web:** Unsupported.
|
|
|
|
/// - **Wayland:** Un-minimize is unsupported.
|
2019-12-22 17:04:11 +11:00
|
|
|
#[inline]
|
|
|
|
pub fn set_minimized(&self, minimized: bool) {
|
|
|
|
self.window.set_minimized(minimized);
|
|
|
|
}
|
|
|
|
|
2019-05-26 11:10:41 +10:00
|
|
|
/// Sets the window to maximized or back.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android / Web:** Unsupported.
|
2017-08-28 09:19:26 +10:00
|
|
|
#[inline]
|
|
|
|
pub fn set_maximized(&self, maximized: bool) {
|
|
|
|
self.window.set_maximized(maximized)
|
|
|
|
}
|
|
|
|
|
2021-01-28 05:01:17 +11:00
|
|
|
/// Gets the window's current maximized state.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **iOS / Android / Web:** Unsupported.
|
|
|
|
#[inline]
|
|
|
|
pub fn is_maximized(&self) -> bool {
|
|
|
|
self.window.is_maximized()
|
|
|
|
}
|
|
|
|
|
2019-05-26 11:10:41 +10:00
|
|
|
/// Sets the window to fullscreen or back.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// - **macOS:** [`Fullscreen::Exclusive`] provides true exclusive mode with a
|
2019-07-30 04:16:14 +10:00
|
|
|
/// video mode change. *Caveat!* macOS doesn't provide task switching (or
|
|
|
|
/// spaces!) while in exclusive fullscreen mode. This mode should be used
|
|
|
|
/// when a video mode change is desired, but for a better user experience,
|
|
|
|
/// borderless fullscreen might be preferred.
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// [`Fullscreen::Borderless`] provides a borderless fullscreen window on a
|
2019-07-30 04:16:14 +10:00
|
|
|
/// separate space. This is the idiomatic way for fullscreen games to work
|
2019-11-12 10:05:59 +11:00
|
|
|
/// on macOS. See `WindowExtMacOs::set_simple_fullscreen` if
|
2019-07-30 04:16:14 +10:00
|
|
|
/// separate spaces are not preferred.
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// The dock and the menu bar are disabled in exclusive fullscreen mode.
|
2019-05-26 11:10:41 +10:00
|
|
|
/// - **iOS:** Can only be called on the main thread.
|
Update SCTK to 0.11.0
* Update SCTK to 0.11.0
Updates smithay-client-toolkit to 0.11.0. The major highlight
of that updated, is update of wayland-rs to 0.27.0. Switching
to wayland-cursor, instead of using libwayland-cursor. It
also fixes the following bugs:
- Disabled repeat rate not being handled.
- Decoration buttons not working after tty switch.
- Scaling not being applied on output reenable.
- Crash when `XCURSOR_SIZE` is `0`.
- Pointer getting created in some cases without pointer capability.
- On kwin, fix space between window and decorations on startup.
- Incorrect size event when entering fullscreen when using
client side decorations.
- Client side decorations not being hided properly in fullscreen.
- Size tracking between fullscreen/tiled state changes.
- Repeat rate triggering multiple times from slow callback handler.
- Resizable attribute not being applied properly on startup.
- Not working IME
Besides those fixes it also adds a bunch of missing virtual key codes,
implements proper cursor grabbing, adds right click on decorations
to open application menu, disabled maximize button for non-resizeable
window, and fall back for cursor icon to similar ones, if the requested
is missing.
It also adds new methods to a `Theme` trait, such as:
- `title_font(&self) -> Option<(String, f32)>` - The font for a title.
- `title_color(&self, window_active: bool) -> [u8; 4]` - The color of
the text in the title.
Fixes #1680.
Fixes #1678.
Fixes #1676.
Fixes #1646.
Fixes #1614.
Fixes #1601.
Fixes #1533.
Fixes #1509.
Fixes #952.
Fixes #947.
2020-09-29 07:11:43 +10:00
|
|
|
/// - **Wayland:** Does not support exclusive fullscreen mode and will no-op a request.
|
2019-07-29 19:18:23 +10:00
|
|
|
/// - **Windows:** Screen saver is disabled in fullscreen mode.
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **Android:** Unsupported.
|
2017-08-28 09:22:26 +10:00
|
|
|
#[inline]
|
2019-07-30 04:16:14 +10:00
|
|
|
pub fn set_fullscreen(&self, fullscreen: Option<Fullscreen>) {
|
|
|
|
self.window.set_fullscreen(fullscreen)
|
2017-09-07 18:33:46 +10:00
|
|
|
}
|
|
|
|
|
2019-04-26 03:09:32 +10:00
|
|
|
/// Gets the window's current fullscreen state.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// - **iOS:** Can only be called on the main thread.
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **Android:** Will always return `None`.
|
2020-09-22 11:54:47 +10:00
|
|
|
/// - **Wayland:** Can return `Borderless(None)` when there are no monitors.
|
2019-04-26 03:09:32 +10:00
|
|
|
#[inline]
|
2019-07-30 04:16:14 +10:00
|
|
|
pub fn fullscreen(&self) -> Option<Fullscreen> {
|
2019-05-30 11:29:54 +10:00
|
|
|
self.window.fullscreen()
|
2019-04-26 03:09:32 +10:00
|
|
|
}
|
|
|
|
|
2017-12-22 23:50:46 +11:00
|
|
|
/// Turn window decorations on or off.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
2020-07-27 07:13:17 +10:00
|
|
|
///
|
|
|
|
/// - **iOS / Android / Web:** Unsupported.
|
2017-12-22 23:50:46 +11:00
|
|
|
#[inline]
|
|
|
|
pub fn set_decorations(&self, decorations: bool) {
|
|
|
|
self.window.set_decorations(decorations)
|
|
|
|
}
|
|
|
|
|
2022-02-18 00:31:13 +11:00
|
|
|
/// Gets the window's current decorations state.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2022-04-07 10:05:11 +10:00
|
|
|
/// - **X11:** Not implemented.
|
2022-02-18 00:31:13 +11:00
|
|
|
/// - **iOS / Android / Web:** Unsupported.
|
|
|
|
#[inline]
|
|
|
|
pub fn is_decorated(&self) -> bool {
|
|
|
|
self.window.is_decorated()
|
|
|
|
}
|
|
|
|
|
2018-05-21 00:24:05 +10:00
|
|
|
/// Change whether or not the window will always be on top of other windows.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android / Web / Wayland:** Unsupported.
|
2018-05-21 00:24:05 +10:00
|
|
|
#[inline]
|
|
|
|
pub fn set_always_on_top(&self, always_on_top: bool) {
|
|
|
|
self.window.set_always_on_top(always_on_top)
|
|
|
|
}
|
|
|
|
|
2022-06-12 02:57:19 +10:00
|
|
|
/// Sets the window icon.
|
|
|
|
///
|
|
|
|
/// On Windows and X11, this is typically the small icon in the top-left
|
2018-05-08 07:36:21 +10:00
|
|
|
/// corner of the titlebar.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android / Web / Wayland / macOS:** Unsupported.
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// - **Windows:** Sets `ICON_SMALL`. The base size for a window icon is 16x16, but it's
|
|
|
|
/// recommended to account for screen scaling and pick a multiple of that, i.e. 32x32.
|
2019-10-17 03:18:02 +11:00
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// - **X11:** Has no universal guidelines for icon sizes, so you're at the whims of the WM. That
|
|
|
|
/// said, it's usually in the same ballpark as on Windows.
|
2018-05-08 07:36:21 +10:00
|
|
|
#[inline]
|
|
|
|
pub fn set_window_icon(&self, window_icon: Option<Icon>) {
|
|
|
|
self.window.set_window_icon(window_icon)
|
|
|
|
}
|
|
|
|
|
2018-05-21 00:47:22 +10:00
|
|
|
/// Sets location of IME candidate box in client area coordinates relative to the top left.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
2022-05-07 12:29:25 +10:00
|
|
|
/// This is the window / popup / overlay that allows you to select the desired characters.
|
|
|
|
/// The look of this box may differ between input devices, even on the same platform.
|
|
|
|
///
|
|
|
|
/// (Apple's official term is "candidate window", see their [chinese] and [japanese] guides).
|
|
|
|
///
|
|
|
|
/// ## Example
|
|
|
|
///
|
2022-01-02 14:56:13 +11:00
|
|
|
/// ```no_run
|
|
|
|
/// # use winit::dpi::{LogicalPosition, PhysicalPosition};
|
|
|
|
/// # use winit::event_loop::EventLoop;
|
|
|
|
/// # use winit::window::Window;
|
|
|
|
/// # let mut event_loop = EventLoop::new();
|
|
|
|
/// # let window = Window::new(&event_loop).unwrap();
|
|
|
|
/// // Specify the position in logical dimensions like this:
|
|
|
|
/// window.set_ime_position(LogicalPosition::new(400.0, 200.0));
|
|
|
|
///
|
|
|
|
/// // Or specify the position in physical dimensions like this:
|
|
|
|
/// window.set_ime_position(PhysicalPosition::new(400, 200));
|
|
|
|
/// ```
|
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-12-10 07:16:59 +11:00
|
|
|
/// - **iOS / Android / Web:** Unsupported.
|
2022-05-07 12:29:25 +10:00
|
|
|
///
|
|
|
|
/// [chinese]: https://support.apple.com/guide/chinese-input-method/use-the-candidate-window-cim12992/104/mac/12.0
|
|
|
|
/// [japanese]: https://support.apple.com/guide/japanese-input-method/use-the-candidate-window-jpim10262/6.3/mac/12.0
|
2018-05-18 11:28:30 +10:00
|
|
|
#[inline]
|
2019-06-20 06:49:43 +10:00
|
|
|
pub fn set_ime_position<P: Into<Position>>(&self, position: P) {
|
|
|
|
self.window.set_ime_position(position.into())
|
2018-05-18 11:28:30 +10:00
|
|
|
}
|
2020-11-27 13:03:08 +11:00
|
|
|
|
2022-05-07 12:29:25 +10:00
|
|
|
/// Sets whether the window should get IME events
|
|
|
|
///
|
|
|
|
/// When IME is allowed, the window will receive [`Ime`] events, and during the
|
|
|
|
/// preedit phase the window will NOT get [`KeyboardInput`] or
|
|
|
|
/// [`ReceivedCharacter`] events. The window should allow IME while it is
|
|
|
|
/// expecting text input.
|
|
|
|
///
|
|
|
|
/// When IME is not allowed, the window won't receive [`Ime`] events, and will
|
|
|
|
/// receive [`KeyboardInput`] events for every keypress instead. Without
|
|
|
|
/// allowing IME, the window will also get [`ReceivedCharacter`] events for
|
|
|
|
/// certain keyboard input. Not allowing IME is useful for games for example.
|
|
|
|
///
|
|
|
|
/// IME is **not** allowed by default.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **macOS:** IME must be enabled to receive text-input where dead-key sequences are combined.
|
|
|
|
/// - ** iOS / Android / Web :** Unsupported.
|
|
|
|
///
|
|
|
|
/// [`Ime`]: crate::event::WindowEvent::Ime
|
|
|
|
/// [`KeyboardInput`]: crate::event::WindowEvent::KeyboardInput
|
|
|
|
/// [`ReceivedCharacter`]: crate::event::WindowEvent::ReceivedCharacter
|
|
|
|
#[inline]
|
|
|
|
pub fn set_ime_allowed(&self, allowed: bool) {
|
|
|
|
self.window.set_ime_allowed(allowed);
|
|
|
|
}
|
|
|
|
|
2021-05-20 02:39:53 +10:00
|
|
|
/// Brings the window to the front and sets input focus. Has no effect if the window is
|
|
|
|
/// already in focus, minimized, or not visible.
|
|
|
|
///
|
|
|
|
/// This method steals input focus from other applications. Do not use this method unless
|
|
|
|
/// you are certain that's what the user wants. Focus stealing can cause an extremely disruptive
|
|
|
|
/// user experience.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **iOS / Android / Web / Wayland:** Unsupported.
|
|
|
|
#[inline]
|
|
|
|
pub fn focus_window(&self) {
|
|
|
|
self.window.focus_window()
|
|
|
|
}
|
|
|
|
|
2020-11-27 13:03:08 +11:00
|
|
|
/// Requests user attention to the window, this has no effect if the application
|
|
|
|
/// is already focused. How requesting for user attention manifests is platform dependent,
|
2022-06-12 02:57:19 +10:00
|
|
|
/// see [`UserAttentionType`] for details.
|
2020-11-27 13:03:08 +11:00
|
|
|
///
|
|
|
|
/// Providing `None` will unset the request for user attention. Unsetting the request for
|
|
|
|
/// user attention might not be done automatically by the WM when the window receives input.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2021-08-17 14:59:57 +10:00
|
|
|
/// - **iOS / Android / Web :** Unsupported.
|
2020-11-27 13:03:08 +11:00
|
|
|
/// - **macOS:** `None` has no effect.
|
|
|
|
/// - **X11:** Requests for user attention must be manually cleared.
|
2021-08-17 14:59:57 +10:00
|
|
|
/// - **Wayland:** Requires `xdg_activation_v1` protocol, `None` has no effect.
|
2020-11-27 13:03:08 +11:00
|
|
|
#[inline]
|
|
|
|
pub fn request_user_attention(&self, request_type: Option<UserAttentionType>) {
|
|
|
|
self.window.request_user_attention(request_type)
|
|
|
|
}
|
2019-05-30 11:29:54 +10:00
|
|
|
}
|
2018-05-18 11:28:30 +10:00
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Cursor functions.
|
|
|
|
impl Window {
|
|
|
|
/// Modifies the cursor icon of the window.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android:** Unsupported.
|
2018-06-15 09:42:18 +10:00
|
|
|
#[inline]
|
2019-05-30 11:29:54 +10:00
|
|
|
pub fn set_cursor_icon(&self, cursor: CursorIcon) {
|
|
|
|
self.window.set_cursor_icon(cursor);
|
2017-08-28 09:22:26 +10:00
|
|
|
}
|
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Changes the position of the cursor in window coordinates.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
2022-01-02 14:56:13 +11:00
|
|
|
/// ```no_run
|
|
|
|
/// # use winit::dpi::{LogicalPosition, PhysicalPosition};
|
|
|
|
/// # use winit::event_loop::EventLoop;
|
|
|
|
/// # use winit::window::Window;
|
|
|
|
/// # let mut event_loop = EventLoop::new();
|
|
|
|
/// # let window = Window::new(&event_loop).unwrap();
|
|
|
|
/// // Specify the position in logical dimensions like this:
|
|
|
|
/// window.set_cursor_position(LogicalPosition::new(400.0, 200.0));
|
|
|
|
///
|
|
|
|
/// // Or specify the position in physical dimensions like this:
|
|
|
|
/// window.set_cursor_position(PhysicalPosition::new(400, 200));
|
|
|
|
/// ```
|
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android / Web / Wayland:** Always returns an [`ExternalError::NotSupported`].
|
2018-06-17 00:14:12 +10:00
|
|
|
#[inline]
|
2019-06-20 06:49:43 +10:00
|
|
|
pub fn set_cursor_position<P: Into<Position>>(&self, position: P) -> Result<(), ExternalError> {
|
|
|
|
self.window.set_cursor_position(position.into())
|
2018-06-17 00:14:12 +10:00
|
|
|
}
|
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Grabs the cursor, preventing it from leaving the window.
|
2019-05-26 11:10:41 +10:00
|
|
|
///
|
Update SCTK to 0.11.0
* Update SCTK to 0.11.0
Updates smithay-client-toolkit to 0.11.0. The major highlight
of that updated, is update of wayland-rs to 0.27.0. Switching
to wayland-cursor, instead of using libwayland-cursor. It
also fixes the following bugs:
- Disabled repeat rate not being handled.
- Decoration buttons not working after tty switch.
- Scaling not being applied on output reenable.
- Crash when `XCURSOR_SIZE` is `0`.
- Pointer getting created in some cases without pointer capability.
- On kwin, fix space between window and decorations on startup.
- Incorrect size event when entering fullscreen when using
client side decorations.
- Client side decorations not being hided properly in fullscreen.
- Size tracking between fullscreen/tiled state changes.
- Repeat rate triggering multiple times from slow callback handler.
- Resizable attribute not being applied properly on startup.
- Not working IME
Besides those fixes it also adds a bunch of missing virtual key codes,
implements proper cursor grabbing, adds right click on decorations
to open application menu, disabled maximize button for non-resizeable
window, and fall back for cursor icon to similar ones, if the requested
is missing.
It also adds new methods to a `Theme` trait, such as:
- `title_font(&self) -> Option<(String, f32)>` - The font for a title.
- `title_color(&self, window_active: bool) -> [u8; 4]` - The color of
the text in the title.
Fixes #1680.
Fixes #1678.
Fixes #1676.
Fixes #1646.
Fixes #1614.
Fixes #1601.
Fixes #1533.
Fixes #1509.
Fixes #952.
Fixes #947.
2020-09-29 07:11:43 +10:00
|
|
|
/// There's no guarantee that the cursor will be hidden. You should
|
|
|
|
/// hide it by yourself if you want so.
|
|
|
|
///
|
2019-05-26 11:10:41 +10:00
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
Update SCTK to 0.11.0
* Update SCTK to 0.11.0
Updates smithay-client-toolkit to 0.11.0. The major highlight
of that updated, is update of wayland-rs to 0.27.0. Switching
to wayland-cursor, instead of using libwayland-cursor. It
also fixes the following bugs:
- Disabled repeat rate not being handled.
- Decoration buttons not working after tty switch.
- Scaling not being applied on output reenable.
- Crash when `XCURSOR_SIZE` is `0`.
- Pointer getting created in some cases without pointer capability.
- On kwin, fix space between window and decorations on startup.
- Incorrect size event when entering fullscreen when using
client side decorations.
- Client side decorations not being hided properly in fullscreen.
- Size tracking between fullscreen/tiled state changes.
- Repeat rate triggering multiple times from slow callback handler.
- Resizable attribute not being applied properly on startup.
- Not working IME
Besides those fixes it also adds a bunch of missing virtual key codes,
implements proper cursor grabbing, adds right click on decorations
to open application menu, disabled maximize button for non-resizeable
window, and fall back for cursor icon to similar ones, if the requested
is missing.
It also adds new methods to a `Theme` trait, such as:
- `title_font(&self) -> Option<(String, f32)>` - The font for a title.
- `title_color(&self, window_active: bool) -> [u8; 4]` - The color of
the text in the title.
Fixes #1680.
Fixes #1678.
Fixes #1676.
Fixes #1646.
Fixes #1614.
Fixes #1601.
Fixes #1533.
Fixes #1509.
Fixes #952.
Fixes #947.
2020-09-29 07:11:43 +10:00
|
|
|
/// - **macOS:** This locks the cursor in a fixed location, which looks visually awkward.
|
2022-01-05 21:13:46 +11:00
|
|
|
/// - **iOS / Android:** Always returns an [`ExternalError::NotSupported`].
|
2018-06-17 00:14:12 +10:00
|
|
|
#[inline]
|
2019-05-30 11:29:54 +10:00
|
|
|
pub fn set_cursor_grab(&self, grab: bool) -> Result<(), ExternalError> {
|
|
|
|
self.window.set_cursor_grab(grab)
|
2018-06-17 00:14:12 +10:00
|
|
|
}
|
|
|
|
|
2019-06-02 10:06:41 +10:00
|
|
|
/// Modifies the cursor's visibility.
|
|
|
|
///
|
|
|
|
/// If `false`, this will hide the cursor. If `true`, this will show the cursor.
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **Windows:** The cursor is only hidden within the confines of the window.
|
|
|
|
/// - **X11:** The cursor is only hidden within the confines of the window.
|
2019-10-02 11:25:59 +10:00
|
|
|
/// - **Wayland:** The cursor is only hidden within the confines of the window.
|
2019-05-30 11:29:54 +10:00
|
|
|
/// - **macOS:** The cursor is hidden as long as the window has input focus, even if the cursor is
|
|
|
|
/// outside of the window.
|
2020-07-27 07:13:17 +10:00
|
|
|
/// - **iOS / Android:** Unsupported.
|
2017-01-29 01:05:36 +11:00
|
|
|
#[inline]
|
2019-05-30 11:29:54 +10:00
|
|
|
pub fn set_cursor_visible(&self, visible: bool) {
|
|
|
|
self.window.set_cursor_visible(visible)
|
2017-01-29 01:05:36 +11:00
|
|
|
}
|
2021-03-07 20:43:23 +11:00
|
|
|
|
|
|
|
/// Moves the window with the left mouse button until the button is released.
|
|
|
|
///
|
|
|
|
/// There's no guarantee that this will work unless the left mouse button was pressed
|
|
|
|
/// immediately before this function is called.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **X11:** Un-grabs the cursor.
|
|
|
|
/// - **Wayland:** Requires the cursor to be inside the window to be dragged.
|
|
|
|
/// - **macOS:** May prevent the button release event to be triggered.
|
|
|
|
/// - **iOS / Android / Web:** Always returns an [`ExternalError::NotSupported`].
|
|
|
|
#[inline]
|
|
|
|
pub fn drag_window(&self) -> Result<(), ExternalError> {
|
|
|
|
self.window.drag_window()
|
|
|
|
}
|
2022-04-13 03:10:46 +10:00
|
|
|
|
|
|
|
/// Modifies whether the window catches cursor events.
|
|
|
|
///
|
|
|
|
/// If `true`, the window will catch the cursor events. If `false`, events are passed through
|
|
|
|
/// the window such that any other window behind it receives them. By default hittest is enabled.
|
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **iOS / Android / Web / X11:** Always returns an [`ExternalError::NotSupported`].
|
|
|
|
#[inline]
|
|
|
|
pub fn set_cursor_hittest(&self, hittest: bool) -> Result<(), ExternalError> {
|
|
|
|
self.window.set_cursor_hittest(hittest)
|
|
|
|
}
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Monitor info functions.
|
|
|
|
impl Window {
|
2020-09-08 03:09:24 +10:00
|
|
|
/// Returns the monitor on which the window currently resides.
|
|
|
|
///
|
|
|
|
/// Returns `None` if current monitor can't be detected.
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// **iOS:** Can only be called on the main thread.
|
|
|
|
#[inline]
|
2020-09-08 03:09:24 +10:00
|
|
|
pub fn current_monitor(&self) -> Option<MonitorHandle> {
|
2019-05-30 11:29:54 +10:00
|
|
|
self.window.current_monitor()
|
2015-03-16 23:50:23 +11:00
|
|
|
}
|
2015-02-16 19:29:37 +11:00
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Returns the list of all the monitors available on the system.
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// This is the same as [`EventLoopWindowTarget::available_monitors`], and is provided for convenience.
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// **iOS:** Can only be called on the main thread.
|
2022-06-12 02:57:19 +10:00
|
|
|
///
|
|
|
|
/// [`EventLoopWindowTarget::available_monitors`]: crate::event_loop::EventLoopWindowTarget::available_monitors
|
2019-05-30 11:29:54 +10:00
|
|
|
#[inline]
|
2019-10-06 00:49:24 +10:00
|
|
|
pub fn available_monitors(&self) -> impl Iterator<Item = MonitorHandle> {
|
|
|
|
self.window
|
|
|
|
.available_monitors()
|
|
|
|
.into_iter()
|
|
|
|
.map(|inner| MonitorHandle { inner })
|
2015-03-17 07:52:58 +11:00
|
|
|
}
|
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
/// Returns the primary monitor of the system.
|
|
|
|
///
|
2020-09-08 03:20:47 +10:00
|
|
|
/// Returns `None` if it can't identify any monitor as a primary one.
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// This is the same as [`EventLoopWindowTarget::primary_monitor`], and is provided for convenience.
|
2019-05-30 11:29:54 +10:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// **iOS:** Can only be called on the main thread.
|
2020-09-08 03:20:47 +10:00
|
|
|
/// **Wayland:** Always returns `None`.
|
2022-06-12 02:57:19 +10:00
|
|
|
///
|
|
|
|
/// [`EventLoopWindowTarget::primary_monitor`]: crate::event_loop::EventLoopWindowTarget::primary_monitor
|
2019-05-30 11:29:54 +10:00
|
|
|
#[inline]
|
2020-09-08 03:20:47 +10:00
|
|
|
pub fn primary_monitor(&self) -> Option<MonitorHandle> {
|
|
|
|
self.window.primary_monitor()
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
2019-02-06 02:30:33 +11:00
|
|
|
}
|
2017-09-07 18:33:46 +10:00
|
|
|
|
2019-08-14 21:57:16 +10:00
|
|
|
unsafe impl raw_window_handle::HasRawWindowHandle for Window {
|
2022-06-12 02:57:19 +10:00
|
|
|
/// Returns a [`raw_window_handle::RawWindowHandle`] for the Window
|
2020-10-30 08:23:46 +11:00
|
|
|
///
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
|
|
|
/// - **Android:** Only available after receiving the Resumed event and before Suspended. *If you*
|
|
|
|
/// *try to get the handle outside of that period, this function will panic*!
|
2019-08-14 21:57:16 +10:00
|
|
|
fn raw_window_handle(&self) -> raw_window_handle::RawWindowHandle {
|
|
|
|
self.window.raw_window_handle()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-06 02:30:33 +11:00
|
|
|
/// Describes the appearance of the mouse cursor.
|
|
|
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
|
|
|
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
2019-05-30 11:29:54 +10:00
|
|
|
pub enum CursorIcon {
|
2019-02-06 02:30:33 +11:00
|
|
|
/// The platform-dependent default cursor.
|
|
|
|
Default,
|
|
|
|
/// A simple crosshair.
|
|
|
|
Crosshair,
|
|
|
|
/// A hand (often used to indicate links in web browsers).
|
|
|
|
Hand,
|
|
|
|
/// Self explanatory.
|
|
|
|
Arrow,
|
|
|
|
/// Indicates something is to be moved.
|
|
|
|
Move,
|
|
|
|
/// Indicates text that may be selected or edited.
|
|
|
|
Text,
|
|
|
|
/// Program busy indicator.
|
|
|
|
Wait,
|
|
|
|
/// Help indicator (often rendered as a "?")
|
|
|
|
Help,
|
|
|
|
/// Progress indicator. Shows that processing is being done. But in contrast
|
|
|
|
/// with "Wait" the user may still interact with the program. Often rendered
|
|
|
|
/// as a spinning beach ball, or an arrow with a watch or hourglass.
|
|
|
|
Progress,
|
|
|
|
|
|
|
|
/// Cursor showing that something cannot be done.
|
|
|
|
NotAllowed,
|
|
|
|
ContextMenu,
|
|
|
|
Cell,
|
|
|
|
VerticalText,
|
|
|
|
Alias,
|
|
|
|
Copy,
|
|
|
|
NoDrop,
|
2019-09-13 09:38:44 +10:00
|
|
|
/// Indicates something can be grabbed.
|
2019-02-06 02:30:33 +11:00
|
|
|
Grab,
|
2019-09-13 09:38:44 +10:00
|
|
|
/// Indicates something is grabbed.
|
2019-02-06 02:30:33 +11:00
|
|
|
Grabbing,
|
|
|
|
AllScroll,
|
|
|
|
ZoomIn,
|
|
|
|
ZoomOut,
|
|
|
|
|
|
|
|
/// Indicate that some edge is to be moved. For example, the 'SeResize' cursor
|
|
|
|
/// is used when the movement starts from the south-east corner of the box.
|
|
|
|
EResize,
|
|
|
|
NResize,
|
|
|
|
NeResize,
|
|
|
|
NwResize,
|
|
|
|
SResize,
|
|
|
|
SeResize,
|
|
|
|
SwResize,
|
|
|
|
WResize,
|
|
|
|
EwResize,
|
|
|
|
NsResize,
|
|
|
|
NeswResize,
|
|
|
|
NwseResize,
|
|
|
|
ColResize,
|
|
|
|
RowResize,
|
|
|
|
}
|
2017-10-17 22:56:38 +11:00
|
|
|
|
2019-05-30 11:29:54 +10:00
|
|
|
impl Default for CursorIcon {
|
2019-02-06 02:30:33 +11:00
|
|
|
fn default() -> Self {
|
2019-05-30 11:29:54 +10:00
|
|
|
CursorIcon::Default
|
2017-10-17 22:56:38 +11:00
|
|
|
}
|
2015-02-16 19:29:37 +11:00
|
|
|
}
|
2019-07-30 04:16:14 +10:00
|
|
|
|
2020-09-22 11:54:47 +10:00
|
|
|
/// Fullscreen modes.
|
2022-06-10 20:43:33 +10:00
|
|
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
2019-07-30 04:16:14 +10:00
|
|
|
pub enum Fullscreen {
|
|
|
|
Exclusive(VideoMode),
|
2020-09-22 11:54:47 +10:00
|
|
|
|
|
|
|
/// Providing `None` to `Borderless` will fullscreen on the current monitor.
|
|
|
|
Borderless(Option<MonitorHandle>),
|
2019-07-30 04:16:14 +10:00
|
|
|
}
|
2019-12-23 06:04:09 +11:00
|
|
|
|
2022-06-10 20:43:33 +10:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
2019-12-23 06:04:09 +11:00
|
|
|
pub enum Theme {
|
|
|
|
Light,
|
|
|
|
Dark,
|
|
|
|
}
|
2020-11-27 13:03:08 +11:00
|
|
|
|
|
|
|
/// ## Platform-specific
|
|
|
|
///
|
2022-06-12 02:57:19 +10:00
|
|
|
/// - **X11:** Sets the WM's `XUrgencyHint`. No distinction between [`Critical`] and [`Informational`].
|
|
|
|
///
|
|
|
|
/// [`Critical`]: Self::Critical
|
|
|
|
/// [`Informational`]: Self::Informational
|
2022-06-10 20:43:33 +10:00
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
2020-11-27 13:03:08 +11:00
|
|
|
pub enum UserAttentionType {
|
|
|
|
/// ## Platform-specific
|
|
|
|
/// - **macOS:** Bounces the dock icon until the application is in focus.
|
|
|
|
/// - **Windows:** Flashes both the window and the taskbar button until the application is in focus.
|
|
|
|
Critical,
|
|
|
|
/// ## Platform-specific
|
|
|
|
/// - **macOS:** Bounces the dock icon once.
|
|
|
|
/// - **Windows:** Flashes the taskbar button until the application is in focus.
|
|
|
|
Informational,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for UserAttentionType {
|
|
|
|
fn default() -> Self {
|
|
|
|
UserAttentionType::Informational
|
|
|
|
}
|
|
|
|
}
|