Releases: rust-windowing/winit
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.
Winit version 0.29.15
- On X11, fix crash due to xsettings query on systems with incomplete xsettings.
Winit version 0.29.14
- On X11/Wayland, fix
text
andtext_with_all_modifiers
not beingNone
during compose. - On Wayland, don't reapply cursor grab when unchanged.
- On X11, fix a bug where some mouse events would be unexpectedly filtered out.
Winit version 0.29.13
- On Web, fix possible crash with
ControlFlow::Wait
andControlFlow::WaitUntil
.
Winit version 0.29.12
- On X11, fix use after free during xinput2 handling.
- On X11, filter close to zero values in mouse device events
Winit version 0.29.11 [yanked]
- On Wayland, fix DeviceEvent::Motion not being sent
- On X11, don't require XIM to run.
- On X11, fix xkb state not being updated correctly sometimes leading to wrong input.
- Fix compatibility with 32-bit platforms without 64-bit atomics.
- On macOS, fix incorrect IME cursor rect origin.
- On X11, fix swapped instance and general class names.
- On Windows, fixed a race condition when sending an event through the loop proxy.
- On Wayland, disable
Occluded
event handling. - On X11, reload dpi on
_XSETTINGS_SETTINGS
update. - On X11, fix deadlock when adjusting DPI and resizing at the same time.
- On Wayland, fix
Focused(false)
being send when other seats still have window focused. - On Wayland, fix
Window::set_{min,max}_inner_size
not always applied. - On Windows, fix inconsistent resizing behavior with multi-monitor setups when repositioning outside the event loop.
- On Wayland, fix
WAYLAND_SOCKET
not used when detecting platform. - On Orbital, fix
logical_key
andtext
not reported inKeyEvent
. - On Orbital, implement
KeyEventExtModifierSupplement
. - On Orbital, map keys to
NamedKey
when possible. - On Orbital, implement
set_cursor_grab
. - On Orbital, implement
set_cursor_visible
. - On Orbital, implement
drag_window
. - On Orbital, implement
drag_resize_window
. - On Orbital, implement
set_transparent
. - On Orbital, implement
set_visible
. - On Orbital, implement
is_visible
. - On Orbital, implement
set_resizable
. - On Orbital, implement
is_resizable
. - On Orbital, implement
set_maximized
. - On Orbital, implement
is_maximized
. - On Orbital, implement
set_decorations
. - On Orbital, implement
is_decorated
. - On Orbital, implement
set_window_level
. - On Orbital, emit
DeviceEvent::MouseMotion
. - On Wayland, fix title in CSD not updated from
AboutToWait
.
Winit version 0.29.10
- On Web, account for canvas being focused already before event loop starts.
- On Web, increase cursor position accuracy.
Winit version 0.29.9
- On X11, fix
NotSupported
error not propagated when creating event loop. - On Wayland, fix resize not issued when scale changes
- On X11 and Wayland, fix arrow up on keypad reported as
ArrowLeft
. - On macOS, report correct logical key when Ctrl or Cmd is pressed.
Winit version 0.29.8
- On X11, fix IME input lagging behind.
- On X11, fix
ModifiersChanged
not sent from xdotool-like input - On X11, fix keymap not updated from xmodmap.
- On X11, reduce the amount of time spent fetching screen resources.
- On Wayland, fix
Window::request_inner_size
being overwritten by resize. - On Wayland, fix
Window::inner_size
not using the correct rounding.
Winit version 0.29.7
- On X11, fix
Xft.dpi
reload during runtime. - On X11, fix window minimize.