Expand description
§Changelog and migrations
All notable changes to this project will be documented in this module, along with migration instructions for larger changes. The format is based on Keep a Changelog.
The sections should follow the order Added, Changed, Deprecated,
Removed, and Fixed.
Platform specific changed should be added to the end of the section and grouped
by platform name. Common API additions should have , implemented at the end
for platforms where the API was initially implemented. See the following example
on how to add them:
### Added
- Add `Window::turbo()`, implemented on X11, Wayland, and Web.
- On X11, add `Window::some_rare_api`.
- On X11, add `Window::even_more_rare_api`.
- On Wayland, add `Window::common_api`.
- On Windows, add `Window::some_rare_api`.When the change requires non-trivial amount of work for users to comply with it, the migration guide should be added below the entry, like:
- Deprecate `Window` creation outside of `EventLoop::run`
This was done to simply migration in the future. Consider the
following code:
// Code snippet.
To migrate it we should do X, Y, and then Z, for example:
// Code snippet.
The migration guide could reference other migration examples in the current changelog entry.
§Unreleased
§Added
-
Add
ActiveEventLoop::create_proxy(). -
On Web, add
ActiveEventLoopExtWeb::is_cursor_lock_raw()to determine ifDeviceEvent::MouseMotionis returning raw data, not OS accelerated, when usingCursorGrabMode::Locked. -
On Web, implement
MonitorHandleandVideoModeHandle.Without prompting the user for permission, only the current monitor is returned. But when prompting and being granted permission through
ActiveEventLoop::request_detailed_monitor_permission(), access to all monitors and their details is available. Handles created with “detailed monitor permissions” can be used inWindow::set_fullscreen()as well.Keep in mind that handles do not auto-upgrade after permissions are granted and have to be re-created to make full use of this feature.
-
Implement
Clone,Copy,Debug,Deserialize,Eq,Hash,Ord,PartialEq,PartialOrdandSerializeon many types. -
Add
MonitorHandle::current_video_mode(). -
Add
ApplicationHandlerExtMacOStrait, and amacos_handlermethod toApplicationHandlerwhich returns adyn ApplicationHandlerExtMacOSwhich allows for macOS specific extensions to winit. -
Add a
standard_key_bindingmethod to theApplicationHandlerExtMacOStrait. This allows handling of standard keybindings such as “go to end of line” on macOS. -
On macOS, add
WindowExtMacOS::set_unified_titlebarandWindowAttributesMacOS::with_unified_titlebarto use a larger style of titlebar. -
Add
WindowId::into_raw()andfrom_raw(). -
Add
PointerKind,PointerSource,ButtonSource,FingerId,primaryandpositionto all pointer events as part of the pointer event overhaul. -
Add
DeviceId::into_raw()andfrom_raw(). -
Added
Window::surface_position, which is the position of the surface inside the window. -
Added
Window::safe_area, which describes the area of the surface that is unobstructed. -
On X11, Wayland, Windows and macOS, improved scancode conversions for more obscure key codes.
-
Add ability to make non-activating window on macOS using
NSPanelwithNSWindowStyleMask::NonactivatingPanel. -
Implement
MonitorHandleProviderforMonitorHandleto access common monitor API. -
On X11, set an “area” attribute on XIM input connection to convey the cursor area.
-
Implement
CustomCursorProviderforCustomCursorto access cursor API. -
Add
CustomCursorSource::Url,CustomCursorSource::from_animation. -
Implement
CustomIconProviderforRgbaIcon. -
Add
iconmodule that exposes winit’s icon API. -
VideoMode::newto create aVideoMode. -
keyboard::ModifiersKeyto track which modifier is exactly pressed. -
ActivationToken::as_rawto get a ref to raw token. -
Each platform now has corresponding
WindowAttributesstruct instead of trait extension. -
On Wayland, added implementation for
Window::set_window_icon -
On Wayland, added
PanGesture,PinchGesture, andRotationGesture -
Add
Window::request_ime_updateto atomically apply set of IME changes. -
Add
Ime::DeleteSurroundingto let the input method delete text. -
Add more
ImePurposevalues. -
Add
ImeHintsto request particular IME behaviour. -
Add Pen input support on Wayland, Windows, and Web via new Pointer event.
§Changed
-
Change
ActiveEventLoopandWindowto be traits, and addedcast_ref/cast_mut/castmethods to extract the backend type from those. -
ActiveEventLoop::create_windownow returnsBox<dyn Window>. -
ApplicationHandlernow usesdyn ActiveEventLoop. -
On Web, let events wake up event loop immediately when using
ControlFlow::Poll. -
Bump MSRV from
1.70to1.85. -
Changed
ApplicationHandler::user_eventtouser_wake_up, removing the generic user event.Winit will now only indicate that wake up happened, you will have to pair this with an external mechanism like
std::sync::mpsc::channelif you want to send specific data to be processed on the main thread. -
Changed
EventLoopProxy::send_eventtoEventLoopProxy::wake_up, it now only wakes up the loop. -
On X11, implement smooth resizing through the sync extension API.
-
ApplicationHandler::can_create|destroy_surfaces()was split off fromApplicationHandler::resumed/suspended().ApplicationHandler::can_create_surfaces()should, for portability reasons to Android, be the only place to create render surfaces.ApplicationHandler::resumed/suspended()are now only emitted by iOS, Web and Android, and now signify actually resuming/suspending the application. -
Rename
platform::web::*ExtWebSysto*ExtWeb. -
Change signature of
EventLoop::run_app,EventLoopExtPumpEvents::pump_app_eventsandEventLoopExtRunOnDemand::run_app_on_demandto accept aimpl ApplicationHandlerdirectly, instead of requiring a&mutreference to it. -
On Web,
Window::canvas()now returns a reference. -
On Web,
CursorGrabMode::Lockednow letsDeviceEvent::MouseMotionreturn raw data, not OS accelerated, if the browser supports it. -
(Active)EventLoop::create_custom_cursor()now returns aResult<CustomCursor, ExternalError>. -
Changed how
ModifiersStateis serialized by Serde. -
VideoModeHandle::refresh_rate_millihertz()andbit_depth()now return aOption<NonZero*>. -
MonitorHandle::position()now returns anOption. -
On macOS, remove custom application delegates. You are now allowed to override the application delegate yourself.
-
On X11, remove our dependency on libXcursor. (#3749)
-
Renamed the following APIs to make it clearer that the sizes apply to the underlying surface:
WindowEvent::ResizedtoSurfaceResized.InnerSizeWritertoSurfaceSizeWriter.WindowAttributes.inner_sizetosurface_size.WindowAttributes.min_inner_sizetomin_surface_size.WindowAttributes.max_inner_sizetomax_surface_size.WindowAttributes.resize_incrementstosurface_resize_increments.WindowAttributes::with_inner_sizetowith_surface_size.WindowAttributes::with_min_inner_sizetowith_min_surface_size.WindowAttributes::with_max_inner_sizetowith_max_surface_size.WindowAttributes::with_resize_incrementstowith_surface_resize_increments.Window::inner_sizetosurface_size.Window::request_inner_sizetorequest_surface_size.Window::set_min_inner_sizetoset_min_surface_size.Window::set_max_inner_sizetoset_max_surface_size.
To migrate, you can probably just replace all instances of
inner_sizewithsurface_sizein your codebase. -
Every event carrying a
DeviceIdnow usesOption<DeviceId>instead. ANonevalue signifies that the device can’t be uniquely identified. -
Pointer
WindowEvents were overhauled. The new events can handle any type of pointer, serving as a single pointer input source. Now your application can handle any pointer type without having to explicitly handle e.g.Touch:- Rename
CursorMovedtoPointerMoved. - Rename
CursorEnteredtoPointerEntered. - Rename
CursorLefttoPointerLeft. - Rename
MouseInputtoPointerButton. - Add
primaryto everyPointerEventas a way to identify discard non-primary pointers in a multi-touch interaction. - Add
positionto everyPointerEvent. PointerMovedis not sent afterPointerEnteredanymore.- Remove
Touch, which is folded into thePointer*events. - New
PointerKindadded toPointerEnteredandPointerLeft, signifying which pointer type is the source of this event. - New
PointerSourceadded toPointerMoved, similar toPointerKindbut holding additional data. - New
ButtonSourceadded toPointerButton, similar toPointerKindbut holding pointer type specific buttons. UseButtonSource::mouse_button()to easily normalize any pointer button type to a generic mouse button. - New
FingerIdadded toPointerKind::TouchandPointerSource::Touchable to uniquely identify a finger in a multi-touch interaction. Replaces the oldTouch::id. - In the same spirit rename
DeviceEvent::MouseMotiontoPointerMotion. - Remove
Force::Calibrated::altitude_angle.
- Rename
-
On X11, use bottom-right corner for IME hotspot in
Window::set_ime_cursor_area. -
On macOS and iOS, no longer emit
ScaleFactorChangedupon window creation. -
On macOS, no longer emit
Focusedupon window creation. -
On iOS, emit more events immediately, instead of queuing them.
-
Update
smol_strto version0.3 -
Rename
VideoModeHandletoVideoMode, now it only stores plain data. -
Make
Fullscreen::Exclusivecontain(MonitorHandle, VideoMode). -
Reworked the file drag-and-drop API.
-
On macOS, the default menu uses the bundle name or falls back to the process name as before.
The
WindowEvent::DroppedFile,WindowEvent::HoveredFileandWindowEvent::HoveredFileCancelledevents have been removed, and replaced withWindowEvent::DragEntered,WindowEvent::DragMoved,WindowEvent::DragDroppedandWindowEvent::DragLeft.The old drag-and-drop events were emitted once per file. This occurred when files were first hovered over the window, dropped, or left the window. The new drag-and-drop events are emitted once per set of files dragged, and include a list of all dragged files. They also include the pointer position.
The rough correspondence is:
WindowEvent::HoveredFile->WindowEvent::DragEnteredWindowEvent::DroppedFile->WindowEvent::DragDroppedWindowEvent::HoveredFileCancelled->WindowEvent::DragLeft
The
WindowEvent::DragMovedevent is entirely new, and is emitted whenever the pointer moves whilst files are being dragged over the window. It doesn’t contain any file paths, just the pointer position. -
Updated
objc2tov0.6. -
Updated
windows-systov0.59.- To match the corresponding changes in
windows-sys, theHWND,HMONITOR, andHMENUtypes now alias to*mut c_voidinstead ofisize.
- To match the corresponding changes in
-
Removed
KeyEventExtModifierSupplement, and made the fieldstext_with_all_modifiersandkey_without_modifierspublic onKeyEventinstead. -
Move
window::Fullscreentomonitor::Fullscreen. -
Renamed “super” key to “meta”, to match the naming in the W3C specification.
NamedKey::Superstill exists, but it’s non-functional and deprecated,NamedKey::Metashould be used instead. -
Move
IconExtWindowsintoWinIcon. -
Move
EventLoopExtPumpEventsandPumpStatusfrom platform module towinit::event_loop::pump_events. -
Move
EventLoopExtRunOnDemandfrom platform module towinit::event_loop::run_on_demand. -
Use
NamedKey,CodeandLocationfrom thekeyboard-typesv0.8 crate. -
Deprecate
Window::set_ime_allowed,Window::set_ime_cursor_area, andWindow::set_ime_purpose. -
Force::normalized()now takes aOption<ToolAngle>to calculate the perpendicular force. -
On Windows, don’t confine cursor to center of window when grabbed and hidden.
§Removed
-
Remove
Event. -
Remove already deprecated APIs:
EventLoop::create_window()EventLoop::run.EventLoopBuilder::new()EventLoopExtPumpEvents::pump_events.EventLoopExtRunOnDemand::run_on_demand.VideoModeWindowAttributes::new()Window::set_cursor_icon()
-
On iOS, remove
platform::ios::EventLoopExtIOSand relatedplatform::ios::Idiomtype.This feature was incomplete, and the equivalent functionality can be trivially achieved outside of
winitusingobjc2-ui-kitand callingUIDevice::currentDevice().userInterfaceIdiom(). -
On Web, remove unused
platform::web::CustomCursorError::Animation. -
Remove the
rwh_04andrwh_05cargo feature and the correspondingraw-window-handlev0.4 and v0.5 support. v0.6 remains in place and is enabled by default. -
Remove
DeviceEvent::AddedandDeviceEvent::Removed. -
Remove
DeviceEvent::MotionandWindowEvent::AxisMotion. -
Remove
MonitorHandle::size()andrefresh_rate_millihertz()in favor ofMonitorHandle::current_video_mode(). -
On Android, remove all
MonitorHandlesupport instead of emitting false data. -
Remove
impl From<u64> for WindowIdandimpl From<WindowId> for u64. Replaced withWindowId::into_raw()andfrom_raw(). -
Remove
dummy()fromWindowIdandDeviceId. -
Remove
WindowEvent::TouchandTouchin favor of the newPointerKind,PointerSourceandButtonSourceas part of the new pointer event overhaul. -
Remove
Force::altitude_angle. -
Remove
Window::inner_position, use the newWindow::surface_positioninstead. -
Remove
CustomCursorExtWeb, use theCustomCursorSource. -
Remove
CustomCursor::from_rgba, useCustomCursorSourceinstead. -
Remove
ApplicationHandler::exited, the event loop being shut down can now be listened to in theDropimpl on the application handler. -
Remove
NamedKey::Space, match onKey::Character(" ")instead. -
Remove
PartialEqimpl forWindowAttributes. -
WindowAttributesExt*platform extensions; useWindowAttributes*instead. -
Remove
Force::Calibrated::altitude_anglein favor ofToolAngle::altitude.
§Fixed
- On Orbital,
MonitorHandle::name()now returnsNoneinstead of a dummy name. - On Orbital, implement
fullscreen. - On iOS, fixed
SurfaceResizedandWindow::surface_sizenot reporting the size of the actual surface. - On macOS, fixed the scancode conversion for audio volume keys.
- On macOS, fixed the scancode conversion for
IntlBackslash. - On macOS, fixed redundant
SurfaceResizedevent at window creation. - On macOS, don’t panic on monitors with unknown bit-depths.
- On macOS, fixed crash when closing the window on macOS 26+.
- On Windows, account for mouse wheel lines per scroll setting for
WindowEvent::MouseWheel. - On Windows,
Window::themewill return the correct theme after setting it throughWindow::set_theme. - On Windows,
Window::set_themewill change the title bar color immediately now. - On Windows 11, prevent incorrect shifting when dragging window onto a monitor with different DPI.
- On Windows, avoid returning
SurfaceResizedwith size zero when an application is minimized. LetWindow::surface_sizereturn the pre-minimization window size even while minimized. - On Web, device events are emitted regardless of cursor type.
- On Wayland,
axis_value120scroll events now generateMouseScrollDelta::LineDelta - On X11, mouse scroll button events no longer cause duplicated
WindowEvent::MouseWheelevents.