From 2d1d6cf54ed062d6855cb4dc6ffb77b7c396a7f9 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Thu, 23 Jul 2026 08:58:23 -0700 Subject: [PATCH 1/2] Bump MSRV to 1.86 --- .github/workflows/ci.yml | 20 ++++++++++---------- Cargo.toml | 2 +- README.md | 2 +- winit-win32/src/dnd.rs | 4 ++-- winit/src/changelog/v0.31.md | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 33980e54ae..c0d2239db3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,7 +55,7 @@ jobs: strategy: fail-fast: false matrix: - toolchain: [stable, nightly, '1.85'] + toolchain: [stable, nightly, '1.86'] platform: # Note: Make sure that we test all the `docs.rs` targets defined in Cargo.toml! - { name: 'Windows 64bit MSVC', target: x86_64-pc-windows-msvc, os: windows-latest, } @@ -82,13 +82,13 @@ jobs: - toolchain: nightly platform: { name: 'Windows 32bit GNU' } # Android is tested on stable-3 - - toolchain: '1.85' + - toolchain: '1.86' platform: { name: 'Android' } # Redox OS doesn't follow MSRV - - toolchain: '1.85' + - toolchain: '1.86' platform: { name: 'Redox OS' } include: - - toolchain: '1.85' + - toolchain: '1.86' platform: { name: 'Android', target: aarch64-linux-android, os: ubuntu-latest, options: '--package winit --features=android-native-activity', cmd: 'apk -- ' } - toolchain: 'nightly' platform: { name: 'Web', target: wasm32-unknown-unknown, os: ubuntu-latest, test-options: -Zdoctest-xcompile } @@ -230,19 +230,19 @@ jobs: - name: Test dpi crate if: > contains(matrix.platform.name, 'Linux 64bit') && - matrix.toolchain != '1.85' + matrix.toolchain != '1.86' run: cargo test -p dpi - name: Check dpi crate (no_std) if: > contains(matrix.platform.name, 'Linux 64bit') && - matrix.toolchain != '1.85' + matrix.toolchain != '1.86' run: cargo check -p dpi --no-default-features - name: Build tests if: > !contains(matrix.platform.target, 'redox') && - matrix.toolchain != '1.85' + matrix.toolchain != '1.86' run: cargo $CMD test --no-run $OPTIONS - name: Run tests @@ -251,7 +251,7 @@ jobs: !contains(matrix.platform.target, 'ios') && (!contains(matrix.platform.target, 'wasm32') || matrix.toolchain == 'nightly') && !contains(matrix.platform.target, 'redox') && - matrix.toolchain != '1.85' + matrix.toolchain != '1.86' run: cargo $CMD test $OPTIONS - name: Lint with clippy @@ -261,7 +261,7 @@ jobs: - name: Build tests with serde enabled if: > !contains(matrix.platform.target, 'redox') && - matrix.toolchain != '1.85' + matrix.toolchain != '1.86' run: cargo $CMD test --no-run $OPTIONS $TEST_OPTIONS --features serde - name: Run tests with serde enabled @@ -270,7 +270,7 @@ jobs: !contains(matrix.platform.target, 'ios') && (!contains(matrix.platform.target, 'wasm32') || matrix.toolchain == 'nightly') && !contains(matrix.platform.target, 'redox') && - matrix.toolchain != '1.85' + matrix.toolchain != '1.86' run: cargo $CMD test $OPTIONS $TEST_OPTIONS --features serde - name: Check docs.rs documentation diff --git a/Cargo.toml b/Cargo.toml index ef05ae1f83..5a49c19522 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ resolver = "3" edition = "2024" license = "Apache-2.0" repository = "https://github.com/rust-windowing/winit" -rust-version = "1.85" +rust-version = "1.86" version = "0.31.0-beta.2" [workspace.dependencies] diff --git a/README.md b/README.md index ac7fa2aef6..7a0ef15943 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ For contributing guidelines see [CONTRIBUTING.md](./CONTRIBUTING.md). ## MSRV Policy -This crate's Minimum Supported Rust Version (MSRV) is **1.85**. Changes to +This crate's Minimum Supported Rust Version (MSRV) is **1.86**. Changes to the MSRV will be accompanied by a minor version bump. As a **tentative** policy, the upper bound of the MSRV is given by the following diff --git a/winit-win32/src/dnd.rs b/winit-win32/src/dnd.rs index 7401e61b43..f64b99a050 100644 --- a/winit-win32/src/dnd.rs +++ b/winit-win32/src/dnd.rs @@ -664,7 +664,7 @@ fn pick_effect(actions: &[DndAction], key_state: u32, source_allowed: u32) -> u3 } // If holding a modifier would result in no valid values, ignore - // Need to use filter instead of if-let chains for 1.85 compatibility. + // Need to use filter instead of if-let chains for 1.86 compatibility. if let Some(new_allowed) = NonZeroU32::new(allowed & !DROPEFFECT_MOVE).filter(|_| key_state & MK_CONTROL != 0) { @@ -672,7 +672,7 @@ fn pick_effect(actions: &[DndAction], key_state: u32, source_allowed: u32) -> u3 } // If holding a modifier would result in no valid values, ignore - // Need to use filter instead of if-let chains for 1.85 compatibility. + // Need to use filter instead of if-let chains for 1.86 compatibility. if let Some(new_allowed) = NonZeroU32::new(allowed & !DROPEFFECT_COPY).filter(|_| key_state & MK_SHIFT != 0) { diff --git a/winit/src/changelog/v0.31.md b/winit/src/changelog/v0.31.md index d64bdd6e58..b206e3f025 100644 --- a/winit/src/changelog/v0.31.md +++ b/winit/src/changelog/v0.31.md @@ -73,7 +73,7 @@ - `ActiveEventLoop::create_window` now returns `Box`. - `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`. +- Bump MSRV from `1.70` to `1.86`. - Changed `ApplicationHandler::user_event` to `user_wake_up`, removing the generic user event. From f3154906b2abe56cee44b18a1c0f2eab7a4e92e9 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Wed, 13 May 2026 18:45:47 -0700 Subject: [PATCH 2/2] wayland: Update `sctk` to 0.21 This uses `Dispatch2`, which will be how `Dispatch` is defined in the upcoming wayland-rs release. --- winit-wayland/Cargo.toml | 4 +- winit-wayland/src/dnd.rs | 2 - winit-wayland/src/event_loop/mod.rs | 3 +- winit-wayland/src/seat/mod.rs | 12 ++- winit-wayland/src/seat/pointer/mod.rs | 85 +++--------------- .../src/seat/pointer/pointer_gesture.rs | 4 +- winit-wayland/src/seat/touch/mod.rs | 4 +- winit-wayland/src/state.rs | 9 +- winit-wayland/src/types/wp_tablet_input_v2.rs | 86 +++++++------------ winit-wayland/src/window/mod.rs | 2 +- winit-wayland/src/window/state.rs | 62 +++++++------ 11 files changed, 94 insertions(+), 179 deletions(-) diff --git a/winit-wayland/Cargo.toml b/winit-wayland/Cargo.toml index b4abd66f9a..7303e877cd 100644 --- a/winit-wayland/Cargo.toml +++ b/winit-wayland/Cargo.toml @@ -35,10 +35,10 @@ foldhash.workspace = true libc.workspace = true memmap2.workspace = true rustix = { workspace = true, features = ["std", "system", "thread", "process", "event", "pipe"] } -sctk = { package = "smithay-client-toolkit", version = "0.20.0", default-features = false, features = [ +sctk = { package = "smithay-client-toolkit", version = "0.21.0", default-features = false, features = [ "calloop", ] } -sctk-adwaita = { version = "0.11.0", default-features = false, optional = true } +sctk-adwaita = { version = "0.12.0", default-features = false, optional = true } wayland-backend = { version = "0.3.10", default-features = false, features = ["client_system"] } wayland-client = "0.31.10" wayland-protocols = { version = "0.32.12", features = ["staging", "unstable"] } diff --git a/winit-wayland/src/dnd.rs b/winit-wayland/src/dnd.rs index 65243cdfb7..13b164d1cb 100644 --- a/winit-wayland/src/dnd.rs +++ b/winit-wayland/src/dnd.rs @@ -801,5 +801,3 @@ impl DataDeviceHandler for WinitState { } } } - -sctk::delegate_data_device!(WinitState); diff --git a/winit-wayland/src/event_loop/mod.rs b/winit-wayland/src/event_loop/mod.rs index 04fbb2a6c3..456bfad84b 100644 --- a/winit-wayland/src/event_loop/mod.rs +++ b/winit-wayland/src/event_loop/mod.rs @@ -878,7 +878,8 @@ impl RootActiveEventLoop for ActiveEventLoop { let serial = seat .pointer_data() .ok_or(NotSupportedError::new(NO_POINTER_CAP_ERROR_MSG))? - .latest_button_serial(); + .latest_button_serial() + .unwrap_or_default(); data_source.start_drag(data_device, source_surface, icon_surface.as_ref(), serial); diff --git a/winit-wayland/src/seat/mod.rs b/winit-wayland/src/seat/mod.rs index cef665974c..13d005c0c5 100644 --- a/winit-wayland/src/seat/mod.rs +++ b/winit-wayland/src/seat/mod.rs @@ -10,7 +10,7 @@ use sctk::reexports::client::protocol::wl_touch::WlTouch; use sctk::reexports::client::{Connection, Proxy, QueueHandle}; use sctk::reexports::protocols::wp::relative_pointer::zv1::client::zwp_relative_pointer_v1::ZwpRelativePointerV1; use sctk::reexports::protocols::wp::text_input::zv3::client::zwp_text_input_v3::ZwpTextInputV3; -use sctk::seat::pointer::{ThemeSpec, ThemedPointer}; +use sctk::seat::pointer::{PointerData, ThemeSpec, ThemedPointer}; use sctk::seat::{Capability as SeatCapability, SeatHandler, SeatState}; use tracing::warn; use wayland_protocols::wp::pointer_gestures::zv1::client::zwp_pointer_gesture_hold_v1::ZwpPointerGestureHoldV1; @@ -87,7 +87,7 @@ impl WinitSeatState { self.data_device.as_ref() } - pub(crate) fn pointer_data(&self) -> Option<&WinitPointerData> { + pub(crate) fn pointer_data(&self) -> Option<&PointerData> { self.pointer.as_ref().and_then(|pointer| pointer.pointer().data()) } } @@ -128,7 +128,7 @@ impl SeatHandler for WinitState { .as_ref() .map(|state| state.get_viewport(&surface, queue_handle)); let surface_id = surface.id(); - let pointer_data = WinitPointerData::new(seat.clone(), viewport); + let pointer_data = WinitPointerData::new(viewport); let themed_pointer = self .seat_state .get_pointer_with_theme_and_data( @@ -252,8 +252,8 @@ impl SeatHandler for WinitState { let _ = self.pointer_surfaces.remove(&surface_id); // Remove the inner locks/confines before dropping the pointer. - pointer_data.unlock_pointer(); - pointer_data.unconfine_pointer(); + pointer_data.data().unlock_pointer(); + pointer_data.data().unconfine_pointer(); if pointer.pointer().version() >= 3 { pointer.pointer().release(); @@ -300,5 +300,3 @@ impl WinitState { } } } - -sctk::delegate_seat!(WinitState); diff --git a/winit-wayland/src/seat/pointer/mod.rs b/winit-wayland/src/seat/pointer/mod.rs index 6e9aa20092..e80add88eb 100644 --- a/winit-wayland/src/seat/pointer/mod.rs +++ b/winit-wayland/src/seat/pointer/mod.rs @@ -8,13 +8,10 @@ use tracing::warn; use sctk::reexports::client::delegate_dispatch; use sctk::reexports::client::protocol::wl_pointer::WlPointer; -use sctk::reexports::client::protocol::wl_seat::WlSeat; use sctk::reexports::client::protocol::wl_surface::WlSurface; use sctk::reexports::client::{Connection, Proxy, QueueHandle, Dispatch}; use sctk::reexports::protocols::wp::pointer_constraints::zv1::client::zwp_confined_pointer_v1::ZwpConfinedPointerV1; use sctk::reexports::protocols::wp::pointer_constraints::zv1::client::zwp_locked_pointer_v1::ZwpLockedPointerV1; -use sctk::reexports::protocols::wp::cursor_shape::v1::client::wp_cursor_shape_device_v1::WpCursorShapeDeviceV1; -use sctk::reexports::protocols::wp::cursor_shape::v1::client::wp_cursor_shape_manager_v1::WpCursorShapeManagerV1; use sctk::reexports::protocols::wp::pointer_constraints::zv1::client::zwp_pointer_constraints_v1::{Lifetime, ZwpPointerConstraintsV1}; use sctk::reexports::client::globals::{BindError, GlobalList}; use sctk::reexports::csd_frame::FrameClick; @@ -22,10 +19,7 @@ use sctk::reexports::protocols::wp::viewporter::client::wp_viewport::WpViewport; use sctk::compositor::SurfaceData; use sctk::globals::GlobalData; -use sctk::seat::SeatState; -use sctk::seat::pointer::{ - PointerData, PointerDataExt, PointerEvent, PointerEventKind, PointerHandler, -}; +use sctk::seat::pointer::{PointerData, PointerEvent, PointerEventKind, PointerHandler}; use dpi::{LogicalPosition, PhysicalPosition}; use winit_core::event::{ @@ -68,7 +62,7 @@ impl PointerHandler for WinitState { let surface = &event.surface; // The parent surface. - let parent_surface = match event.surface.data::() { + let parent_surface = match event.surface.data::>() { Some(data) => data.parent_surface().unwrap_or(surface), None => continue, }; @@ -140,13 +134,13 @@ impl PointerHandler for WinitState { window.pointer_entered(Arc::downgrade(themed_pointer)); // Set the currently focused surface. - pointer.winit_data().inner.lock().unwrap().surface = Some(window_id); + pointer.winit_data().data().inner.lock().unwrap().surface = Some(window_id); }, PointerEventKind::Leave { .. } => { window.pointer_left(Arc::downgrade(themed_pointer)); // Remove the active surface. - pointer.winit_data().inner.lock().unwrap().surface = None; + pointer.winit_data().data().inner.lock().unwrap().surface = None; self.events_sink.push_window_event( WindowEvent::PointerLeft { @@ -172,7 +166,7 @@ impl PointerHandler for WinitState { ref kind @ PointerEventKind::Press { button, serial, .. } | ref kind @ PointerEventKind::Release { button, serial, .. } => { // Update the last button serial. - pointer.winit_data().inner.lock().unwrap().latest_button_serial = serial; + pointer.winit_data().data().inner.lock().unwrap().latest_button_serial = serial; let button = wayland_button_to_winit(button); let state = if matches!(kind, PointerEventKind::Press { .. }) { @@ -193,7 +187,7 @@ impl PointerHandler for WinitState { }, PointerEventKind::Axis { horizontal, vertical, .. } => { // Get the current phase. - let mut pointer_data = pointer.winit_data().inner.lock().unwrap(); + let mut pointer_data = pointer.winit_data().data().inner.lock().unwrap(); let has_value120_scroll = horizontal.value120 != 0 || vertical.value120 != 0; let has_discrete_scroll = horizontal.discrete != 0 || vertical.discrete != 0; @@ -253,20 +247,13 @@ pub struct WinitPointerData { /// The inner winit data associated with the pointer. inner: Mutex, - /// The data required by the sctk. - sctk_data: PointerData, - /// Viewport for fractional cursor. viewport: Option, } impl WinitPointerData { - pub fn new(seat: WlSeat, viewport: Option) -> Self { - Self { - inner: Mutex::new(WinitPointerDataInner::default()), - sctk_data: PointerData::new(seat), - viewport, - } + pub fn new(viewport: Option) -> Self { + Self { inner: Mutex::new(WinitPointerDataInner::default()), viewport } } pub fn lock_pointer( @@ -320,26 +307,11 @@ impl WinitPointerData { } } - /// Seat associated with this pointer. - pub fn seat(&self) -> &WlSeat { - self.sctk_data.seat() - } - /// Active window. pub fn focused_window(&self) -> Option { self.inner.lock().unwrap().surface } - /// Last button serial. - pub fn latest_button_serial(&self) -> u32 { - self.sctk_data.latest_button_serial().unwrap_or_default() - } - - /// Last enter serial. - pub fn latest_enter_serial(&self) -> u32 { - self.sctk_data.latest_enter_serial().unwrap_or_default() - } - pub fn set_locked_cursor_position(&self, surface_x: f64, surface_y: f64) { let inner = self.inner.lock().unwrap(); if let Some(locked_pointer) = inner.locked_pointer.as_ref() { @@ -360,12 +332,6 @@ impl Drop for WinitPointerData { } } -impl PointerDataExt for WinitPointerData { - fn pointer_data(&self) -> &PointerData { - &self.sctk_data - } -} - #[derive(Debug)] pub struct WinitPointerDataInner { /// The associated locked pointer. @@ -423,12 +389,12 @@ fn wayland_button_to_winit(button: u32) -> ButtonSource { } pub trait WinitPointerDataExt { - fn winit_data(&self) -> &WinitPointerData; + fn winit_data(&self) -> &PointerData; } impl WinitPointerDataExt for WlPointer { - fn winit_data(&self) -> &WinitPointerData { - self.data::().expect("failed to get pointer data.") + fn winit_data(&self) -> &PointerData { + self.data::>().expect("failed to get pointer data.") } } @@ -491,35 +457,6 @@ impl Dispatch for PointerConstrain } } -impl Dispatch for SeatState { - fn event( - _: &mut WinitState, - _: &WpCursorShapeDeviceV1, - _: ::Event, - _: &GlobalData, - _: &Connection, - _: &QueueHandle, - ) { - unreachable!("wp_cursor_shape_manager has no events") - } -} - -impl Dispatch for SeatState { - fn event( - _: &mut WinitState, - _: &WpCursorShapeManagerV1, - _: ::Event, - _: &GlobalData, - _: &Connection, - _: &QueueHandle, - ) { - unreachable!("wp_cursor_device_manager has no events") - } -} - -delegate_dispatch!(WinitState: [ WlPointer: WinitPointerData] => SeatState); -delegate_dispatch!(WinitState: [ WpCursorShapeManagerV1: GlobalData] => SeatState); -delegate_dispatch!(WinitState: [ WpCursorShapeDeviceV1: GlobalData] => SeatState); delegate_dispatch!(WinitState: [ZwpPointerConstraintsV1: GlobalData] => PointerConstraintsState); delegate_dispatch!(WinitState: [ZwpLockedPointerV1: GlobalData] => PointerConstraintsState); delegate_dispatch!(WinitState: [ZwpConfinedPointerV1: GlobalData] => PointerConstraintsState); diff --git a/winit-wayland/src/seat/pointer/pointer_gesture.rs b/winit-wayland/src/seat/pointer/pointer_gesture.rs index 238130de92..1385a2c102 100644 --- a/winit-wayland/src/seat/pointer/pointer_gesture.rs +++ b/winit-wayland/src/seat/pointer/pointer_gesture.rs @@ -134,7 +134,9 @@ impl Dispatch for Poin } // Don't handle events from a subsurface. - if surface.data::().is_none_or(|data| data.parent_surface().is_some()) + if surface + .data::>() + .is_none_or(|data| data.parent_surface().is_some()) { return; } diff --git a/winit-wayland/src/seat/touch/mod.rs b/winit-wayland/src/seat/touch/mod.rs index f0c9bab0ff..82b48db663 100644 --- a/winit-wayland/src/seat/touch/mod.rs +++ b/winit-wayland/src/seat/touch/mod.rs @@ -247,8 +247,6 @@ pub trait TouchDataExt { impl TouchDataExt for WlTouch { fn seat(&self) -> &WlSeat { - self.data::().expect("failed to get touch data.").seat() + self.data::>().expect("failed to get touch data.").seat() } } - -sctk::delegate_touch!(WinitState); diff --git a/winit-wayland/src/state.rs b/winit-wayland/src/state.rs index 8c06edc2f8..c6b5fdb647 100644 --- a/winit-wayland/src/state.rs +++ b/winit-wayland/src/state.rs @@ -268,7 +268,7 @@ impl WinitState { self.window_compositor_updates[pos].scale_changed = true; } else if let Some(pointer) = self.pointer_surfaces.get(&surface.id()) { // Get the window, where the pointer resides right now. - let focused_window = match pointer.pointer().winit_data().focused_window() { + let focused_window = match pointer.pointer().winit_data().data().focused_window() { Some(focused_window) => focused_window, None => return, }; @@ -467,10 +467,5 @@ impl WindowCompositorUpdate { } } -sctk::delegate_subcompositor!(WinitState); -sctk::delegate_compositor!(WinitState); -sctk::delegate_output!(WinitState); +sctk::delegate_dispatch2!(WinitState); sctk::delegate_registry!(WinitState); -sctk::delegate_shm!(WinitState); -sctk::delegate_xdg_shell!(WinitState); -sctk::delegate_xdg_window!(WinitState); diff --git a/winit-wayland/src/types/wp_tablet_input_v2.rs b/winit-wayland/src/types/wp_tablet_input_v2.rs index 6ac1eaf1ed..7da798c397 100644 --- a/winit-wayland/src/types/wp_tablet_input_v2.rs +++ b/winit-wayland/src/types/wp_tablet_input_v2.rs @@ -4,14 +4,12 @@ use std::sync::Mutex; use dpi::LogicalPosition; use sctk::compositor::SurfaceData; -use sctk::globals::GlobalData; +use sctk::dispatch2::Dispatch2; use sctk::reexports::client::backend::smallvec::SmallVec; use sctk::reexports::client::globals::{BindError, GlobalList}; use sctk::reexports::client::protocol::wl_seat::WlSeat; use sctk::reexports::client::protocol::wl_surface::WlSurface; -use sctk::reexports::client::{ - Connection, Dispatch, Proxy, QueueHandle, WEnum, delegate_dispatch, event_created_child, -}; +use sctk::reexports::client::{Connection, Proxy, QueueHandle, WEnum, event_created_child}; use sctk::reexports::protocols::wp::tablet::zv2::client::zwp_tablet_manager_v2::ZwpTabletManagerV2; use sctk::reexports::protocols::wp::tablet::zv2::client::zwp_tablet_pad_v2::ZwpTabletPadV2; use sctk::reexports::protocols::wp::tablet::zv2::client::zwp_tablet_seat_v2::{ @@ -47,7 +45,7 @@ impl TabletManager { queue_handle: &QueueHandle, ) -> Result { // Ignore v2 since we are not interested in its events. - let manager = globals.bind(queue_handle, 1..=1, GlobalData)?; + let manager = globals.bind(queue_handle, 1..=1, ())?; Ok(Self { manager }) } @@ -59,25 +57,12 @@ impl TabletManager { self.manager.get_tablet_seat(seat, queue_handle, ()) } } -impl Dispatch for TabletManager { - fn event( - _: &mut WinitState, - _: &ZwpTabletManagerV2, - _: ::Event, - _: &GlobalData, - _: &Connection, - _: &QueueHandle, - ) { - unreachable!("no events defined for zwp_tablet_manager_v2"); - } -} - -impl Dispatch for TabletManager { +impl Dispatch2 for () { fn event( + &self, _: &mut WinitState, _: &ZwpTabletManagerV2, _: ::Event, - _: &(), _: &Connection, _: &QueueHandle, ) { @@ -85,34 +70,34 @@ impl Dispatch for TabletManager { } } -impl Dispatch for TabletManager { +impl Dispatch2 for () { event_created_child!(WinitState, ZwpTabletSeatV2, [ - zwp_tablet_seat_v2::EVT_TABLET_ADDED_OPCODE => (ZwpTabletV2, Default::default()), - zwp_tablet_seat_v2::EVT_TOOL_ADDED_OPCODE => (ZwpTabletToolV2, Default::default()), - zwp_tablet_seat_v2::EVT_PAD_ADDED_OPCODE => (ZwpTabletPadV2, Default::default()) + zwp_tablet_seat_v2::EVT_TABLET_ADDED_OPCODE => (ZwpTabletV2, ()), + zwp_tablet_seat_v2::EVT_TOOL_ADDED_OPCODE => (ZwpTabletToolV2, TabletToolData::default()), + zwp_tablet_seat_v2::EVT_PAD_ADDED_OPCODE => (ZwpTabletPadV2, ()) ]); fn event( + &self, _: &mut WinitState, _: &ZwpTabletSeatV2, _: ::Event, - _: &(), _: &Connection, _: &QueueHandle, ) { } } -impl Dispatch for TabletManager { +impl Dispatch2 for TabletToolData { fn event( + &self, state: &mut WinitState, _: &ZwpTabletToolV2, event: ::Event, - data: &TabletToolData, _: &Connection, _: &QueueHandle, ) { - let mut data = data.inner.lock().unwrap(); + let mut data = self.inner.lock().unwrap(); match event { ToolEvent::Type { tool_type: WEnum::Value(tool_type) } => { @@ -198,7 +183,7 @@ impl Dispatch for TabletManager { let surface = match data .surface .as_ref() - .map(|surface| (surface, surface.data::())) + .map(|surface| (surface, surface.data::>())) { Some((surface, Some(surface_data))) if surface_data.parent_surface().is_none() => @@ -318,95 +303,84 @@ pub(crate) enum TabletEvent { Button { button: TabletToolButton, state: ElementState, serial: Option }, } -impl Dispatch for TabletManager { +impl Dispatch2 for () { fn event( + &self, _: &mut WinitState, _: &ZwpTabletV2, _: ::Event, - _: &(), _: &Connection, _: &QueueHandle, ) { } } -impl Dispatch for TabletManager { +impl Dispatch2 for () { event_created_child!(WinitState, ZwpTabletPadV2, [ - zwp_tablet_pad_v2::EVT_GROUP_OPCODE => (ZwpTabletPadGroupV2, Default::default()), + zwp_tablet_pad_v2::EVT_GROUP_OPCODE => (ZwpTabletPadGroupV2, ()), ]); fn event( + &self, _: &mut WinitState, _: &ZwpTabletPadV2, _: ::Event, - _: &(), _: &Connection, _: &QueueHandle, ) { } } -impl Dispatch for TabletManager { +impl Dispatch2 for () { event_created_child!(WinitState, ZwpTabletPadGroupV2, [ - zwp_tablet_pad_group_v2::EVT_RING_OPCODE => (ZwpTabletPadRingV2, Default::default()), - zwp_tablet_pad_group_v2::EVT_STRIP_OPCODE => (ZwpTabletPadStripV2, Default::default()), - zwp_tablet_pad_group_v2::EVT_DIAL_OPCODE => (ZwpTabletPadDialV2, Default::default()), + zwp_tablet_pad_group_v2::EVT_RING_OPCODE => (ZwpTabletPadRingV2, ()), + zwp_tablet_pad_group_v2::EVT_STRIP_OPCODE => (ZwpTabletPadStripV2, ()), + zwp_tablet_pad_group_v2::EVT_DIAL_OPCODE => (ZwpTabletPadDialV2, ()), ]); fn event( + &self, _: &mut WinitState, _: &ZwpTabletPadGroupV2, _: ::Event, - _: &(), _: &Connection, _: &QueueHandle, ) { } } -impl Dispatch for TabletManager { +impl Dispatch2 for () { fn event( + &self, _: &mut WinitState, _: &ZwpTabletPadRingV2, _: ::Event, - _: &(), _: &Connection, _: &QueueHandle, ) { } } -impl Dispatch for TabletManager { +impl Dispatch2 for () { fn event( + &self, _: &mut WinitState, _: &ZwpTabletPadStripV2, _: ::Event, - _: &(), _: &Connection, _: &QueueHandle, ) { } } -impl Dispatch for TabletManager { +impl Dispatch2 for () { fn event( + &self, _: &mut WinitState, _: &ZwpTabletPadDialV2, _: ::Event, - _: &(), _: &Connection, _: &QueueHandle, ) { } } - -delegate_dispatch!(WinitState: [ZwpTabletManagerV2: GlobalData] => TabletManager); -delegate_dispatch!(WinitState: [ZwpTabletManagerV2: ()] => TabletManager); -delegate_dispatch!(WinitState: [ZwpTabletSeatV2: ()] => TabletManager); -delegate_dispatch!(WinitState: [ZwpTabletV2: ()] => TabletManager); -delegate_dispatch!(WinitState: [ZwpTabletToolV2: TabletToolData] => TabletManager); -delegate_dispatch!(WinitState: [ZwpTabletPadV2: ()] => TabletManager); -delegate_dispatch!(WinitState: [ZwpTabletPadGroupV2: ()] => TabletManager); -delegate_dispatch!(WinitState: [ZwpTabletPadRingV2: ()] => TabletManager); -delegate_dispatch!(WinitState: [ZwpTabletPadStripV2: ()] => TabletManager); -delegate_dispatch!(WinitState: [ZwpTabletPadDialV2: ()] => TabletManager); diff --git a/winit-wayland/src/window/mod.rs b/winit-wayland/src/window/mod.rs index 2f2d973219..7078717ddc 100644 --- a/winit-wayland/src/window/mod.rs +++ b/winit-wayland/src/window/mod.rs @@ -637,7 +637,7 @@ impl CoreWindow for Window { } fn current_monitor(&self) -> Option { - let data = self.window.wl_surface().data::()?; + let data = self.window.wl_surface().data::>()?; data.outputs() .next() .map(MonitorHandle::new) diff --git a/winit-wayland/src/window/state.rs b/winit-wayland/src/window/state.rs index 0e299b972f..c7bfe28243 100644 --- a/winit-wayland/src/window/state.rs +++ b/winit-wayland/src/window/state.rs @@ -6,7 +6,7 @@ use std::time::Duration; use dpi::{LogicalPosition, LogicalSize, PhysicalPosition, PhysicalSize, Size}; use foldhash::HashSet; -use sctk::compositor::{CompositorState, Region, SurfaceData, SurfaceDataExt}; +use sctk::compositor::{CompositorState, FrameCallbackData, Region, SurfaceData}; use sctk::globals::GlobalData; use sctk::reexports::client::backend::ObjectId; use sctk::reexports::client::protocol::wl_seat::WlSeat; @@ -20,7 +20,7 @@ use sctk::reexports::protocols::wp::fractional_scale::v1::client::wp_fractional_ use sctk::reexports::protocols::wp::text_input::zv3::client::zwp_text_input_v3::ZwpTextInputV3; use sctk::reexports::protocols::wp::viewporter::client::wp_viewport::WpViewport; use sctk::reexports::protocols::xdg::shell::client::xdg_toplevel::ResizeEdge as XdgResizeEdge; -use sctk::seat::pointer::{PointerDataExt, ThemedPointer}; +use sctk::seat::pointer::{PointerData, ThemedPointer}; use sctk::shell::WaylandSurface; use sctk::shell::xdg::XdgSurface; use sctk::shell::xdg::window::{DecorationMode, Window, WindowConfigure}; @@ -250,7 +250,9 @@ impl WindowState { } /// Apply closure on the given pointer. - fn apply_on_pointer, &WinitPointerData)>( + fn apply_on_pointer< + F: FnMut(&ThemedPointer, &PointerData), + >( &self, mut callback: F, ) { @@ -281,7 +283,7 @@ impl WindowState { match self.frame_callback_state { FrameCallbackState::None | FrameCallbackState::Received => { self.frame_callback_state = FrameCallbackState::Requested; - surface.frame(&self.queue_handle, surface.clone()); + surface.frame(&self.queue_handle, FrameCallbackData(surface.clone())); }, FrameCallbackState::Requested => (), } @@ -460,9 +462,10 @@ impl WindowState { // TODO(kchibisov) handle touch serials. self.apply_on_pointer(|_, data| { - let serial = data.latest_button_serial(); - let seat = data.seat(); - xdg_toplevel.resize(seat, serial, resize_direction_to_xdg(direction)); + if let Some(serial) = data.latest_button_serial() { + let seat = data.seat(); + xdg_toplevel.resize(seat, serial, resize_direction_to_xdg(direction)); + } }); Ok(()) @@ -473,9 +476,10 @@ impl WindowState { let xdg_toplevel = self.window.xdg_toplevel(); // TODO(kchibisov) handle touch serials. self.apply_on_pointer(|_, data| { - let serial = data.latest_button_serial(); - let seat = data.seat(); - xdg_toplevel._move(seat, serial); + if let Some(serial) = data.latest_button_serial() { + let seat = data.seat(); + xdg_toplevel._move(seat, serial); + } }); Ok(()) @@ -815,13 +819,13 @@ impl WindowState { self.apply_on_pointer(|pointer, data| { let surface = pointer.surface(); - let scale = if let Some(viewport) = data.viewport() { + let scale = if let Some(viewport) = data.data().viewport() { let scale = self.scale_factor(); let size = PhysicalSize::new(cursor.w, cursor.h).to_logical(scale); viewport.set_destination(size.width, size.height); scale } else if surface.version() >= 3 { - let scale = surface.data::().unwrap().surface_data().scale_factor(); + let scale = surface.data::>().unwrap().scale_factor(); surface.set_buffer_scale(scale); scale as f64 } else { @@ -839,8 +843,8 @@ impl WindowState { let serial = pointer .pointer() - .data::() - .and_then(|data| data.pointer_data().latest_enter_serial()) + .data::>() + .and_then(|data| data.latest_enter_serial()) .unwrap(); let hotspot = @@ -929,12 +933,12 @@ impl WindowState { match self.cursor_grab_mode.current_grab_mode { CursorGrabMode::None => unset_old = true, CursorGrabMode::Confined => self.apply_on_pointer(|_, data| { - data.unconfine_pointer(); + data.data().unconfine_pointer(); unset_old = true; }), CursorGrabMode::Locked => { self.apply_on_pointer(|_, data| { - data.unlock_pointer(); + data.data().unlock_pointer(); unset_old = true; }); }, @@ -951,12 +955,17 @@ impl WindowState { match mode { CursorGrabMode::Locked => self.apply_on_pointer(|pointer, data| { let pointer = pointer.pointer(); - data.lock_pointer(pointer_constraints, surface, pointer, &self.queue_handle); + data.data().lock_pointer(pointer_constraints, surface, pointer, &self.queue_handle); set_mode = true; }), CursorGrabMode::Confined => self.apply_on_pointer(|pointer, data| { let pointer = pointer.pointer(); - data.confine_pointer(pointer_constraints, surface, pointer, &self.queue_handle); + data.data().confine_pointer( + pointer_constraints, + surface, + pointer, + &self.queue_handle, + ); set_mode = true; }), CursorGrabMode::None => { @@ -976,9 +985,10 @@ impl WindowState { pub fn show_window_menu(&self, position: LogicalPosition) { // TODO(kchibisov) handle touch serials. self.apply_on_pointer(|_, data| { - let serial = data.latest_button_serial(); - let seat = data.seat(); - self.window.show_window_menu(seat, serial, position.into()); + if let Some(serial) = data.latest_button_serial() { + let seat = data.seat(); + self.window.show_window_menu(seat, serial, position.into()); + } }); } @@ -997,7 +1007,7 @@ impl WindowState { } self.apply_on_pointer(|_, data| { - data.set_locked_cursor_position(position.x, position.y); + data.data().set_locked_cursor_position(position.x, position.y); }); Ok(()) @@ -1014,9 +1024,11 @@ impl WindowState { } } else { for pointer in self.pointers.iter().filter_map(|pointer| pointer.upgrade()) { - let latest_enter_serial = pointer.pointer().winit_data().latest_enter_serial(); - - pointer.pointer().set_cursor(latest_enter_serial, None, 0, 0); + if let Some(latest_enter_serial) = + pointer.pointer().winit_data().latest_enter_serial() + { + pointer.pointer().set_cursor(latest_enter_serial, None, 0, 0); + } } } }