winit/platform_impl/linux/wayland/seat/pointer/
relative_pointer.rs

1//! Relative pointer.
2
3use std::ops::Deref;
4
5use sctk::reexports::client::globals::{BindError, GlobalList};
6use sctk::reexports::client::{delegate_dispatch, Dispatch};
7use sctk::reexports::client::{Connection, QueueHandle};
8use sctk::reexports::protocols::wp::relative_pointer::zv1::{
9    client::zwp_relative_pointer_manager_v1::ZwpRelativePointerManagerV1,
10    client::zwp_relative_pointer_v1::{self, ZwpRelativePointerV1},
11};
12
13use sctk::globals::GlobalData;
14
15use crate::event::DeviceEvent;
16use crate::platform_impl::wayland::state::WinitState;
17
18/// Wrapper around the relative pointer.
19pub struct RelativePointerState {
20    manager: ZwpRelativePointerManagerV1,
21}
22
23impl RelativePointerState {
24    /// Create new relative pointer manager.
25    pub fn new(
26        globals: &GlobalList,
27        queue_handle: &QueueHandle<WinitState>,
28    ) -> Result<Self, BindError> {
29        let manager = globals.bind(queue_handle, 1..=1, GlobalData)?;
30        Ok(Self { manager })
31    }
32}
33
34impl Deref for RelativePointerState {
35    type Target = ZwpRelativePointerManagerV1;
36
37    fn deref(&self) -> &Self::Target {
38        &self.manager
39    }
40}
41
42impl Dispatch<ZwpRelativePointerManagerV1, GlobalData, WinitState> for RelativePointerState {
43    fn event(
44        _state: &mut WinitState,
45        _proxy: &ZwpRelativePointerManagerV1,
46        _event: <ZwpRelativePointerManagerV1 as wayland_client::Proxy>::Event,
47        _data: &GlobalData,
48        _conn: &Connection,
49        _qhandle: &QueueHandle<WinitState>,
50    ) {
51    }
52}
53
54impl Dispatch<ZwpRelativePointerV1, GlobalData, WinitState> for RelativePointerState {
55    fn event(
56        state: &mut WinitState,
57        _proxy: &ZwpRelativePointerV1,
58        event: <ZwpRelativePointerV1 as wayland_client::Proxy>::Event,
59        _data: &GlobalData,
60        _conn: &Connection,
61        _qhandle: &QueueHandle<WinitState>,
62    ) {
63        let (dx_unaccel, dy_unaccel) = match event {
64            zwp_relative_pointer_v1::Event::RelativeMotion { dx_unaccel, dy_unaccel, .. } => {
65                (dx_unaccel, dy_unaccel)
66            },
67            _ => return,
68        };
69        state
70            .events_sink
71            .push_device_event(DeviceEvent::Motion { axis: 0, value: dx_unaccel }, super::DeviceId);
72        state
73            .events_sink
74            .push_device_event(DeviceEvent::Motion { axis: 1, value: dy_unaccel }, super::DeviceId);
75        state.events_sink.push_device_event(
76            DeviceEvent::MouseMotion { delta: (dx_unaccel, dy_unaccel) },
77            super::DeviceId,
78        );
79    }
80}
81
82delegate_dispatch!(WinitState: [ZwpRelativePointerV1: GlobalData] => RelativePointerState);
83delegate_dispatch!(WinitState: [ZwpRelativePointerManagerV1: GlobalData] => RelativePointerState);