2020-01-05 11:02:41 -05:00
|
|
|
//! Winit is a cross-platform window creation and event loop management library.
|
2014-08-02 20:49:48 +02:00
|
|
|
//!
|
2020-01-05 11:02:41 -05:00
|
|
|
//! # Building windows
|
2014-09-04 11:38:33 +02:00
|
|
|
//!
|
2019-02-05 10:30:33 -05:00
|
|
|
//! Before you can build a [`Window`], you first need to build an [`EventLoop`]. This is done with the
|
|
|
|
//! [`EventLoop::new()`] function.
|
2014-09-04 11:38:33 +02:00
|
|
|
//!
|
2017-01-28 15:33:54 +01:00
|
|
|
//! ```no_run
|
2019-02-05 10:30:33 -05:00
|
|
|
//! use winit::event_loop::EventLoop;
|
|
|
|
//! let event_loop = EventLoop::new();
|
2017-01-28 15:33:54 +01:00
|
|
|
//! ```
|
|
|
|
//!
|
2019-02-05 10:30:33 -05:00
|
|
|
//! Once this is done there are two ways to create a [`Window`]:
|
2017-01-28 15:33:54 +01:00
|
|
|
//!
|
2019-02-05 10:30:33 -05:00
|
|
|
//! - Calling [`Window::new(&event_loop)`][window_new].
|
|
|
|
//! - Calling [`let builder = WindowBuilder::new()`][window_builder_new] then [`builder.build(&event_loop)`][window_builder_build].
|
2014-08-02 20:49:48 +02:00
|
|
|
//!
|
2020-01-05 11:02:41 -05:00
|
|
|
//! The first method is the simplest, and will give you default values for everything. The second
|
|
|
|
//! method allows you to customize the way your [`Window`] will look and behave by modifying the
|
|
|
|
//! fields of the [`WindowBuilder`] object before you create the [`Window`].
|
2014-10-04 19:17:02 +02:00
|
|
|
//!
|
2019-02-05 10:30:33 -05:00
|
|
|
//! # Event handling
|
2014-10-04 19:17:02 +02:00
|
|
|
//!
|
2019-06-24 17:30:06 -04:00
|
|
|
//! Once a [`Window`] has been created, it will generate different *events*. A [`Window`] object can
|
2020-01-05 11:02:41 -05:00
|
|
|
//! generate [`WindowEvent`]s when certain input events occur, such as a cursor moving over the
|
|
|
|
//! window or a key getting pressed while the window is focused. Devices can generate
|
|
|
|
//! [`DeviceEvent`]s, which contain unfiltered event data that isn't specific to a certain window.
|
|
|
|
//! Some user activity, like mouse movement, can generate both a [`WindowEvent`] *and* a
|
|
|
|
//! [`DeviceEvent`]. You can also create and handle your own custom [`UserEvent`]s, if desired.
|
|
|
|
//!
|
2020-07-09 15:08:26 +00:00
|
|
|
//! You can retrieve events by calling [`EventLoop::run`][event_loop_run]. This function will
|
2020-01-05 11:02:41 -05:00
|
|
|
//! dispatch events for every [`Window`] that was created with that particular [`EventLoop`], and
|
|
|
|
//! will run until the `control_flow` argument given to the closure is set to
|
2022-01-11 01:23:20 +01:00
|
|
|
//! [`ControlFlow`]`::`[`ExitWithCode`] (which [`ControlFlow`]`::`[`Exit`] aliases to), at which
|
|
|
|
//! point [`Event`]`::`[`LoopDestroyed`] is emitted and the entire program terminates.
|
2017-01-28 15:33:54 +01:00
|
|
|
//!
|
2020-01-05 11:02:41 -05:00
|
|
|
//! Winit no longer uses a `EventLoop::poll_events() -> impl Iterator<Event>`-based event loop
|
2020-11-12 20:49:44 +01:00
|
|
|
//! model, since that can't be implemented properly on some platforms (e.g web, iOS) and works poorly on
|
|
|
|
//! most other platforms. However, this model can be re-implemented to an extent with
|
|
|
|
//! [`EventLoopExtRunReturn::run_return`]. See that method's documentation for more reasons about why
|
|
|
|
//! it's discouraged, beyond compatibility reasons.
|
2017-01-28 15:33:54 +01:00
|
|
|
//!
|
|
|
|
//!
|
|
|
|
//! ```no_run
|
2019-06-21 11:33:15 -04:00
|
|
|
//! use winit::{
|
|
|
|
//! event::{Event, WindowEvent},
|
2022-04-09 18:32:02 -07:00
|
|
|
//! event_loop::EventLoop,
|
2019-06-22 13:26:06 -04:00
|
|
|
//! window::WindowBuilder,
|
2019-06-21 11:33:15 -04:00
|
|
|
//! };
|
2019-06-22 13:26:06 -04:00
|
|
|
//!
|
|
|
|
//! let event_loop = EventLoop::new();
|
|
|
|
//! let window = WindowBuilder::new().build(&event_loop).unwrap();
|
2017-01-28 15:33:54 +01:00
|
|
|
//!
|
2019-02-05 10:30:33 -05:00
|
|
|
//! event_loop.run(move |event, _, control_flow| {
|
2020-01-05 11:02:41 -05:00
|
|
|
//! // ControlFlow::Poll continuously runs the event loop, even if the OS hasn't
|
|
|
|
//! // dispatched any events. This is ideal for games and similar applications.
|
2022-04-09 18:32:02 -07:00
|
|
|
//! control_flow.set_poll();
|
2020-01-05 11:02:41 -05:00
|
|
|
//!
|
|
|
|
//! // ControlFlow::Wait pauses the event loop if no events are available to process.
|
|
|
|
//! // This is ideal for non-game applications that only update in response to user
|
|
|
|
//! // input, and uses significantly less power/CPU time than ControlFlow::Poll.
|
2022-04-09 18:32:02 -07:00
|
|
|
//! control_flow.set_wait();
|
2020-01-05 11:02:41 -05:00
|
|
|
//!
|
2017-01-28 15:33:54 +01:00
|
|
|
//! match event {
|
2020-01-05 11:02:41 -05:00
|
|
|
//! Event::WindowEvent {
|
|
|
|
//! event: WindowEvent::CloseRequested,
|
|
|
|
//! ..
|
|
|
|
//! } => {
|
|
|
|
//! println!("The close button was pressed; stopping");
|
2022-04-09 18:32:02 -07:00
|
|
|
//! control_flow.set_exit();
|
2020-01-05 11:02:41 -05:00
|
|
|
//! },
|
2019-07-30 23:31:12 -07:00
|
|
|
//! Event::MainEventsCleared => {
|
2019-06-22 13:26:06 -04:00
|
|
|
//! // Application update code.
|
2019-07-09 22:43:15 -06:00
|
|
|
//!
|
2019-06-22 13:26:06 -04:00
|
|
|
//! // Queue a RedrawRequested event.
|
2020-04-19 14:09:08 -07:00
|
|
|
//! //
|
|
|
|
//! // You only need to call this if you've determined that you need to redraw, in
|
|
|
|
//! // applications which do not always need to. Applications that redraw continuously
|
|
|
|
//! // can just render here instead.
|
2019-06-22 13:26:06 -04:00
|
|
|
//! window.request_redraw();
|
|
|
|
//! },
|
2019-07-30 23:31:12 -07:00
|
|
|
//! Event::RedrawRequested(_) => {
|
2019-06-22 13:26:06 -04:00
|
|
|
//! // Redraw the application.
|
|
|
|
//! //
|
2020-04-19 14:09:08 -07:00
|
|
|
//! // It's preferable for applications that do not render continuously to render in
|
|
|
|
//! // this event rather than in MainEventsCleared, since rendering in here allows
|
|
|
|
//! // the program to gracefully handle redraws requested by the OS.
|
2019-06-22 13:26:06 -04:00
|
|
|
//! },
|
2020-01-05 11:02:41 -05:00
|
|
|
//! _ => ()
|
2017-01-28 15:33:54 +01:00
|
|
|
//! }
|
|
|
|
//! });
|
|
|
|
//! ```
|
|
|
|
//!
|
2020-01-05 11:02:41 -05:00
|
|
|
//! [`Event`]`::`[`WindowEvent`] has a [`WindowId`] member. In multi-window environments, it should be
|
|
|
|
//! compared to the value returned by [`Window::id()`][window_id_fn] to determine which [`Window`]
|
|
|
|
//! dispatched the event.
|
2014-10-04 19:17:02 +02:00
|
|
|
//!
|
2016-11-03 09:49:19 +01:00
|
|
|
//! # Drawing on the window
|
|
|
|
//!
|
2020-01-05 11:02:41 -05:00
|
|
|
//! Winit doesn't directly provide any methods for drawing on a [`Window`]. However it allows you to
|
2022-07-21 22:22:36 +03:00
|
|
|
//! retrieve the raw handle of the window and display (see the [`platform`] module and/or the
|
|
|
|
//! [`raw_window_handle`] and [`raw_display_handle`] methods), which in turn allows
|
|
|
|
//! you to create an OpenGL/Vulkan/DirectX/Metal/etc. context that can be used to render graphics.
|
2019-02-05 10:30:33 -05:00
|
|
|
//!
|
2020-04-20 00:04:30 -04:00
|
|
|
//! Note that many platforms will display garbage data in the window's client area if the
|
|
|
|
//! application doesn't render anything to the window by the time the desktop compositor is ready to
|
|
|
|
//! display the window to the user. If you notice this happening, you should create the window with
|
|
|
|
//! [`visible` set to `false`](crate::window::WindowBuilder::with_visible) and explicitly make the
|
|
|
|
//! window visible only once you're ready to render into it.
|
|
|
|
//!
|
2019-11-11 18:05:59 -05:00
|
|
|
//! [`EventLoop`]: event_loop::EventLoop
|
2020-11-12 20:49:44 +01:00
|
|
|
//! [`EventLoopExtRunReturn::run_return`]: ./platform/run_return/trait.EventLoopExtRunReturn.html#tymethod.run_return
|
2019-11-11 18:05:59 -05:00
|
|
|
//! [`EventLoop::new()`]: event_loop::EventLoop::new
|
|
|
|
//! [event_loop_run]: event_loop::EventLoop::run
|
|
|
|
//! [`ControlFlow`]: event_loop::ControlFlow
|
|
|
|
//! [`Exit`]: event_loop::ControlFlow::Exit
|
2022-01-11 01:23:20 +01:00
|
|
|
//! [`ExitWithCode`]: event_loop::ControlFlow::ExitWithCode
|
2019-11-11 18:05:59 -05:00
|
|
|
//! [`Window`]: window::Window
|
2020-01-05 11:02:41 -05:00
|
|
|
//! [`WindowId`]: window::WindowId
|
2019-11-11 18:05:59 -05:00
|
|
|
//! [`WindowBuilder`]: window::WindowBuilder
|
|
|
|
//! [window_new]: window::Window::new
|
|
|
|
//! [window_builder_new]: window::WindowBuilder::new
|
|
|
|
//! [window_builder_build]: window::WindowBuilder::build
|
|
|
|
//! [window_id_fn]: window::Window::id
|
|
|
|
//! [`Event`]: event::Event
|
|
|
|
//! [`WindowEvent`]: event::WindowEvent
|
|
|
|
//! [`DeviceEvent`]: event::DeviceEvent
|
|
|
|
//! [`UserEvent`]: event::Event::UserEvent
|
|
|
|
//! [`LoopDestroyed`]: event::Event::LoopDestroyed
|
|
|
|
//! [`platform`]: platform
|
2020-04-19 11:58:58 -07:00
|
|
|
//! [`raw_window_handle`]: ./window/struct.Window.html#method.raw_window_handle
|
2022-07-21 22:22:36 +03:00
|
|
|
//! [`raw_display_handle`]: ./window/struct.Window.html#method.raw_display_handle
|
2014-08-02 20:49:48 +02:00
|
|
|
|
2019-06-18 02:27:00 +08:00
|
|
|
#![deny(rust_2018_idioms)]
|
2021-08-30 19:40:02 +02:00
|
|
|
#![deny(rustdoc::broken_intra_doc_links)]
|
2022-06-10 13:43:33 +03:00
|
|
|
#![deny(clippy::all)]
|
|
|
|
#![cfg_attr(feature = "cargo-clippy", deny(warnings))]
|
|
|
|
#![allow(clippy::missing_safety_doc)]
|
2019-06-18 02:27:00 +08:00
|
|
|
|
2020-01-09 22:29:31 -07:00
|
|
|
#[allow(unused_imports)]
|
2018-07-01 11:01:46 -04:00
|
|
|
#[macro_use]
|
|
|
|
extern crate log;
|
2018-11-01 04:24:56 -04:00
|
|
|
#[cfg(feature = "serde")]
|
|
|
|
#[macro_use]
|
|
|
|
extern crate serde;
|
2019-06-12 21:07:25 +03:00
|
|
|
#[macro_use]
|
2019-02-04 11:52:00 -05:00
|
|
|
extern crate bitflags;
|
2015-06-05 16:38:21 +03:00
|
|
|
#[cfg(any(target_os = "macos", target_os = "ios"))]
|
2015-03-22 01:31:32 -04:00
|
|
|
#[macro_use]
|
|
|
|
extern crate objc;
|
2014-10-04 15:49:39 +02:00
|
|
|
|
2018-06-14 19:42:18 -04:00
|
|
|
pub mod dpi;
|
2019-05-29 21:29:54 -04:00
|
|
|
#[macro_use]
|
|
|
|
pub mod error;
|
2019-02-05 10:30:33 -05:00
|
|
|
pub mod event;
|
|
|
|
pub mod event_loop;
|
2018-05-07 17:36:21 -04:00
|
|
|
mod icon;
|
2019-06-25 03:15:34 +02:00
|
|
|
pub mod monitor;
|
2019-02-05 10:30:33 -05:00
|
|
|
mod platform_impl;
|
|
|
|
pub mod window;
|
2015-09-21 09:15:53 +02:00
|
|
|
|
2019-02-05 10:30:33 -05:00
|
|
|
pub mod platform;
|