mirror of
https://github.com/rust-windowing/winit.git
synced 2026-06-27 15:13:13 -04:00
78 lines
2.4 KiB
Rust
78 lines
2.4 KiB
Rust
//! Relative pointer.
|
|
|
|
use std::ops::Deref;
|
|
|
|
use sctk::reexports::client::globals::{BindError, GlobalList};
|
|
use sctk::reexports::client::{delegate_dispatch, Dispatch};
|
|
use sctk::reexports::client::{Connection, QueueHandle};
|
|
use sctk::reexports::protocols::wp::relative_pointer::zv1::{
|
|
client::zwp_relative_pointer_manager_v1::ZwpRelativePointerManagerV1,
|
|
client::zwp_relative_pointer_v1::{self, ZwpRelativePointerV1},
|
|
};
|
|
|
|
use sctk::globals::GlobalData;
|
|
|
|
use winit_core::event::DeviceEvent;
|
|
use crate::state::WinitState;
|
|
|
|
/// Wrapper around the relative pointer.
|
|
#[derive(Debug)]
|
|
pub struct RelativePointerState {
|
|
manager: ZwpRelativePointerManagerV1,
|
|
}
|
|
|
|
impl RelativePointerState {
|
|
/// Create new relative pointer manager.
|
|
pub fn new(
|
|
globals: &GlobalList,
|
|
queue_handle: &QueueHandle<WinitState>,
|
|
) -> Result<Self, BindError> {
|
|
let manager = globals.bind(queue_handle, 1..=1, GlobalData)?;
|
|
Ok(Self { manager })
|
|
}
|
|
}
|
|
|
|
impl Deref for RelativePointerState {
|
|
type Target = ZwpRelativePointerManagerV1;
|
|
|
|
fn deref(&self) -> &Self::Target {
|
|
&self.manager
|
|
}
|
|
}
|
|
|
|
impl Dispatch<ZwpRelativePointerManagerV1, GlobalData, WinitState> for RelativePointerState {
|
|
fn event(
|
|
_state: &mut WinitState,
|
|
_proxy: &ZwpRelativePointerManagerV1,
|
|
_event: <ZwpRelativePointerManagerV1 as wayland_client::Proxy>::Event,
|
|
_data: &GlobalData,
|
|
_conn: &Connection,
|
|
_qhandle: &QueueHandle<WinitState>,
|
|
) {
|
|
}
|
|
}
|
|
|
|
impl Dispatch<ZwpRelativePointerV1, GlobalData, WinitState> for RelativePointerState {
|
|
fn event(
|
|
state: &mut WinitState,
|
|
_proxy: &ZwpRelativePointerV1,
|
|
event: <ZwpRelativePointerV1 as wayland_client::Proxy>::Event,
|
|
_data: &GlobalData,
|
|
_conn: &Connection,
|
|
_qhandle: &QueueHandle<WinitState>,
|
|
) {
|
|
let (dx_unaccel, dy_unaccel) = match event {
|
|
zwp_relative_pointer_v1::Event::RelativeMotion { dx_unaccel, dy_unaccel, .. } => {
|
|
(dx_unaccel, dy_unaccel)
|
|
},
|
|
_ => return,
|
|
};
|
|
state
|
|
.events_sink
|
|
.push_device_event(DeviceEvent::PointerMotion { delta: (dx_unaccel, dy_unaccel) });
|
|
}
|
|
}
|
|
|
|
delegate_dispatch!(WinitState: [ZwpRelativePointerV1: GlobalData] => RelativePointerState);
|
|
delegate_dispatch!(WinitState: [ZwpRelativePointerManagerV1: GlobalData] => RelativePointerState);
|