NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1241 most downloaded on crates.io
Cross-platform window creation library.
Last release 1 months ago
04 Sep 2026
Release timing varies
gaps range from 2 weeks to 6 months
Rarely documented
notes for 7 of the last 60 stable releases
5 versions withdrawn
withdrawn after publishing
11 years old
120 releases · first in 2016
Add keyboard support for OpenHarmony.
keyboard support for OpenHarmony.EventLoopExtPumpEvents::pump_app_events.Send and Sync for OwnedDisplayHandle.HoldGesture event for multi-finger hold gesturesWindowType::Popup), withWindowAttributes::with_positioner for configuring their placement via aWindowPositioner (grouping the anchor edge/corner, the anchor rect, theWindowAnchor, WindowGravity and WindowConstraintAdjustmentWindow::positioner/set_positioner methods forWindow, popup or not;Window::window_type to tell whether a given window is a genuineWindowType::Popup. On Windows and macOS, which have no native positionerxdg_positioner behavior, and it also works for a plain WindowType::Windowxdg_popupWindowType::Popup.WindowAttributesMacOS::with_fullscreen_auxiliary andWindowExtMacOS::set_fullscreen_auxiliary / WindowExtMacOS::fullscreen_auxiliary, allowing aNSWindowCollectionBehaviorFullScreenAuxiliary) instead of triggering a Space switch or SplitWindowEvent::PointerButton::is_macos_activation_click. On macOS, both the press andfalse on other platforms.winit::event_loop::EventLoopProvider trait with common event loop methods.Mark the extensible public enums as #[non_exhaustive]: StartCause, WindowEvent,
DeviceEvent, Ime, PointerKind, PointerSource, ButtonSource, NativeKey,
NativeKeyCode, CustomCursorSource, TypeHint, SendData, DndAction, ImeRequest,
BadIcon, BadImage, BadAnimation, ImeSurroundingTextError, MouseScrollDelta,
and Fullscreen.
When matching on one of these types, add a wildcard arm to cover variants added in the future:
match event {
WindowEvent::CloseRequested => (),
// ...
_ => (),
}On macOS, mark ActivationPolicy as #[non_exhaustive].
On X11, mark WindowType and UriListParseError as #[non_exhaustive].
On Web, mark PollStrategy, WaitUntilStrategy, CustomCursorError, MonitorPermissionError,
and OrientationLockError as #[non_exhaustive].
On Windows, mark BackdropType and CornerPreference as #[non_exhaustive].
On iOS, mark ValidOrientations and StatusBarStyle as #[non_exhaustive].
Updated windows-sys to v0.61.
On older macOS versions (tested up to 12.7.6), applications now receive mouse movement events for unfocused windows, matching the behavior on other platforms.
On macOS, using the private API CGSSetWindowBackgroundBlurRadius for Window::set_blur is now disabled by default. It can be re-enabled using the Cargo feature private-apple-apis.
On macOS, Window::set_blur is now implemented with the public NSVisualEffectView when private-apple-apis is disabled, so binaries no longer link _CGSSetWindowBackgroundBlurRadius, which the Mac App Store rejects under Guideline 2.5.1.
On macOS, blurred windows now render a translucent system material rather than an untinted backdrop blur at a fixed radius of 80, and the radius is no longer configurable; enable the private-apple-apis Cargo feature to keep the previous implementation, which --all-features also enables.
On macOS, added BlurMaterial, WindowAttributesMacOS::with_blur_material and WindowExtMacOS::set_blur_material to choose which material is drawn behind a blurred window.
On macOS, the window's contentView is now a plain container NSView holding winit's view, rather than being winit's view itself; the handle returned by raw-window-handle is unchanged.
On macOS 10.12 and older, enabling blur now makes the window's views layer-backed, which may break the association with an attached NSOpenGLContext.
WindowAttributesMacOS::with_accepts_first_mouse. Use the new per-eventWindowEvent::PointerButton::is_macos_activation_click flag instead. To preserve the oldwith_accepts_first_mouse(false) behavior, ignore PointerButton press events (and theiris_macos_activation_click is true.NotSupported instead of panicking when XInput 2.0, XRandRWM_INPUTLANGCHANGE message is now handledDefWindowProc for normal propagation.HDC handles.GetDC when on < Windows 8.1 which improves its performance.Icon isEINTR when reading from event_socket instead of panicking.ahash hashing algorithm to foldhash.wl_surface version below 3.run_app_on_demand exiting immediately after a previous run_app_on_demand called exit.ApplicationHandler drop.One column per quarter.
Add EventLoopExtRegister::register_app for being explicit about how the event loop runs on Web.
EventLoopExtRegister::register_app for being explicit about how the event loop runs on Web.EventLoopExtNeverReturn::run_app_never_return for being explicit about how the event loop runs on iOS.EventLoop::run_app, instead preferring to return to the caller.'static application to ensure that the application state will live as long as necessary.Window::set_ime_allowed.NamedKey::Super still exists, but it's non-functional and deprecated, NamedKey::Meta should be used instead.
Add ActiveEventLoop::create_proxy().
On Web, add ActiveEventLoopExtWeb::is_cursor_lock_raw() to determine if
DeviceEvent::MouseMotion is returning raw data, not OS accelerated, when using
CursorGrabMode::Locked.
On Web, implement MonitorHandle and VideoModeHandle.
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
and Serialize on many types.
Add MonitorHandle::current_video_mode().
Add ApplicationHandlerExtMacOS trait, and a macos_handler method to ApplicationHandler which returns a dyn ApplicationHandlerExtMacOS which allows for macOS specific extensions to winit.
Add a standard_key_binding method to the ApplicationHandlerExtMacOS trait. This allows handling of standard keybindings such as "go to end of line" on macOS.
On macOS, add WindowExtMacOS::set_unified_titlebar and WindowAttributesMacOS::with_unified_titlebar
to use a larger style of titlebar.
Add WindowId::into_raw() and from_raw().
Add PointerKind, PointerSource, ButtonSource, FingerId, primary and position to all
pointer events as part of the pointer event overhaul.
Add DeviceId::into_raw() and from_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 NSPanel with NSWindowStyleMask::NonactivatingPanel.
Implement MonitorHandleProvider for MonitorHandle to access common monitor API.
On X11, set an "area" attribute on XIM input connection to convey the cursor area.
Implement CustomCursorProvider for CustomCursor to access cursor API.
Add CustomCursorSource::Url, CustomCursorSource::from_animation.
Implement CustomIconProvider for RgbaIcon.
Add icon module that exposes winit's icon API.
VideoMode::new to create a VideoMode.
keyboard::ModifiersKey to track which modifier is exactly pressed.
ActivationToken::as_raw to get a ref to raw token.
Each platform now has corresponding WindowAttributes struct instead of trait extension.
On Wayland, added implementation for Window::set_window_icon
On Wayland, added PanGesture, PinchGesture, and RotationGesture
Add Window::request_ime_update to atomically apply set of IME changes.
Add Ime::DeleteSurrounding to let the input method delete text.
Add more ImePurpose values.
Add ImeHints to request particular IME behaviour.
Add Pen input support on Wayland, Windows, and Web via new Pointer event.
Change ActiveEventLoop and Window to be traits, and added cast_ref/cast_mut/cast
methods to extract the backend type from those.
ActiveEventLoop::create_window now returns Box<dyn Window>.
ApplicationHandler now uses dyn ActiveEventLoop.
On Web, let events wake up event loop immediately when using ControlFlow::Poll.
Bump MSRV from 1.70 to 1.85.
Changed ApplicationHandler::user_event to user_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::channel if you want
to send specific data to be processed on the main thread.
Changed EventLoopProxy::send_event to EventLoopProxy::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::*ExtWebSys to *ExtWeb.
Change signature of EventLoop::run_app, EventLoopExtPumpEvents::pump_app_events and
EventLoopExtRunOnDemand::run_app_on_demand to accept a impl ApplicationHandler directly,
instead of requiring a &mut reference to it.
On Web, Window::canvas() now returns a reference.
On Web, CursorGrabMode::Locked now lets DeviceEvent::MouseMotion return raw data, not OS
accelerated, if the browser supports it.
(Active)EventLoop::create_custom_cursor() now returns a Result<CustomCursor, ExternalError>.
Changed how ModifiersState is serialized by Serde.
VideoModeHandle::refresh_rate_millihertz() and bit_depth() now return a Option<NonZero*>.
MonitorHandle::position() now returns an Option.
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::Resized to SurfaceResized.InnerSizeWriter to SurfaceSizeWriter.WindowAttributes.inner_size to surface_size.WindowAttributes.min_inner_size to min_surface_size.WindowAttributes.max_inner_size to max_surface_size.WindowAttributes.resize_increments to surface_resize_increments.WindowAttributes::with_inner_size to with_surface_size.WindowAttributes::with_min_inner_size to with_min_surface_size.WindowAttributes::with_max_inner_size to with_max_surface_size.WindowAttributes::with_resize_increments to with_surface_resize_increments.Window::inner_size to surface_size.Window::request_inner_size to request_surface_size.Window::set_min_inner_size to set_min_surface_size.Window::set_max_inner_size to set_max_surface_size.To migrate, you can probably just replace all instances of inner_size with surface_size in your codebase.
Every event carrying a DeviceId now uses Option<DeviceId> instead. A None value 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:
CursorMoved to PointerMoved.CursorEntered to PointerEntered.CursorLeft to PointerLeft.MouseInput to PointerButton.primary to every PointerEvent as a way to identify discard non-primary pointers in aposition to every PointerEvent.PointerMoved is not sent after PointerEntered anymore.Touch, which is folded into the Pointer* events.PointerKind added to PointerEntered and PointerLeft, signifying which pointer type isPointerSource added to PointerMoved, similar to PointerKind but holding additionalButtonSource added to PointerButton, similar to PointerKind but holding pointer typeButtonSource::mouse_button() to easily normalize any pointer buttonFingerId added to PointerKind::Touch and PointerSource::Touch able to uniquelyTouch::id.DeviceEvent::MouseMotion to PointerMotion.Force::Calibrated::altitude_angle.On X11, use bottom-right corner for IME hotspot in Window::set_ime_cursor_area.
On macOS and iOS, no longer emit ScaleFactorChanged upon window creation.
On macOS, no longer emit Focused upon window creation.
On iOS, emit more events immediately, instead of queuing them.
Update smol_str to version 0.3
Rename VideoModeHandle to VideoMode, now it only stores plain data.
Make Fullscreen::Exclusive contain (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::HoveredFile and WindowEvent::HoveredFileCancelled
events have been removed, and replaced with WindowEvent::DragEntered, WindowEvent::DragMoved,
WindowEvent::DragDropped and WindowEvent::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::DragLeftThe WindowEvent::DragMoved event 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 objc2 to v0.6.
Updated windows-sys to v0.59.
windows-sys, the HWND, HMONITOR, and HMENU types*mut c_void instead of isize.Removed KeyEventExtModifierSupplement, and made the fields text_with_all_modifiers and
key_without_modifiers public on KeyEvent instead.
Move window::Fullscreen to monitor::Fullscreen.
Renamed "super" key to "meta", to match the naming in the W3C specification.
NamedKey::Super still exists, but it's non-functional and deprecated, NamedKey::Meta should be used instead.
Move IconExtWindows into WinIcon.
Move EventLoopExtPumpEvents and PumpStatus from platform module to winit::event_loop::pump_events.
Move EventLoopExtRunOnDemand from platform module to winit::event_loop::run_on_demand.
Use NamedKey, Code and Location from the keyboard-types v0.8 crate.
Deprecate Window::set_ime_allowed, Window::set_ime_cursor_area, and Window::set_ime_purpose.
Force::normalized() now takes a Option<ToolAngle> to calculate the perpendicular force.
On Windows, don't confine cursor to center of window when grabbed and hidden.
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::EventLoopExtIOS and related platform::ios::Idiom type.
This feature was incomplete, and the equivalent functionality can be trivially achieved outside
of winit using objc2-ui-kit and calling UIDevice::currentDevice().userInterfaceIdiom().
On Web, remove unused platform::web::CustomCursorError::Animation.
Remove the rwh_04 and rwh_05 cargo feature and the corresponding raw-window-handle v0.4 and
v0.5 support. v0.6 remains in place and is enabled by default.
Remove DeviceEvent::Added and DeviceEvent::Removed.
Remove DeviceEvent::Motion and WindowEvent::AxisMotion.
Remove MonitorHandle::size() and refresh_rate_millihertz() in favor of
MonitorHandle::current_video_mode().
On Android, remove all MonitorHandle support instead of emitting false data.
Remove impl From<u64> for WindowId and impl From<WindowId> for u64. Replaced with
WindowId::into_raw() and from_raw().
Remove dummy() from WindowId and DeviceId.
Remove WindowEvent::Touch and Touch in favor of the new PointerKind, PointerSource and
ButtonSource as part of the new pointer event overhaul.
Remove Force::altitude_angle.
Remove Window::inner_position, use the new Window::surface_position instead.
Remove CustomCursorExtWeb, use the CustomCursorSource.
Remove CustomCursor::from_rgba, use CustomCursorSource instead.
Remove ApplicationHandler::exited, the event loop being shut down can now be listened to in
the Drop impl on the application handler.
Remove NamedKey::Space, match on Key::Character(" ") instead.
Remove PartialEq impl for WindowAttributes.
WindowAttributesExt* platform extensions; use WindowAttributes* instead.
Remove Force::Calibrated::altitude_angle in favor of ToolAngle::altitude.
MonitorHandle::name() now returns None instead of a dummy name.fullscreen.SurfaceResized and Window::surface_size not reporting the size of the actual surface.IntlBackslash.SurfaceResized event at window creation.WindowEvent::MouseWheel.Window::theme will return the correct theme after setting it through Window::set_theme.Window::set_theme will change the title bar color immediately now.SurfaceResized with size zero when an application is minimized. Let Window::surface_size return the pre-minimization window size even while minimized.axis_value120 scroll events now generate MouseScrollDelta::LineDeltaWindowEvent::MouseWheel events.On Wayland, add Window::set_resize_increments .
Window::set_resize_increments.set_hittest not working on some window managers.set_timestamp.set_marked_text when native Pinyin IME sends out-of-bounds selected_range.WM_IME_SETCONTEXT IME UI flag masking on lParam.KeyEvent::text and KeyEvent::text_with_all_modifiers via Key::to_text().On macOS, fix crash on macOS 26 by using objc2's relax-sign-encoding feature.
relax-sign-encoding feature.On Windows, fixed crash in should_apps_use_dark_mode() for Windows versions < 17763.
pump_events driven loop deadlocking when loop was not drained before exit.On Windows, add IconExtWindows::from_resource_name .
IconExtWindows::from_resource_name.CursorGrabMode::Locked.WindowExtWayland::xdg_toplevel.NSApplication class (which means you can now override it yourself).application:didFinishLaunchingWithOptions: and provide the desired behaviour yourself.WindowExtMacOS::set_simple_fullscreen now honors WindowExtMacOS::set_borderless_gameSome(Duration::Zero) blocking with Wait polling modeset_cursor_grab without pointer focus.FD.run_app_on_demand returning without closing open windows.VideoMode::refresh_rate_millihertz for fractional refresh rates.None instead of panicking.Ime::Preedit cursor offset calculation.On Wayland, no longer send an explicit clearing Ime::Preedit just prior to a new Ime::Preedit .
Ime::Preedit just prior to a new Ime::Preedit.ControlFlow::Wait.ActivationToken::from_raw and ActivationToken::into_raw .
ActivationToken::from_raw and ActivationToken::into_raw.On X11, fixed KeyboardInput delivered twice when IME enabled.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →