Winit version 0.30.0
Added
- Add
OwnedDisplayHandle
type for allowing safe display handle usage outside of
trivial cases. - Add
ApplicationHandler<T>
trait which mimicsEvent<T>
. - Add
WindowBuilder::with_cursor
andWindow::set_cursor
which takes a
CursorIcon
orCustomCursor
. - Add
Sync
implementation forEventLoopProxy<T: Send>
. - Add
Window::default_attributes
to get defaultWindowAttributes
. - Add
EventLoop::builder
to getEventLoopBuilder
without export. - Add
CustomCursor::from_rgba
to allow creating cursor images from RGBA data. - Add
CustomCursorExtWebSys::from_url
to allow loading cursor images from URLs. - Add
CustomCursorExtWebSys::from_animation
to allow creating animated
cursors from otherCustomCursor
s. - Add
{Active,}EventLoop::create_custom_cursor
to load custom cursor image sources. - Add
ActiveEventLoop::create_window
andEventLoop::create_window
. - Add
CustomCursor
which 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
,PanGesture
andRotationGesture
. - on iOS, use
UIGestureRecognizerDelegate
for fine grained control of gesture recognizers. - On macOS, add services menu.
- On Windows, add
with_title_text_color
, andwith_corner_preference
on
WindowAttributesExtWindows
. - On Windows, implement resize increments.
- On Windows, add
AnyThread
API to access window handle off the main thread.
Changed
- Bump MSRV from
1.65
to1.70
. - On Wayland, bump
sctk-adwaita
to0.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
TouchpadMagnify
toPinchGesture
. - Rename
SmartMagnify
toDoubleTapGesture
. - Rename
TouchpadRotate
toRotationGesture
. - Rename
EventLoopWindowTarget
toActiveEventLoop
. - Rename
platform::x11::XWindowType
toplatform::x11::WindowType
. - Rename
VideoMode
toVideoModeHandle
to represent that it doesn't hold
static data. - Make
Debug
formatting ofWindowId
more concise. - Move
dpi
types to its own crate, and re-export it from the root crate. - Replace
log
withtracing
, uselog
feature ontracing
to restore old
behavior. EventLoop::with_user_event
now returnsEventLoopBuilder
.- On Web, return
HandleError::Unavailable
when a window handle is not available. - On Web, return
RawWindowHandle::WebCanvas
instead ofRawWindowHandle::Web
. - On Web, remove queuing fullscreen request in absence of transient activation.
- On iOS, return
HandleError::Unavailable
when a window handle is not available. - On macOS, return
HandleError::Unavailable
when a window handle is not available. - On Windows, remove
WS_CAPTION
,WS_BORDER
, andWS_EX_WINDOWEDGE
styles
for child windows without decorations. - On Android, bump
ndk
to0.9.0
andandroid-activity
to0.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
app
APIs accept a newly addedApplicationHandler<T>
instead of
Fn
. 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
newtypeState
and implementApplicationHandler
for this type. Finally,
we move particularmatch event
arms 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_window
instead.You now have to create your windows inside the actively running event loop
(usually thenew_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_window
that
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
Deref
implementation forEventLoop
that gaveEventLoopWindowTarget
. -
Remove
WindowBuilder
in favor ofWindowAttributes
. -
Remove Generic parameter
T
fromActiveEventLoop
. -
Remove
EventLoopBuilder::with_user_event
, useEventLoop::with_user_event
. -
Remove Redundant
EventLoopError::AlreadyRunning
. -
Remove
WindowAttributes::fullscreen
and expose as field directly. -
On X11, remove
platform::x11::XNotSupported
export.
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.