winit
Cross-platform window creation library.
0.30.13
50M downloads/mo
#1216 most downloaded on crates.io
rust-windowing/winit
What this package is like to depend on
Last release 5 months ago
02 Mar 2026
Release timing varies
gaps range from 2 weeks to 4 months
Rarely documented
notes for 7 of 104 stable releases
5 versions withdrawn
withdrawn after publishing
10 years old
119 releases · first in 2016
3 releases in the last 12 months
see the full history below
Release timeline
119 releases · Mar 2016 to Mar 2026Releases
latest 60 of 119-
0.31.0-beta.216 Nov 2025 pre-releaseRelease notes
Open source →Added
- Add
EventLoopExtRegister::register_appfor being explicit about how the event loop runs on Web. - Add
EventLoopExtNeverReturn::run_app_never_returnfor being explicit about how the event loop runs on iOS.
Changed
- On Web, avoid throwing an exception in
EventLoop::run_app, instead preferring to return to the caller.
This requires passing a'staticapplication to ensure that the application state will live as long as necessary. - On Web, the event loop can now always be re-created once it has finished running.
Fixed
- Fixed panic when calling
Window::set_ime_allowed.
- Add
-
0.31.0-beta.116 Nov 2025 pre-releaseRelease notes
Open source →Added
-
Add
ActiveEventLoop::create_proxy(). -
On Web, add
ActiveEventLoopExtWeb::is_cursor_lock_raw()to determine if
DeviceEvent::MouseMotionis returning raw data, not OS accelerated, when using
CursorGrabMode::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 in
Window::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,PartialOrd
andSerializeon 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_titlebar
to 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/cast
methods 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 likestd::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 from
ApplicationHandler::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_eventsand
EventLoopExtRunOnDemand::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::HoveredFileCancelled
events 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_modifiersand
key_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
ofwinitusingobjc2-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 of
MonitorHandle::current_video_mode(). -
On Android, remove all
MonitorHandlesupport instead of emitting false data. -
Remove
impl From<u64> for WindowIdandimpl From<WindowId> for u64. Replaced with
WindowId::into_raw()andfrom_raw(). -
Remove
dummy()fromWindowIdandDeviceId. -
Remove
WindowEvent::TouchandTouchin favor of the newPointerKind,PointerSourceand
ButtonSourceas 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. - On macOS, fixed crash when dragging non-file content onto window.
-
-
0.30.1302 Mar 2026Release notes
Open source →Added
- On Wayland, add
Window::set_resize_increments.
Fixed
- On macOS, fixed crash when dragging non-file content onto window.
- On X11, fix
set_hittestnot working on some window managers. - On X11, fix debug mode overflow panic in
set_timestamp. - On macOS, fix crash in
set_marked_textwhen native Pinyin IME sends out-of-boundsselected_range. - On Windows, fix
WM_IME_SETCONTEXTIME UI flag masking onlParam. - On Android, populate
KeyEvent::textandKeyEvent::text_with_all_modifiersviaKey::to_text().
- On Wayland, add
-
0.30.1227 Jul 2025Release notes
Open source →Fixed
- On macOS, fix crash on macOS 26 by using objc2's
relax-sign-encodingfeature.
- On macOS, fix crash on macOS 26 by using objc2's
-
0.30.1121 May 2025Release notes
Open source →Fixed
- On Windows, fixed crash in should_apps_use_dark_mode() for Windows versions < 17763.
- On Wayland, fixed
pump_eventsdriven loop deadlocking when loop was not drained before exit.
-
0.30.1030 Apr 2025Release notes
Open source →Added
- On Windows, add
IconExtWindows::from_resource_name. - On Windows, add
CursorGrabMode::Locked. - On Wayland, add
WindowExtWayland::xdg_toplevel.
Changed
- On macOS, no longer need control of the main
NSApplicationclass (which means you can now override it yourself). - On iOS, remove custom application delegates. You are now allowed to override the
application delegate yourself. - On iOS, no longer act as-if the application successfully open all URLs. Override
application:didFinishLaunchingWithOptions:and provide the desired behaviour yourself.
Fixed
- On Windows, fixed ~500 ms pause when clicking the title bar during continuous redraw.
- On macOS,
WindowExtMacOS::set_simple_fullscreennow honorsWindowExtMacOS::set_borderless_game - On X11 and Wayland, fixed pump_events with
Some(Duration::Zero)blocking withWaitpolling mode - On Wayland, fixed a crash when consequently calling
set_cursor_grabwithout pointer focus. - On Wayland, ensure that external event loop is woken-up when using pump_events and integrating via
FD. - On Wayland, apply fractional scaling to custom cursors.
- On macOS, fixed
run_app_on_demandreturning without closing open windows. - On macOS, fixed
VideoMode::refresh_rate_millihertzfor fractional refresh rates. - On macOS, store monitor handle to avoid panics after going in/out of sleep.
- On macOS, allow certain invalid monitor handles and return
Noneinstead of panicking. - On Windows, fixed
Ime::Preeditcursor offset calculation.
- On Windows, add
-
0.30.906 Feb 2025Release notes
Open source →Changed
- On Wayland, no longer send an explicit clearing
Ime::Preeditjust prior to a newIme::Preedit.
Fixed
- On X11, fix crash with uim.
- On X11, fix modifiers for keys that were sent by the same X11 request.
- On iOS, fix high CPU usage even when using
ControlFlow::Wait.
- On Wayland, no longer send an explicit clearing
-
0.30.804 Jan 2025Release notes
Open source →Added
ActivationToken::from_rawandActivationToken::into_raw.- On X11, add a workaround for disabling IME on GNOME.
Fixed
- On Windows, fixed the event loop not waking on accessibility requests.
- On X11, fixed cursor grab mode state tracking on error.
-
0.30.722 Dec 2024 -
0.30.621 Dec 2024 withdrawnNothing published for this version
-
0.30.508 Aug 2024Nothing published for this version
-
0.30.416 Jul 2024Nothing published for this version
-
0.30.321 Jun 2024Nothing published for this version
-
0.30.215 Jun 2024Nothing published for this version
-
0.30.110 Jun 2024Nothing published for this version
-
0.30.027 Apr 2024Nothing published for this version
-
0.29.1513 Mar 2024Nothing published for this version
-
0.29.1406 Mar 2024Nothing published for this version
-
0.29.1302 Mar 2024Nothing published for this version
-
0.29.1201 Mar 2024Nothing published for this version
-
0.29.1126 Feb 2024 withdrawnNothing published for this version
-
0.29.1015 Jan 2024Nothing published for this version
-
0.29.905 Jan 2024Nothing published for this version
-
0.29.831 Dec 2023Nothing published for this version
-
0.29.727 Dec 2023Nothing published for this version
-
0.29.624 Dec 2023Nothing published for this version
-
0.29.521 Dec 2023Nothing published for this version
-
0.29.424 Nov 2023Nothing published for this version
-
0.29.328 Oct 2023Nothing published for this version
-
0.29.221 Oct 2023Nothing published for this version
-
0.29.1-beta16 Aug 2023 pre-releaseNothing published for this version
-
0.29.0-beta.116 Aug 2023 pre-release withdrawnNothing published for this version
-
0.29.0-beta.030 Jun 2023 pre-releaseNothing published for this version
-
0.28.727 Sep 2023Nothing published for this version
-
0.28.614 May 2023Nothing published for this version
-
0.28.506 May 2023Nothing published for this version
-
0.28.404 May 2023 withdrawnNothing published for this version
-
0.28.316 Mar 2023Nothing published for this version
-
0.28.202 Mar 2023Nothing published for this version
-
0.28.102 Feb 2023Nothing published for this version
-
0.28.002 Feb 2023Nothing published for this version
-
0.27.526 Oct 2022Nothing published for this version
-
0.27.409 Oct 2022Nothing published for this version
-
0.27.311 Sep 2022Nothing published for this version
-
0.27.212 Aug 2022Nothing published for this version
-
0.27.130 Jul 2022Nothing published for this version
-
0.27.026 Jul 2022Nothing published for this version
-
0.26.105 Jan 2022Nothing published for this version
-
0.26.001 Dec 2021Nothing published for this version
-
0.25.015 May 2021Nothing published for this version
-
0.24.010 Dec 2020Nothing published for this version
-
0.23.002 Oct 2020Nothing published for this version
-
0.22.216 May 2020Nothing published for this version
-
0.22.117 Apr 2020Nothing published for this version
-
0.22.009 Mar 2020Nothing published for this version
-
0.21.005 Feb 2020Nothing published for this version
-
0.20.005 Jan 2020Nothing published for this version
-
0.20.0-alpha603 Jan 2020 pre-releaseNothing published for this version
-
0.20.0-alpha510 Dec 2019 pre-releaseNothing published for this version
-
0.20.0-alpha418 Oct 2019 pre-releaseNothing published for this version