2024-04-12 21:38:50 +04:00
The format is based on [Keep a Changelog ](https://keepachangelog.com/en/1.0.0/ ).
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:
```md
### 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` .
```
2024-04-12 21:55:44 +04:00
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:
```md
- 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.
2024-02-16 17:28:13 +01:00
## Unreleased
2024-05-06 16:29:07 +02:00
2024-06-29 17:19:09 +02:00
### Added
- Add `ActiveEventLoop::create_proxy()` .
2024-07-23 17:05:55 +02:00
- On Web, add `ActiveEventLoopExtWeb::is_cursor_lock_raw()` to determine if
`DeviceEvent::MouseMotion` is returning raw data, not OS accelerated, when using
`CursorGrabMode::Locked` .
2024-07-23 20:33:10 +02:00
- On Web, implement `MonitorHandle` and `VideoModeHandle` .
2024-08-19 22:04:29 +02:00
2024-07-23 20:33:10 +02:00
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
2024-08-13 22:13:12 +02:00
details is available. Handles created with "detailed monitor permissions" can be used in
`Window::set_fullscreen()` as well.
2024-08-19 22:04:29 +02:00
2024-08-13 22:13:12 +02:00
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.
2024-08-08 00:46:28 +02:00
- Implement `Clone` , `Copy` , `Debug` , `Deserialize` , `Eq` , `Hash` , `Ord` , `PartialEq` , `PartialOrd`
and `Serialize` on many types.
2024-07-21 00:01:43 +02:00
- Add `MonitorHandle::current_video_mode()` .
2024-10-23 17:33:42 +09:00
- 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.
2024-10-25 14:22:52 -07:00
- On macOS, add `WindowExtMacOS::set_unified_titlebar` and `WindowAttributesExtMacOS::with_unified_titlebar`
to use a larger style of titlebar.
2024-09-27 22:12:50 +02:00
- Add `WindowId::into_raw()` and `from_raw()` .
2024-10-11 20:08:51 +03:00
- Add `PointerKind` , `PointerSource` , `ButtonSource` , `FingerId` , `primary` and `position` to all
pointer events as part of the pointer event overhaul.
2024-10-11 11:15:54 +03:00
- Add `DeviceId::into_raw()` and `from_raw()` .
2024-11-21 17:37:03 +01:00
- 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.
2024-12-03 18:17:57 +01:00
- On X11, Wayland, Windows and macOS, improved scancode conversions for more obscure key codes.
2024-12-13 00:56:39 +01:00
- Add ability to make non-activating window on macOS using `NSPanel` with `NSWindowStyleMask::NonactivatingPanel` .
2024-09-21 20:27:12 +03:00
- Implement `MonitorHandleProvider` for `MonitorHandle` to access common monitor API.
2025-03-11 14:04:50 -04:00
- On X11, set an "area" attribute on XIM input connection to convey the cursor area.
2025-03-13 17:18:37 +03:00
- Implement `CustomCursorProvider` for `CustomCursor` to access cursor API.
- Add `CustomCursorSource::Url` , `CustomCursorSource::from_animation` .
2025-03-23 20:02:07 +03:00
- Implement `CustomIconProvider` for `RgbaIcon` .
- Add `icon` module that exposes winit's icon API.
2024-06-29 17:19:09 +02:00
2024-06-12 00:02:26 +02:00
### Changed
2025-03-11 14:35:25 +01:00
- Change `ActiveEventLoop` and `Window` to be traits, and added `cast_ref` /`cast_mut` /`cast`
methods to extract the backend type from those.
2024-08-23 23:40:27 +03:00
- `ActiveEventLoop::create_window` now returns `Box<dyn Window>` .
2024-08-06 21:02:53 +03:00
- `ApplicationHandler` now uses `dyn ActiveEventLoop` .
2024-06-21 21:40:16 +03:00
- On Web, let events wake up event loop immediately when using `ControlFlow::Poll` .
2024-06-20 11:09:15 +02:00
- Bump MSRV from `1.70` to `1.73` .
2024-06-24 13:04:55 +03:00
- 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.
2024-07-21 18:39:43 +02:00
- On X11, implement smooth resizing through the sync extension API.
2024-10-16 12:17:59 +02:00
- `ApplicationHandler::can_create|destroy_surfaces()` was split off from
2024-06-30 00:41:57 +02:00
`ApplicationHandler::resumed/suspended()` .
`ApplicationHandler::can_create_surfaces()` should, for portability reasons
to Android, be the only place to create render surfaces.
2024-10-16 12:17:59 +02:00
`ApplicationHandler::resumed/suspended()` are now only emitted by iOS, Web
and Android, and now signify actually resuming/suspending the application.
2024-07-10 16:17:39 +02:00
- Rename `platform::web::*ExtWebSys` to `*ExtWeb` .
2024-07-11 15:38:09 +02:00
- 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.
2024-07-23 16:47:35 +02:00
- On Web, `Window::canvas()` now returns a reference.
2024-07-23 17:05:55 +02:00
- On Web, `CursorGrabMode::Locked` now lets `DeviceEvent::MouseMotion` return raw data, not OS
accelerated, if the browser supports it.
2024-08-06 18:57:03 +02:00
- `(Active)EventLoop::create_custom_cursor()` now returns a `Result<CustomCursor, ExternalError>` .
2024-08-08 00:46:28 +02:00
- Changed how `ModifiersState` is serialized by Serde.
2024-07-23 19:59:37 +02:00
- `VideoModeHandle::refresh_rate_millihertz()` and `bit_depth()` now return a `Option<NonZero*>` .
- `MonitorHandle::position()` now returns an `Option` .
2025-04-30 21:01:32 +09:00
- On macOS, remove custom application delegates. You are now allowed to override the
2024-08-11 23:14:18 +02:00
application delegate yourself.
2024-08-22 19:25:20 -07:00
- On X11, remove our dependency on libXcursor. (#3749 )
2024-09-04 15:04:48 +02:00
- 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.
2024-09-29 15:49:45 +02:00
- Every event carrying a `DeviceId` now uses `Option<DeviceId>` instead. A `None` value signifies that the
device can't be uniquely identified.
2024-10-08 14:19:00 +02:00
- Pointer `WindowEvent` s 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` .
2024-10-11 20:08:51 +03:00
- Add `primary` to every `PointerEvent` as a way to identify discard non-primary pointers in a
multi-touch interaction.
2024-10-08 14:19:00 +02:00
- 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` .
2024-11-21 17:37:03 +01:00
- On X11, use bottom-right corner for IME hotspot in `Window::set_ime_cursor_area` .
2024-12-02 23:10:33 +01:00
- On macOS and iOS, no longer emit `ScaleFactorChanged` upon window creation.
- On macOS, no longer emit `Focused` upon window creation.
2024-12-03 19:53:29 +01:00
- On iOS, emit more events immediately, instead of queuing them.
2024-12-03 23:07:19 +01:00
- Update `smol_str` to version `0.3`
2025-01-02 03:29:42 +03:00
- Rename `VideoModeHandle` to `VideoMode` , now it only stores plain data.
- Make `Fullscreen::Exclusive` contain `(MonitorHandle, VideoMode)` .
2025-01-28 15:10:40 -05:00
- Reworked the file drag-and-drop API.
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.
2025-01-28 21:31:14 +01:00
- Updated `objc2` to `v0.6` .
2025-02-23 22:40:11 -05:00
- 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` .
2025-02-26 17:51:49 +01:00
- Removed `KeyEventExtModifierSupplement` , and made the fields `text_with_all_modifiers` and
`key_without_modifiers` public on `KeyEvent` instead.
2024-09-21 20:27:12 +03:00
- Move `window::Fullscreen` to `monitor::Fullscreen` .
2025-03-23 12:56:01 +01:00
- 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.
2025-03-23 20:02:07 +03:00
- Move `IconExtWindows` into `WinIcon` .
2024-06-12 00:02:26 +02:00
2024-05-20 20:27:36 +04:00
### Removed
2024-06-24 13:04:55 +03:00
- Remove `Event` .
2024-07-26 16:44:47 +03:00
- 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()`
2024-06-24 22:56:20 +02:00
- 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()` .
2024-07-17 10:38:30 +02:00
- On Web, remove unused `platform::web::CustomCursorError::Animation` .
2024-08-04 00:18:39 +02:00
- 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.
2024-08-05 12:01:31 +02:00
- Remove `DeviceEvent::Added` and `DeviceEvent::Removed` .
2024-08-05 12:15:53 +02:00
- Remove `DeviceEvent::Motion` and `WindowEvent::AxisMotion` .
2024-07-21 00:40:57 +02:00
- Remove `MonitorHandle::size()` and `refresh_rate_millihertz()` in favor of
`MonitorHandle::current_video_mode()` .
2024-07-26 15:59:17 +02:00
- On Android, remove all `MonitorHandle` support instead of emitting false data.
2024-09-27 22:12:50 +02:00
- Remove `impl From<u64> for WindowId` and `impl From<WindowId> for u64` . Replaced with
`WindowId::into_raw()` and `from_raw()` .
2024-09-29 15:49:45 +02:00
- Remove `dummy()` from `WindowId` and `DeviceId` .
2024-10-08 14:19:00 +02:00
- 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` .
2025-03-13 17:18:37 +03:00
- Remove `Window::inner_position` , use the new `Window::surface_position` instead.
- Remove `CustomCursorExtWeb` , use the `CustomCursorSource` .
- Remove `CustomCursor::from_rgba` , use `CustomCursorSource` instead.
2025-03-23 20:02:07 +03:00
- Remove `ApplicationHandler::exited` , the event loop being shut down can now be listened to in
2025-03-17 10:56:00 +01:00
the `Drop` impl on the application handler.
2025-03-23 20:02:07 +03:00
- Remove `NamedKey::Space` , match on `Key::Character(" ")` instead.
- Remove `PartialEq` impl for `WindowAttributes` .
2024-07-22 12:11:27 +02:00
### Fixed
2024-07-23 19:59:37 +02:00
- On Orbital, `MonitorHandle::name()` now returns `None` instead of a dummy name.
2024-11-21 17:37:03 +01:00
- On iOS, fixed `SurfaceResized` and `Window::surface_size` not reporting the size of the actual surface.
2024-12-03 18:17:57 +01:00
- On macOS, fixed the scancode conversion for audio volume keys.
- On macOS, fixed the scancode conversion for `IntlBackslash` .
2024-12-03 18:35:04 +01:00
- On macOS, fixed redundant `SurfaceResized` event at window creation.