use crate::error::Result;
use crate::protocol::FrameType;
use crate::protocol::command::inject_payload;
use crate::types::{Action, Motion, Usage};
use super::Device;
impl Device {
pub fn inject(&self, usage: impl Into<Usage>, action: Action) -> Result<()> {
let u = usage.into();
self.link.desired().lock().apply(u, action);
let (class, id) = u.class_id();
self.link.send(
FrameType::Inject,
&inject_payload(class, id, action.as_u8()),
)
}
pub fn press(&self, usage: impl Into<Usage>) -> Result<()> {
self.inject(usage, Action::Press)
}
pub fn release(&self, usage: impl Into<Usage>) -> Result<()> {
self.inject(usage, Action::SoftRelease)
}
pub fn force_release(&self, usage: impl Into<Usage>) -> Result<()> {
self.inject(usage, Action::ForceRelease)
}
pub fn move_axis(&self, motion: Motion) -> Result<()> {
match motion {
Motion::Cursor { dx, dy } => self.move_rel(dx, dy),
Motion::Wheel(dz) => self.wheel(dz),
}
}
pub fn reset(&self) -> Result<()> {
self.link.desired().lock().clear();
self.link.catch_disconnect_all();
self.link.send(FrameType::Reset, &[])
}
}