use crate::error::Result;
use crate::protocol::FrameType;
use crate::protocol::command::lock_payload;
use crate::types::{Blanket, Key, LockClass, LockDirection, LockTarget, MediaKey};
use super::Device;
impl Device {
fn send_lock(&self, class: LockClass, usage: u16, direction: u8, on: bool) -> Result<()> {
self.link
.desired()
.lock()
.apply_lock((class.as_u8(), usage, direction), on);
self.link.send(
FrameType::Lock,
&lock_payload(class.as_u8(), usage, direction, on as u8),
)
}
pub fn lock(&self, target: LockTarget, direction: LockDirection) -> Result<()> {
self.send_lock(
LockClass::Mouse,
target.as_u8() as u16,
direction.as_u8(),
true,
)
}
pub fn unlock(&self, target: LockTarget, direction: LockDirection) -> Result<()> {
self.send_lock(
LockClass::Mouse,
target.as_u8() as u16,
direction.as_u8(),
false,
)
}
pub fn lock_key(&self, key: Key, direction: LockDirection) -> Result<()> {
self.send_lock(LockClass::Key, key.usage() as u16, direction.as_u8(), true)
}
pub fn unlock_key(&self, key: Key, direction: LockDirection) -> Result<()> {
self.send_lock(LockClass::Key, key.usage() as u16, direction.as_u8(), false)
}
pub fn lock_media(&self, key: MediaKey) -> Result<()> {
self.send_lock(LockClass::Media, key.usage(), 0, true)
}
pub fn unlock_media(&self, key: MediaKey) -> Result<()> {
self.send_lock(LockClass::Media, key.usage(), 0, false)
}
pub fn lock_all(&self, what: Blanket) -> Result<()> {
self.send_lock(what.class(), 0, 0, true)
}
pub fn unlock_all(&self, what: Blanket) -> Result<()> {
self.send_lock(what.class(), 0, 0, false)
}
}