winit/platform_impl/linux/wayland/seat/pointer/
relative_pointer.rs
1use 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
18pub struct RelativePointerState {
20 manager: ZwpRelativePointerManagerV1,
21}
22
23impl RelativePointerState {
24 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);