use crate::error::Result;
use crate::protocol::FrameType;
use crate::protocol::command::{move_cursor_payload, move_pan_payload, move_wheel_payload};
use crate::types::{Motion, MoveTiming, PendingMotion};
use super::Device;
impl Device {
pub fn move_rel(&self, dx: i16, dy: i16) -> Result<()> {
self.move_axis(
Motion::Cursor { dx, dy },
MoveTiming::Ride,
PendingMotion::Keep,
)
}
pub fn wheel(&self, delta: i16) -> Result<()> {
self.move_axis(Motion::Wheel(delta), MoveTiming::Ride, PendingMotion::Keep)
}
pub fn move_rel_now(&self, dx: i16, dy: i16) -> Result<()> {
self.move_axis(
Motion::Cursor { dx, dy },
MoveTiming::Now,
PendingMotion::Keep,
)
}
pub fn wheel_now(&self, delta: i16) -> Result<()> {
self.move_axis(Motion::Wheel(delta), MoveTiming::Now, PendingMotion::Keep)
}
pub fn pan(&self, delta: i16) -> Result<()> {
self.move_axis(Motion::Pan(delta), MoveTiming::Ride, PendingMotion::Keep)
}
pub fn pan_now(&self, delta: i16) -> Result<()> {
self.move_axis(Motion::Pan(delta), MoveTiming::Now, PendingMotion::Keep)
}
pub fn flush_motion(&self) -> Result<()> {
self.move_axis(
Motion::Cursor { dx: 0, dy: 0 },
MoveTiming::Ride,
PendingMotion::Flush,
)
}
pub fn discard_motion(&self) -> Result<()> {
self.move_axis(
Motion::Cursor { dx: 0, dy: 0 },
MoveTiming::Ride,
PendingMotion::Discard,
)
}
pub fn move_axis(
&self,
motion: Motion,
timing: MoveTiming,
pending: PendingMotion,
) -> Result<()> {
let flags = timing.as_u8() | pending.as_u8();
match motion {
Motion::Cursor { dx, dy } => self
.link
.send(FrameType::Move, &move_cursor_payload(dx, dy, flags)),
Motion::Wheel(dz) => self
.link
.send(FrameType::Move, &move_wheel_payload(dz, flags)),
Motion::Pan(dpan) => self
.link
.send(FrameType::Move, &move_pan_payload(dpan, flags)),
}
}
}