Expand description
§Changelog and migrations
All notable changes to this project will be documented in this module, along with migration instructions for larger changes.
§0.30.3
§Added
- On Web, add
EventLoopExtWebSys::(set_)poll_strategy()to allow setting control flow strategies before starting the event loop. - On Web, add
WaitUntilStrategy, which allows to set different strategies forControlFlow::WaitUntil. By default the Prioritized Task Scheduling API is used, with a fallback tosetTimeout()with a trick to circumvent throttling to 4ms. But an option to use a Web worker to schedule the timer is available as well, which commonly prevents any throttling when the window is not focused.
§Changed
- On macOS, set the window theme on the
NSWindowinstead of application-wide.
§Fixed
- On X11, build on arm platforms.
- On macOS, fixed
WindowBuilder::with_themenot having any effect on the window.
§0.30.2
§Fixed
- On Web, fix
EventLoopProxy::send_event()triggering event loop immediately when not called from inside the event loop. Now queues a microtask instead. - On Web, stop overwriting default cursor with
CursorIcon::Default. - On Web, prevent crash when using
InnerSizeWriter::request_inner_size(). - On macOS, fix not working opacity for entire window.
§0.30.1
§Added
- Reexport
raw-window-handleversions 0.4 and 0.5 asraw_window_handle_04andraw_window_handle_05. - Implement
ApplicationHandlerfor&mutreferences and heap allocations to something that implementsApplicationHandler.
§Fixed
- On macOS, fix panic on exit when dropping windows outside the event loop.
- On macOS, fix window dragging glitches when dragging across a monitor boundary with different scale factor.
- On macOS, fix the range in
Ime::Preedit. - On macOS, use the system’s internal mechanisms for queuing events.
- On macOS, handle events directly instead of queuing when possible.
§0.30.0
§Added
- Add
OwnedDisplayHandletype for allowing safe display handle usage outside of trivial cases. - Add
ApplicationHandler<T>trait which mimicsEvent<T>. - Add
WindowBuilder::with_cursorandWindow::set_cursorwhich takes aCursorIconorCustomCursor. - Add
Syncimplementation forEventLoopProxy<T: Send>. - Add
Window::default_attributesto get defaultWindowAttributes. - Add
EventLoop::builderto getEventLoopBuilderwithout export. - Add
CustomCursor::from_rgbato allow creating cursor images from RGBA data. - Add
CustomCursorExtWebSys::from_urlto allow loading cursor images from URLs. - Add
CustomCursorExtWebSys::from_animationto allow creating animated cursors from otherCustomCursors. - Add
{Active,}EventLoop::create_custom_cursorto load custom cursor image sources. - Add
ActiveEventLoop::create_windowandEventLoop::create_window. - Add
CustomCursorwhich could be set viaWindow::set_cursor, implemented on Windows, macOS, X11, Wayland, and Web. - On Web, add to toggle calling
Event.preventDefault()onWindow. - On iOS, add
PinchGesture,DoubleTapGesture,PanGestureandRotationGesture. - on iOS, use
UIGestureRecognizerDelegatefor fine grained control of gesture recognizers. - On macOS, add services menu.
- On Windows, add
with_title_text_color, andwith_corner_preferenceonWindowAttributesExtWindows. - On Windows, implement resize increments.
- On Windows, add
AnyThreadAPI to access window handle off the main thread.
§Changed
- Bump MSRV from
1.65to1.70. - On Wayland, bump
sctk-adwaitato0.9.0, which changed system library crates. This change is a cascading breaking change, you must do breaking change as well, even if you don’t expose winit. - Rename
TouchpadMagnifytoPinchGesture. - Rename
SmartMagnifytoDoubleTapGesture. - Rename
TouchpadRotatetoRotationGesture. - Rename
EventLoopWindowTargettoActiveEventLoop. - Rename
platform::x11::XWindowTypetoplatform::x11::WindowType. - Rename
VideoModetoVideoModeHandleto represent that it doesn’t hold static data. - Make
Debugformatting ofWindowIdmore concise. - Move
dpitypes to its own crate, and re-export it from the root crate. - Replace
logwithtracing, uselogfeature ontracingto restore old behavior. EventLoop::with_user_eventnow returnsEventLoopBuilder.- On Web, return
HandleError::Unavailablewhen a window handle is not available. - On Web, return
RawWindowHandle::WebCanvasinstead ofRawWindowHandle::Web. - On Web, remove queuing fullscreen request in absence of transient activation.
- On iOS, return
HandleError::Unavailablewhen a window handle is not available. - On macOS, return
HandleError::Unavailablewhen a window handle is not available. - On Windows, remove
WS_CAPTION,WS_BORDER, andWS_EX_WINDOWEDGEstyles for child windows without decorations. - On Android, bump
ndkto0.9.0andandroid-activityto0.6.0, and remove unused direct dependency onndk-sys.
§Deprecated
-
Deprecate
EventLoop::run, useEventLoop::run_app. -
Deprecate
EventLoopExtRunOnDemand::run_on_demand, useEventLoop::run_app_on_demand. -
Deprecate
EventLoopExtPumpEvents::pump_events, useEventLoopExtPumpEvents::pump_app_events.The new
appAPIs accept a newly addedApplicationHandler<T>instead ofFn. The semantics are mostly the same, given that the capture list of the closure is your newState. Consider the following code:use winit::event::Event; use winit::event_loop::EventLoop; use winit::window::Window; struct MyUserEvent; let event_loop = EventLoop::<MyUserEvent>::with_user_event().build().unwrap(); let window = event_loop.create_window(Window::default_attributes()).unwrap(); let mut counter = 0; let _ = event_loop.run(move |event, event_loop| { match event { Event::AboutToWait => { window.request_redraw(); counter += 1; } Event::WindowEvent { window_id, event } => { // Handle window event. } Event::UserEvent(event) => { // Handle user event. } Event::DeviceEvent { device_id, event } => { // Handle device event. } _ => (), } });To migrate this code, you should move all the captured values into some newtype
Stateand implementApplicationHandlerfor this type. Finally, we move particularmatch eventarms into methods onApplicationHandler, for example:use winit::application::ApplicationHandler; use winit::event::{Event, WindowEvent, DeviceEvent, DeviceId}; use winit::event_loop::{EventLoop, ActiveEventLoop}; use winit::window::{Window, WindowId}; struct MyUserEvent; struct State { window: Window, counter: i32, } impl ApplicationHandler<MyUserEvent> for State { fn user_event(&mut self, event_loop: &ActiveEventLoop, user_event: MyUserEvent) { // Handle user event. } fn resumed(&mut self, event_loop: &ActiveEventLoop) { // Your application got resumed. } fn window_event(&mut self, event_loop: &ActiveEventLoop, window_id: WindowId, event: WindowEvent) { // Handle window event. } fn device_event(&mut self, event_loop: &ActiveEventLoop, device_id: DeviceId, event: DeviceEvent) { // Handle device event. } fn about_to_wait(&mut self, event_loop: &ActiveEventLoop) { self.window.request_redraw(); self.counter += 1; } } let event_loop = EventLoop::<MyUserEvent>::with_user_event().build().unwrap(); #[allow(deprecated)] let window = event_loop.create_window(Window::default_attributes()).unwrap(); let mut state = State { window, counter: 0 }; let _ = event_loop.run_app(&mut state);Please submit your feedback after migrating in this issue.
-
Deprecate
Window::set_cursor_icon, useWindow::set_cursor.
§Removed
-
Remove
Window::new, useActiveEventLoop::create_windowinstead.You now have to create your windows inside the actively running event loop (usually the
new_events(cause: StartCause::Init)orresumed()events), and can no longer do it before the application has properly launched. This change is done to fix many long-standing issues on iOS and macOS, and will improve things on Wayland once fully implemented.To ease migration, we provide the deprecated
EventLoop::create_windowthat will allow you to bypass this restriction in this release.Using the migration example from above, you can change your code as follows:
use winit::application::ApplicationHandler; use winit::event::{Event, WindowEvent, DeviceEvent, DeviceId}; use winit::event_loop::{EventLoop, ActiveEventLoop}; use winit::window::{Window, WindowId}; #[derive(Default)] struct State { // Use an `Option` to allow the window to not be available until the // application is properly running. window: Option<Window>, counter: i32, } impl ApplicationHandler for State { // This is a common indicator that you can create a window. fn resumed(&mut self, event_loop: &ActiveEventLoop) { self.window = Some(event_loop.create_window(Window::default_attributes()).unwrap()); } fn window_event(&mut self, event_loop: &ActiveEventLoop, window_id: WindowId, event: WindowEvent) { // `unwrap` is fine, the window will always be available when // receiving a window event. let window = self.window.as_ref().unwrap(); // Handle window event. } fn device_event(&mut self, event_loop: &ActiveEventLoop, device_id: DeviceId, event: DeviceEvent) { // Handle window event. } fn about_to_wait(&mut self, event_loop: &ActiveEventLoop) { if let Some(window) = self.window.as_ref() { window.request_redraw(); self.counter += 1; } } } let event_loop = EventLoop::new().unwrap(); let mut state = State::default(); let _ = event_loop.run_app(&mut state); -
Remove
Derefimplementation forEventLoopthat gaveEventLoopWindowTarget. -
Remove
WindowBuilderin favor ofWindowAttributes. -
Remove Generic parameter
TfromActiveEventLoop. -
Remove
EventLoopBuilder::with_user_event, useEventLoop::with_user_event. -
Remove Redundant
EventLoopError::AlreadyRunning. -
Remove
WindowAttributes::fullscreenand expose as field directly. -
On X11, remove
platform::x11::XNotSupportedexport.
§Fixed
- On Web, fix setting cursor icon overriding cursor visibility.
- On Windows, fix cursor not confined to center of window when grabbed and hidden.
- On macOS, fix sequence of mouse events being out of order when dragging on the trackpad.
- On Wayland, fix decoration glitch on close with some compositors.
- On Android, fix a regression introduced in #2748 to allow volume key events to be received again.
- On Windows, don’t return a valid window handle outside of the GUI thread.
- On macOS, don’t set the background color when initializing a window with transparency.
Modules§
- 0.8.3
- 0.9.0
- 0.10.1
- 0.11.3
- 0.12.0
- 0.13.1
- 0.14.0
- 0.15.1
- 0.16.2
- 0.17.2
- 0.18.1
- 0.19.1
- 0.20.0
- 0.21.0
- 0.22.2
- 0.23.0
- 0.24.0
- 0.25.0
- 0.26.1
- 0.27.5
- 0.28.7
- 0.29.15
- 0.30.3