winit 0.31.0-beta.3

Cross-platform window creation library.
Documentation
## 0.31.0-beta.3

### Added

- Add `keyboard` support for OpenHarmony.
- On iOS, add Apple Pencil support with force, altitude, and azimuth data.
- On Redox, add support for missing keyboard scancodes.
- On Redox, add support for `EventLoopExtPumpEvents::pump_app_events`.
- Implement `Send` and `Sync` for `OwnedDisplayHandle`.
- Use new macOS 15 cursors for resize icons.
- On Android, added scancode conversions for more obscure key codes.
- On Wayland, added `HoldGesture` event for multi-finger hold gestures
- On Wayland, added ext-background-effect-v1 support.
- On Wayland, Windows and macOS, added native popups (`WindowType::Popup`), with
  `WindowAttributes::with_positioner` for configuring their placement via a
  `WindowPositioner` (grouping the anchor edge/corner, the anchor rect, the
  gravity direction, the positioner offset and the constraint adjustment, using
  the new `WindowAnchor`, `WindowGravity` and `WindowConstraintAdjustment`
  types), and matching `Window::positioner`/`set_positioner` methods for
  reading/controlling it at runtime. These work on every `Window`, popup or not;
  use `Window::window_type` to tell whether a given window is a genuine
  `WindowType::Popup`. On Windows and macOS, which have no native positioner
  concept, the placement is computed by winit itself, mirroring Wayland's
  `xdg_positioner` behavior, and it also works for a plain `WindowType::Window`
  that has a parent; on Wayland the positioner is part of the `xdg_popup`
  protocol, so it only applies to `WindowType::Popup`.
- On macOS, add `WindowAttributesMacOS::with_fullscreen_auxiliary` and
  `WindowExtMacOS::set_fullscreen_auxiliary` / `WindowExtMacOS::fullscreen_auxiliary`, allowing a
  window to be shown on the same Space as a fullscreen window
  (`NSWindowCollectionBehaviorFullScreenAuxiliary`) instead of triggering a Space switch or Split
  View tiling.
- Add `WindowEvent::PointerButton::is_macos_activation_click`. On macOS, both the press and
  matching release of a click that activated a previously inactive window are tagged, so
  applications can ignore activation clicks for buttons or destructive actions while accepting
  them for low-risk actions like selection or scrolling. Always `false` on other platforms.
- `winit::event_loop::EventLoopProvider` trait with common event loop methods.

### Changed

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

  ```rust,ignore
  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`.

### Removed

- On macOS, remove `WindowAttributesMacOS::with_accepts_first_mouse`. Use the new per-event
  `WindowEvent::PointerButton::is_macos_activation_click` flag instead. To preserve the old
  `with_accepts_first_mouse(false)` behavior, ignore `PointerButton` press events (and their
  matching releases / drags) where `is_macos_activation_click` is `true`.

### Fixed

- On X11, return `NotSupported` instead of panicking when XInput 2.0, XRandR
  1.2, or XKB 1.0 is unavailable.
- On Windows, fix a freeze that occurs when the keyboard layout is switched by
  tools such as Punto Switcher. The `WM_INPUTLANGCHANGE` message is now handled
  to refresh the cached keyboard layout, while still deferring to
  `DefWindowProc` for normal propagation.
- On Windows, fix getting the window's DPI internally leaks `HDC` handles.
  Also only call `GetDC` when on < Windows 8.1 which improves its performance.
- On Windows, fix window icons rendering with red and blue swapped when the same `Icon` is
  applied more than once (e.g. sharing one icon between the window and the taskbar). The RGBA
  to BGRA conversion no longer mutates the shared pixel buffer.
- On Redox, handle `EINTR` when reading from `event_socket` instead of panicking.
- On X11, fix all pointer input being dropped for absolute pointing devices
  without pressure or tilt axes, such as the emulated tablets of
  QEMU/VMware/VirtualBox virtual machines and SPICE/VDI viewers. These were
  misclassified as pens, whose events the motion/button handlers discard.
- On Wayland, switch from using the `ahash` hashing algorithm to `foldhash`.
- On macOS, fix borderless game presentation options not sticking after switching spaces.
- On macOS, fix IME being locked on (regardless of requests to disable) after being enabled once.
- On macOS, fix a panic and incorrect cursor position in Ime::Preedit when the preedit string contains special characters (ie. emojis) caused by incorrect UTF-16 to UTF-8 offset conversion.
- On macOS, prevent an older deferred surface resize from overriding newer sizes after AppKit
  transitions.
- On Wayland, fix a protocol error when setting a custom cursor on compositors with `wl_surface` version below 3.
- On Redox, fix `run_app_on_demand` exiting immediately after a previous `run_app_on_demand` called `exit`.
- On Redox, fill in logical key for keyboard events rather than emitting a separate fake IME event.
- On Redox, handle window closes during `ApplicationHandler` drop.

## 0.31.0-beta.2

### 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`.

## 0.31.0-beta.1

### 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.86`.
- 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 `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`.
  - 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.