2019-02-06 02:30:33 +11:00
//! The `Window` struct and associated types.
use std ::{ fmt , error } ;
use platform_impl ;
use event_loop ::EventLoopWindowTarget ;
use monitor ::{ AvailableMonitorsIter , MonitorHandle } ;
use dpi ::{ LogicalPosition , LogicalSize } ;
pub use icon ::* ;
/// Represents a window.
///
/// # Example
///
/// ```no_run
/// use winit::window::Window;
/// use winit::event::{Event, WindowEvent};
/// use winit::event_loop::{EventLoop, ControlFlow};
///
/// let mut event_loop = EventLoop::new();
/// let window = Window::new(&event_loop).unwrap();
///
/// event_loop.run(move |event, _, control_flow| {
/// match event {
/// Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => {
/// *control_flow = ControlFlow::Exit
/// },
/// _ => *control_flow = ControlFlow::Wait,
/// }
/// });
/// ```
pub struct Window {
pub ( crate ) window : platform_impl ::Window ,
}
impl fmt ::Debug for Window {
fn fmt ( & self , fmtr : & mut fmt ::Formatter ) -> fmt ::Result {
fmtr . pad ( " Window { .. } " )
}
}
/// Identifier of a window. Unique for each window.
///
/// Can be obtained with `window.id()`.
///
/// 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 {
/// Returns a dummy `WindowId`, useful for unit testing. 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. No other guarantees are made. This may be equal to a real `WindowId`.
///
/// **Passing this into a winit function will result in undefined behavior.**
pub unsafe fn dummy ( ) -> Self {
WindowId ( platform_impl ::WindowId ::dummy ( ) )
}
}
/// Object that allows you to build windows.
#[ derive(Clone) ]
pub struct WindowBuilder {
/// The attributes to use to create the window.
pub window : WindowAttributes ,
// Platform-specific configuration. Private.
pub ( crate ) platform_specific : platform_impl ::PlatformSpecificWindowBuilderAttributes ,
}
impl fmt ::Debug for WindowBuilder {
fn fmt ( & self , fmtr : & mut fmt ::Formatter ) -> fmt ::Result {
fmtr . debug_struct ( " WindowBuilder " )
. field ( " window " , & self . window )
. finish ( )
}
}
/// Attributes to use when creating a window.
#[ derive(Debug, Clone) ]
pub struct WindowAttributes {
/// The dimensions of the window. If this is `None`, some platform-specific dimensions will be
/// used.
///
/// The default is `None`.
pub dimensions : Option < LogicalSize > ,
/// The minimum dimensions a window can be, If this is `None`, the window will have no minimum dimensions (aside from reserved).
///
/// The default is `None`.
pub min_dimensions : Option < LogicalSize > ,
2015-02-16 19:29:37 +11:00
2019-02-06 02:30:33 +11:00
/// The maximum dimensions a window can be, If this is `None`, the maximum will have no maximum or will be set to the primary monitor's dimensions by the platform.
///
/// The default is `None`.
pub max_dimensions : Option < LogicalSize > ,
/// Whether the window is resizable or not.
///
/// The default is `true`.
pub resizable : bool ,
/// Whether the window should be set as fullscreen upon creation.
///
/// The default is `None`.
pub fullscreen : Option < MonitorHandle > ,
/// The title of the window in the title bar.
///
/// The default is `"winit window"`.
pub title : String ,
/// Whether the window should be maximized upon creation.
///
/// The default is `false`.
pub maximized : bool ,
/// Whether the window should be immediately visible upon creation.
///
/// The default is `true`.
pub visible : bool ,
/// Whether the the window should be transparent. If this is true, writing colors
/// with alpha values different than `1.0` will produce a transparent window.
///
/// The default is `false`.
pub transparent : bool ,
/// Whether the window should have borders and bars.
///
/// The default is `true`.
pub decorations : bool ,
/// Whether the window should always be on top of other windows.
///
/// The default is `false`.
pub always_on_top : bool ,
/// The window icon.
///
/// The default is `None`.
pub window_icon : Option < Icon > ,
/// [iOS only] Enable multitouch,
/// see [multipleTouchEnabled](https://developer.apple.com/documentation/uikit/uiview/1622519-multipletouchenabled)
pub multitouch : bool ,
}
impl Default for WindowAttributes {
#[ inline ]
fn default ( ) -> WindowAttributes {
WindowAttributes {
dimensions : None ,
min_dimensions : None ,
max_dimensions : None ,
resizable : true ,
title : " winit window " . to_owned ( ) ,
maximized : false ,
fullscreen : None ,
visible : true ,
transparent : false ,
decorations : true ,
always_on_top : false ,
window_icon : None ,
multitouch : false ,
}
}
}
2016-02-23 22:56:23 +11:00
impl WindowBuilder {
2015-02-16 19:29:37 +11:00
/// Initializes a new `WindowBuilder` with default values.
2015-09-21 22:42:05 +10:00
#[ inline ]
2016-02-23 22:56:23 +11:00
pub fn new ( ) -> WindowBuilder {
2015-02-16 19:29:37 +11:00
WindowBuilder {
2015-09-21 21:15:43 +10:00
window : Default ::default ( ) ,
2016-01-08 02:01:18 +11:00
platform_specific : Default ::default ( ) ,
2015-02-16 19:29:37 +11:00
}
}
/// Requests the window to be of specific dimensions.
2015-09-21 22:42:05 +10:00
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn with_dimensions ( mut self , size : LogicalSize ) -> WindowBuilder {
self . window . dimensions = Some ( size ) ;
2015-02-16 19:29:37 +11:00
self
}
2017-06-22 05:10:23 +10:00
2015-11-09 20:42:54 +11:00
/// Sets a minimum dimension size for the window
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn with_min_dimensions ( mut self , min_size : LogicalSize ) -> WindowBuilder {
self . window . min_dimensions = Some ( min_size ) ;
2015-11-09 20:42:54 +11:00
self
}
/// Sets a maximum dimension size for the window
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn with_max_dimensions ( mut self , max_size : LogicalSize ) -> WindowBuilder {
self . window . max_dimensions = Some ( max_size ) ;
2015-11-09 20:42:54 +11:00
self
}
2015-02-16 19:29:37 +11:00
2018-06-03 00:51:24 +10:00
/// Sets whether the window is resizable or not
///
2018-06-12 08:47:50 +10:00
/// Note that making the window unresizable doesn't exempt you from handling `Resized`, as that event can still be
/// triggered by DPI scaling, entering fullscreen mode, etc.
///
2018-06-03 00:51:24 +10:00
/// ## Platform-specific
///
2018-06-12 08:47:50 +10:00
/// This only has an effect on desktop platforms.
///
/// Due to a bug in XFCE, this has no effect on Xfwm.
2018-06-03 00:51:24 +10:00
#[ inline ]
pub fn with_resizable ( mut self , resizable : bool ) -> WindowBuilder {
self . window . resizable = resizable ;
self
}
2015-02-16 19:29:37 +11:00
/// Requests a specific title for the window.
2015-09-21 22:42:05 +10:00
#[ inline ]
2016-09-20 02:53:28 +10:00
pub fn with_title < T : Into < String > > ( mut self , title : T ) -> WindowBuilder {
2016-05-08 17:28:42 +10:00
self . window . title = title . into ( ) ;
2015-02-16 19:29:37 +11:00
self
}
2019-02-06 02:30:33 +11:00
/// Sets the window fullscreen state. None means a normal window, Some(MonitorHandle)
2017-09-07 18:33:46 +10:00
/// means a fullscreen window on that specific monitor
2015-09-21 22:42:05 +10:00
#[ inline ]
2019-02-06 02:30:33 +11:00
pub fn with_fullscreen ( mut self , monitor : Option < MonitorHandle > ) -> WindowBuilder {
2017-09-07 18:33:46 +10:00
self . window . fullscreen = monitor ;
2015-02-16 19:29:37 +11:00
self
}
2017-08-28 09:19:26 +10:00
/// Requests maximized mode.
#[ inline ]
pub fn with_maximized ( mut self , maximized : bool ) -> WindowBuilder {
self . window . maximized = maximized ;
self
}
2015-02-16 19:29:37 +11:00
/// Sets whether the window will be initially hidden or visible.
2015-09-21 22:42:05 +10:00
#[ inline ]
2016-02-23 22:56:23 +11:00
pub fn with_visibility ( mut self , visible : bool ) -> WindowBuilder {
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.
2015-09-21 22:42:05 +10:00
#[ inline ]
2016-02-23 22:56:23 +11:00
pub fn with_transparency ( mut self , transparent : bool ) -> WindowBuilder {
2015-09-21 21:15:43 +10:00
self . window . transparent = transparent ;
2015-05-15 23:19:33 +10:00
self
}
/// Sets whether the window should have a border, a title bar, etc.
2015-09-21 22:42:05 +10:00
#[ inline ]
2016-02-23 22:56:23 +11:00
pub fn with_decorations ( mut self , decorations : bool ) -> WindowBuilder {
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.
#[ inline ]
pub fn with_always_on_top ( mut self , always_on_top : bool ) -> WindowBuilder {
self . window . always_on_top = always_on_top ;
self
}
2018-05-08 07:36:21 +10:00
/// Sets the window icon. On Windows and X11, this is typically the small icon in the top-left
/// corner of the titlebar.
///
/// ## Platform-specific
///
/// This only has an effect on Windows and X11.
///
/// On Windows, this 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.
///
/// 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.
#[ inline ]
pub fn with_window_icon ( mut self , window_icon : Option < Icon > ) -> WindowBuilder {
self . window . window_icon = window_icon ;
self
}
2017-10-17 22:56:38 +11:00
/// Enables multitouch.
2015-09-21 22:42:05 +10:00
#[ inline ]
2016-02-23 22:56:23 +11:00
pub fn with_multitouch ( mut self ) -> WindowBuilder {
2015-09-21 21:15:43 +10:00
self . window . multitouch = true ;
2015-06-05 23:38:21 +10:00
self
}
2015-02-16 19:29:37 +11:00
/// Builds the window.
///
/// Error should be very rare and only occur in case of permission denied, incompatible system,
2015-05-15 23:19:33 +10:00
/// out of memory, etc.
2018-06-15 09:42:18 +10:00
#[ inline ]
2019-02-06 02:30:33 +11:00
pub fn build < T : 'static > ( mut self , window_target : & EventLoopWindowTarget < T > ) -> Result < Window , CreationError > {
2018-05-08 07:36:21 +10:00
self . window . dimensions = Some ( self . window . dimensions . unwrap_or_else ( | | {
2017-09-07 18:33:46 +10:00
if let Some ( ref monitor ) = self . window . fullscreen {
2018-05-08 07:36:21 +10:00
// resizing the window to the dimensions of the monitor when fullscreen
2018-06-15 09:42:18 +10:00
LogicalSize ::from_physical ( monitor . get_dimensions ( ) , 1.0 )
2018-05-08 07:36:21 +10:00
} else {
// default dimensions
2018-06-15 09:42:18 +10:00
( 1024 , 768 ) . into ( )
2017-08-28 09:22:26 +10:00
}
2018-05-08 07:36:21 +10:00
} ) ) ;
2015-02-16 19:29:37 +11:00
// building
2019-02-06 02:30:33 +11:00
platform_impl ::Window ::new (
& window_target . p ,
2018-05-08 07:36:21 +10:00
self . window ,
self . platform_specific ,
) . map ( | window | Window { window } )
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-02-06 02:30:33 +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.
#[ inline ]
2019-02-06 02:30:33 +11:00
pub fn new < T : 'static > ( event_loop : & EventLoopWindowTarget < T > ) -> Result < Window , CreationError > {
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
}
/// Modifies the title of the window.
///
/// This is a no-op if the window has already been closed.
#[ inline ]
pub fn set_title ( & self , title : & str ) {
self . window . set_title ( title )
}
/// Shows the window if it was hidden.
///
/// ## Platform-specific
///
/// - Has no effect on Android
///
#[ inline ]
pub fn show ( & self ) {
self . window . show ( )
}
/// Hides the window if it was visible.
///
/// ## Platform-specific
///
/// - Has no effect on Android
///
#[ inline ]
pub fn hide ( & self ) {
self . window . hide ( )
}
2019-02-06 02:30:33 +11:00
/// Emits a `WindowEvent::RedrawRequested` event in the associated event loop after all OS
/// events have been processed by the event loop.
///
/// This is the **strongly encouraged** method of redrawing windows, as it can integrates with
/// OS-requested redraws (e.g. when a window gets resized).
///
/// This function can cause `RedrawRequested` events to be emitted after `Event::EventsCleared`
/// but before `Event::NewEvents` if called in the following circumstances:
/// * While processing `EventsCleared`.
/// * While processing a `RedrawRequested` event that was sent during `EventsCleared` or any
/// directly subsequent `RedrawRequested` event.
pub fn request_redraw ( & self ) {
self . window . request_redraw ( )
}
2015-02-16 19:29:37 +11:00
/// Returns the position of the top-left hand corner of the window relative to the
/// top-left hand corner of the desktop.
///
2015-03-26 14:44:21 +11:00
/// Note that the top-left hand corner of the desktop is not necessarily the same as
2015-02-16 19:29:37 +11: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.
///
/// The coordinates can be negative if the top-left hand corner of the window is outside
/// of the visible screen region.
///
/// Returns `None` if the window no longer exists.
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn get_position ( & self ) -> Option < LogicalPosition > {
2015-02-16 19:29:37 +11:00
self . window . get_position ( )
}
2018-04-17 11:40:30 +10:00
/// 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.
///
/// The same conditions that apply to `get_position` apply to this method.
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn get_inner_position ( & self ) -> Option < LogicalPosition > {
2018-04-17 11:40:30 +10:00
self . window . get_inner_position ( )
}
2015-02-16 19:29:37 +11:00
/// Modifies the position of the window.
///
2017-10-17 22:56:38 +11:00
/// See `get_position` for more information about the coordinates.
2015-02-16 19:29:37 +11:00
///
/// This is a no-op if the window has already been closed.
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn set_position ( & self , position : LogicalPosition ) {
self . window . set_position ( position )
2015-02-16 19:29:37 +11:00
}
2018-06-15 09:42:18 +10:00
/// Returns the logical 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
///
2018-06-15 09:42:18 +10:00
/// Converting the returned `LogicalSize` to `PhysicalSize` produces the size your framebuffer should be.
2015-07-25 21:40:33 +10:00
///
/// Returns `None` if the window no longer exists.
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn get_inner_size ( & self ) -> Option < LogicalSize > {
2017-10-17 22:56:38 +11:00
self . window . get_inner_size ( )
2015-07-25 21:40:33 +10:00
}
2018-06-15 09:42:18 +10:00
/// Returns the logical size of the entire window.
2015-02-16 19:29:37 +11:00
///
2018-06-15 09:42:18 +10:00
/// These dimensions include the title bar and borders. If you don't want that (and you usually don't),
/// use `get_inner_size` instead.
2015-02-16 19:29:37 +11:00
///
/// Returns `None` if the window no longer exists.
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn get_outer_size ( & self ) -> Option < LogicalSize > {
2015-02-16 19:29:37 +11:00
self . window . get_outer_size ( )
}
/// Modifies the inner size of the window.
///
2017-10-17 22:56:38 +11:00
/// See `get_inner_size` for more information about the values.
2015-02-16 19:29:37 +11:00
///
/// This is a no-op if the window has already been closed.
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn set_inner_size ( & self , size : LogicalSize ) {
self . window . set_inner_size ( size )
2015-02-16 19:29:37 +11:00
}
2018-03-23 20:35:35 +11:00
/// Sets a minimum dimension size for the window.
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn set_min_dimensions ( & self , dimensions : Option < LogicalSize > ) {
2018-03-23 20:35:35 +11:00
self . window . set_min_dimensions ( dimensions )
}
/// Sets a maximum dimension size for the window.
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn set_max_dimensions ( & self , dimensions : Option < LogicalSize > ) {
2018-03-23 20:35:35 +11:00
self . window . set_max_dimensions ( dimensions )
}
2018-06-12 08:47:50 +10:00
/// 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
/// triggered by DPI scaling, entering fullscreen mode, etc.
///
/// ## Platform-specific
///
/// This only has an effect on desktop platforms.
///
/// Due to a bug in XFCE, this has no effect on Xfwm.
#[ inline ]
pub fn set_resizable ( & self , resizable : bool ) {
self . window . set_resizable ( resizable )
}
2018-06-15 09:42:18 +10:00
/// Returns the DPI factor that can be used to map logical pixels to physical pixels, and vice versa.
///
/// See the [`dpi`](dpi/index.html) module for more information.
///
2018-07-17 00:44:29 +10:00
/// Note that this value can change depending on user action (for example if the window is
/// moved to another screen); as such, tracking `WindowEvent::HiDpiFactorChanged` events is
/// the most robust way to track the DPI you need to use to draw.
///
2018-06-15 09:42:18 +10:00
/// ## Platform-specific
///
2019-04-08 02:48:21 +10:00
/// - **X11:** This respects Xft.dpi, and can be overridden using the `WINIT_HIDPI_FACTOR` environment variable.
2018-06-15 09:42:18 +10:00
/// - **Android:** Always returns 1.0.
2015-02-21 07:32:40 +11:00
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn get_hidpi_factor ( & self ) -> f64 {
self . window . get_hidpi_factor ( )
2015-02-21 07:32:40 +11:00
}
2015-02-16 19:29:37 +11:00
/// Modifies the mouse cursor of the window.
/// Has no effect on Android.
2018-06-15 09:42:18 +10:00
#[ inline ]
2015-02-16 19:29:37 +11:00
pub fn set_cursor ( & self , cursor : MouseCursor ) {
self . window . set_cursor ( cursor ) ;
}
2015-03-10 20:29:07 +11:00
/// Changes the position of the cursor in window coordinates.
2015-09-21 22:42:05 +10:00
#[ inline ]
2018-06-20 00:30:15 +10:00
pub fn set_cursor_position ( & self , position : LogicalPosition ) -> Result < ( ) , String > {
2018-06-15 09:42:18 +10:00
self . window . set_cursor_position ( position )
2015-03-10 20:29:07 +11:00
}
2015-01-25 22:06:50 +11:00
2018-06-19 02:32:18 +10:00
/// Grabs the cursor, preventing it from leaving the window.
2015-03-27 03:04:01 +11:00
///
2018-06-19 02:32:18 +10:00
/// ## Platform-specific
///
/// On macOS, this presently merely locks the cursor in a fixed location, which looks visually awkward.
///
/// This has no effect on Android or iOS.
#[ inline ]
pub fn grab_cursor ( & self , grab : bool ) -> Result < ( ) , String > {
self . window . grab_cursor ( grab )
}
/// Hides the cursor, making it invisible but still usable.
///
/// ## Platform-specific
///
/// On Windows and X11, the cursor is only hidden within the confines of the window.
///
/// On macOS, the cursor is hidden as long as the window has input focus, even if the cursor is outside of the
/// window.
///
/// This has no effect on Android or iOS.
2015-09-21 22:42:05 +10:00
#[ inline ]
2018-06-19 02:32:18 +10:00
pub fn hide_cursor ( & self , hide : bool ) {
self . window . hide_cursor ( hide )
2015-01-25 22:06:50 +11:00
}
2017-01-29 01:05:36 +11:00
2017-08-28 09:19:26 +10:00
/// Sets the window to maximized or back
#[ inline ]
pub fn set_maximized ( & self , maximized : bool ) {
self . window . set_maximized ( maximized )
}
2017-08-28 09:22:26 +10:00
/// Sets the window to fullscreen or back
#[ inline ]
2019-02-06 02:30:33 +11:00
pub fn set_fullscreen ( & self , monitor : Option < MonitorHandle > ) {
2017-09-07 18:33:46 +10:00
self . window . set_fullscreen ( monitor )
}
2019-04-26 03:09:32 +10:00
/// Gets the window's current fullscreen state.
#[ inline ]
pub fn get_fullscreen ( & self ) -> Option < MonitorHandle > {
self . window . get_fullscreen ( )
}
2017-12-22 23:50:46 +11:00
/// Turn window decorations on or off.
#[ inline ]
pub fn set_decorations ( & self , decorations : bool ) {
self . window . set_decorations ( decorations )
}
2018-05-21 00:24:05 +10:00
/// Change whether or not the window will always be on top of other windows.
#[ inline ]
pub fn set_always_on_top ( & self , always_on_top : bool ) {
self . window . set_always_on_top ( always_on_top )
}
2018-05-08 07:36:21 +10:00
/// Sets the window icon. On Windows and X11, this is typically the small icon in the top-left
/// corner of the titlebar.
///
/// For more usage notes, see `WindowBuilder::with_window_icon`.
///
/// ## Platform-specific
///
/// This only has an effect on Windows and X11.
#[ 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.
2018-05-18 11:28:30 +10:00
#[ inline ]
2018-06-15 09:42:18 +10:00
pub fn set_ime_spot ( & self , position : LogicalPosition ) {
self . window . set_ime_spot ( position )
2018-05-18 11:28:30 +10:00
}
2018-04-14 04:51:10 +10:00
/// Returns the monitor on which the window currently resides
2018-06-15 09:42:18 +10:00
#[ inline ]
2019-02-06 02:30:33 +11:00
pub fn get_current_monitor ( & self ) -> MonitorHandle {
2017-09-07 18:33:46 +10:00
self . window . get_current_monitor ( )
2017-08-28 09:22:26 +10:00
}
2018-06-17 00:14:12 +10:00
/// Returns the list of all the monitors available on the system.
///
2019-02-06 02:30:33 +11:00
/// This is the same as `EventLoop::get_available_monitors`, and is provided for convenience.
2018-06-17 00:14:12 +10:00
#[ inline ]
pub fn get_available_monitors ( & self ) -> AvailableMonitorsIter {
let data = self . window . get_available_monitors ( ) ;
AvailableMonitorsIter { data : data . into_iter ( ) }
}
/// Returns the primary monitor of the system.
///
2019-02-06 02:30:33 +11:00
/// This is the same as `EventLoop::get_primary_monitor`, and is provided for convenience.
2018-06-17 00:14:12 +10:00
#[ inline ]
2019-02-06 02:30:33 +11:00
pub fn get_primary_monitor ( & self ) -> MonitorHandle {
MonitorHandle { inner : self . window . get_primary_monitor ( ) }
2018-06-17 00:14:12 +10:00
}
2019-02-06 02:30:33 +11:00
/// Returns an identifier unique to the window.
2017-01-29 01:05:36 +11:00
#[ inline ]
2017-02-03 19:13:11 +11:00
pub fn id ( & self ) -> WindowId {
WindowId ( self . window . id ( ) )
2017-01-29 01:05:36 +11:00
}
2015-02-16 19:29:37 +11:00
}
2019-02-06 02:30:33 +11:00
/// Error that can happen while creating a window or a headless renderer.
#[ derive(Debug, Clone) ]
pub enum CreationError {
OsError ( String ) ,
/// TODO: remove this error
NotSupported ,
2015-02-16 19:29:37 +11:00
}
2019-02-06 02:30:33 +11:00
impl CreationError {
fn to_string ( & self ) -> & str {
match * self {
CreationError ::OsError ( ref text ) = > & text ,
CreationError ::NotSupported = > " Some of the requested attributes are not supported " ,
}
2015-03-16 23:50:23 +11:00
}
2015-02-16 19:29:37 +11:00
}
2019-02-06 02:30:33 +11:00
impl fmt ::Display for CreationError {
fn fmt ( & self , formatter : & mut fmt ::Formatter ) -> Result < ( ) , fmt ::Error > {
formatter . write_str ( self . to_string ( ) )
2015-03-17 07:52:58 +11:00
}
2019-02-06 02:30:33 +11:00
}
2015-03-17 07:52:58 +11:00
2019-02-06 02:30:33 +11:00
impl error ::Error for CreationError {
fn description ( & self ) -> & str {
self . to_string ( )
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-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)) ]
pub enum MouseCursor {
/// 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 ,
Grab ,
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-02-06 02:30:33 +11:00
impl Default for MouseCursor {
fn default ( ) -> Self {
MouseCursor ::Default
2017-10-17 22:56:38 +11:00
}
2015-02-16 19:29:37 +11:00
}