PackageTrack
Sign in Get early access

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 2026
2017 2018 2019 2020 2021 2022 2023 2024 2025 2026
Release Pre-release Withdrawn

Releases

latest 60 of 119
  1. 0.31.0-beta.2 16 Nov 2025 pre-release
    Release notes

    Added

    • Add EventLoopExtRegister::register_app for being explicit about how the event loop runs on Web.
    • Add EventLoopExtNeverReturn::run_app_never_return for 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 'static application 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.
    Open source →
  2. 0.31.0-beta.1 16 Nov 2025 pre-release
    Release notes

    Added

    • 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.

    Changed

    • 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:

      • Rename CursorMoved to PointerMoved.
      • Rename CursorEntered to PointerEntered.
      • Rename CursorLeft to PointerLeft.
      • Rename MouseInput to PointerButton.
      • Add primary to every PointerEvent as a way to identify discard non-primary pointers in a
        multi-touch interaction.
      • Add position to every PointerEvent.
      • PointerMoved is not sent after PointerEntered anymore.
      • Remove Touch, which is folded into the Pointer* events.
      • New PointerKind added to PointerEntered and PointerLeft, signifying which pointer type is
        the source of this event.
      • New PointerSource added to PointerMoved, similar to PointerKind but holding additional
        data.
      • New ButtonSource added to PointerButton, similar to PointerKind but holding pointer type
        specific buttons. Use ButtonSource::mouse_button() to easily normalize any pointer button
        type to a generic mouse button.
      • New FingerId added to PointerKind::Touch and PointerSource::Touch able to uniquely
        identify a finger in a multi-touch interaction. Replaces the old Touch::id.
      • In the same spirit rename DeviceEvent::MouseMotion to PointerMotion.
      • Remove 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::DragEntered
      • WindowEvent::DroppedFile -> WindowEvent::DragDropped
      • WindowEvent::HoveredFileCancelled -> WindowEvent::DragLeft

      The 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.

      • To match the corresponding changes in windows-sys, the HWND, HMONITOR, and HMENU types
        now alias to *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.

    Removed

    • Remove Event.

    • Remove already deprecated APIs:

      • EventLoop::create_window()
      • EventLoop::run.
      • EventLoopBuilder::new()
      • EventLoopExtPumpEvents::pump_events.
      • EventLoopExtRunOnDemand::run_on_demand.
      • VideoMode
      • WindowAttributes::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.

    Fixed

    • On Orbital, MonitorHandle::name() now returns None instead of a dummy name.
    • On Orbital, implement fullscreen.
    • On iOS, fixed SurfaceResized and Window::surface_size not 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 SurfaceResized event 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::theme will return the correct theme after setting it through Window::set_theme.
    • On Windows, Window::set_theme will 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 SurfaceResized with size zero when an application is minimized. Let Window::surface_size return the pre-minimization window size even while minimized.
    • On Web, device events are emitted regardless of cursor type.
    • On Wayland, axis_value120 scroll events now generate MouseScrollDelta::LineDelta
    • On X11, mouse scroll button events no longer cause duplicated WindowEvent::MouseWheel events.
    • On macOS, fixed crash when dragging non-file content onto window.
    Open source →
  3. 0.30.13 02 Mar 2026
    Release notes

    Added

    • On Wayland, add Window::set_resize_increments.

    Fixed

    • On macOS, fixed crash when dragging non-file content onto window.
    • On X11, fix set_hittest not working on some window managers.
    • On X11, fix debug mode overflow panic in set_timestamp.
    • On macOS, fix crash in set_marked_text when native Pinyin IME sends out-of-bounds selected_range.
    • On Windows, fix WM_IME_SETCONTEXT IME UI flag masking on lParam.
    • On Android, populate KeyEvent::text and KeyEvent::text_with_all_modifiers via Key::to_text().
    Open source →
  4. 0.30.12 27 Jul 2025
    Release notes

    Fixed

    • On macOS, fix crash on macOS 26 by using objc2's relax-sign-encoding feature.
    Open source →
  5. 0.30.11 21 May 2025
    Release notes

    Fixed

    • On Windows, fixed crash in should_apps_use_dark_mode() for Windows versions < 17763.
    • On Wayland, fixed pump_events driven loop deadlocking when loop was not drained before exit.
    Open source →
  6. 0.30.10 30 Apr 2025
    Release notes

    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 NSApplication class (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_fullscreen now honors WindowExtMacOS::set_borderless_game
    • On X11 and Wayland, fixed pump_events with Some(Duration::Zero) blocking with Wait polling mode
    • On Wayland, fixed a crash when consequently calling set_cursor_grab without 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_demand returning without closing open windows.
    • On macOS, fixed VideoMode::refresh_rate_millihertz for 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 None instead of panicking.
    • On Windows, fixed Ime::Preedit cursor offset calculation.
    Open source →
  7. 0.30.9 06 Feb 2025
    Release notes

    Changed

    • On Wayland, no longer send an explicit clearing Ime::Preedit just prior to a new Ime::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.
    Open source →
  8. 0.30.8 04 Jan 2025
    Release notes

    Added

    • ActivationToken::from_raw and ActivationToken::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.
    Open source →
  9. 0.30.7 22 Dec 2024
    Release notes

    Fixed

    • On X11, fixed KeyboardInput delivered twice when IME enabled.
    Open source →
  10. 0.30.6 21 Dec 2024 withdrawn

    Nothing published for this version

  11. 0.30.5 08 Aug 2024

    Nothing published for this version

  12. 0.30.4 16 Jul 2024

    Nothing published for this version

  13. 0.30.3 21 Jun 2024

    Nothing published for this version

  14. 0.30.2 15 Jun 2024

    Nothing published for this version

  15. 0.30.1 10 Jun 2024

    Nothing published for this version

  16. 0.30.0 27 Apr 2024

    Nothing published for this version

  17. 0.29.15 13 Mar 2024

    Nothing published for this version

  18. 0.29.14 06 Mar 2024

    Nothing published for this version

  19. 0.29.13 02 Mar 2024

    Nothing published for this version

  20. 0.29.12 01 Mar 2024

    Nothing published for this version

  21. 0.29.11 26 Feb 2024 withdrawn

    Nothing published for this version

  22. 0.29.10 15 Jan 2024

    Nothing published for this version

  23. 0.29.9 05 Jan 2024

    Nothing published for this version

  24. 0.29.8 31 Dec 2023

    Nothing published for this version

  25. 0.29.7 27 Dec 2023

    Nothing published for this version

  26. 0.29.6 24 Dec 2023

    Nothing published for this version

  27. 0.29.5 21 Dec 2023

    Nothing published for this version

  28. 0.29.4 24 Nov 2023

    Nothing published for this version

  29. 0.29.3 28 Oct 2023

    Nothing published for this version

  30. 0.29.2 21 Oct 2023

    Nothing published for this version

  31. 0.29.1-beta 16 Aug 2023 pre-release

    Nothing published for this version

  32. 0.29.0-beta.1 16 Aug 2023 pre-release withdrawn

    Nothing published for this version

  33. 0.29.0-beta.0 30 Jun 2023 pre-release

    Nothing published for this version

  34. 0.28.7 27 Sep 2023

    Nothing published for this version

  35. 0.28.6 14 May 2023

    Nothing published for this version

  36. 0.28.5 06 May 2023

    Nothing published for this version

  37. 0.28.4 04 May 2023 withdrawn

    Nothing published for this version

  38. 0.28.3 16 Mar 2023

    Nothing published for this version

  39. 0.28.2 02 Mar 2023

    Nothing published for this version

  40. 0.28.1 02 Feb 2023

    Nothing published for this version

  41. 0.28.0 02 Feb 2023

    Nothing published for this version

  42. 0.27.5 26 Oct 2022

    Nothing published for this version

  43. 0.27.4 09 Oct 2022

    Nothing published for this version

  44. 0.27.3 11 Sep 2022

    Nothing published for this version

  45. 0.27.2 12 Aug 2022

    Nothing published for this version

  46. 0.27.1 30 Jul 2022

    Nothing published for this version

  47. 0.27.0 26 Jul 2022

    Nothing published for this version

  48. 0.26.1 05 Jan 2022

    Nothing published for this version

  49. 0.26.0 01 Dec 2021

    Nothing published for this version

  50. 0.25.0 15 May 2021

    Nothing published for this version

  51. 0.24.0 10 Dec 2020

    Nothing published for this version

  52. 0.23.0 02 Oct 2020

    Nothing published for this version

  53. 0.22.2 16 May 2020

    Nothing published for this version

  54. 0.22.1 17 Apr 2020

    Nothing published for this version

  55. 0.22.0 09 Mar 2020

    Nothing published for this version

  56. 0.21.0 05 Feb 2020

    Nothing published for this version

  57. 0.20.0 05 Jan 2020

    Nothing published for this version

  58. 0.20.0-alpha6 03 Jan 2020 pre-release

    Nothing published for this version

  59. 0.20.0-alpha5 10 Dec 2019 pre-release

    Nothing published for this version

  60. 0.20.0-alpha4 18 Oct 2019 pre-release

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive