Distinguish different SYN types

This commit is contained in:
Jeff Hiner 2021-03-01 11:48:36 -07:00
parent cb2f5ef87a
commit 3c7f3321d5
2 changed files with 32 additions and 19 deletions

View file

@ -43,6 +43,33 @@ impl EventType {
pub(crate) const COUNT: usize = 0x20; pub(crate) const COUNT: usize = 0x20;
} }
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct Synchronization(pub u16);
impl Synchronization {
/// Terminates a packet of events from the device.
pub const SYN_REPORT: u16 = 0;
/// Appears to be unused.
pub const SYN_CONFIG: u16 = 1;
/// "Used to synchronize and separate touch events"
pub const SYN_MT_REPORT: u16 = 2;
/// Ring buffer filled, events were dropped.
pub const SYN_DROPPED: u16 = 3;
}
impl std::fmt::Debug for Synchronization {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self.0 {
Synchronization::SYN_REPORT => f.pad(stringify!(SYN_REPORT)),
Synchronization::SYN_CONFIG => f.pad(stringify!(SYN_CONFIG)),
Synchronization::SYN_MT_REPORT => f.pad(stringify!(SYN_MT_REPORT)),
Synchronization::SYN_DROPPED => f.pad(stringify!(SYN_DROPPED)),
_ => write!(f, "{}", self.0),
}
}
}
/// Device properties. /// Device properties.
#[derive(Copy, Clone, PartialEq, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]
pub struct PropType(pub u16); pub struct PropType(pub u16);

View file

@ -81,7 +81,6 @@ use std::{ffi::CString, mem::MaybeUninit};
pub use crate::attribute_set::AttributeSet; pub use crate::attribute_set::AttributeSet;
pub use crate::constants::*; pub use crate::constants::*;
pub use crate::scancodes::*; pub use crate::scancodes::*;
pub use crate::Synchronization::*;
fn ioctl_get_cstring( fn ioctl_get_cstring(
f: unsafe fn(RawFd, &mut [u8]) -> nix::Result<libc::c_int>, f: unsafe fn(RawFd, &mut [u8]) -> nix::Result<libc::c_int>,
@ -108,19 +107,6 @@ fn ioctl_get_cstring(
} }
} }
#[repr(u16)]
#[derive(Copy, Clone, Debug)]
pub enum Synchronization {
/// Terminates a packet of events from the device.
SYN_REPORT = 0,
/// Appears to be unused.
SYN_CONFIG = 1,
/// "Used to synchronize and separate touch events"
SYN_MT_REPORT = 2,
/// Ring buffer filled, events were dropped.
SYN_DROPPED = 3,
}
const fn bit_elts<T>(bits: usize) -> usize { const fn bit_elts<T>(bits: usize) -> usize {
let width = mem::size_of::<T>() * 8; let width = mem::size_of::<T>() * 8;
bits / width + (bits % width != 0) as usize bits / width + (bits % width != 0) as usize
@ -737,7 +723,7 @@ impl Device {
fn compensate_dropped(&mut self) -> io::Result<()> { fn compensate_dropped(&mut self) -> io::Result<()> {
let mut drop_from = None; let mut drop_from = None;
for (idx, event) in self.pending_events.iter().enumerate() { for (idx, event) in self.pending_events.iter().enumerate() {
if event.type_ == SYN_DROPPED as u16 { if event.type_ == Synchronization::SYN_DROPPED {
drop_from = Some(idx); drop_from = Some(idx);
break; break;
} }
@ -748,7 +734,7 @@ impl Device {
// look for the nearest SYN_REPORT before the SYN_DROPPED, remove everything after it. // look for the nearest SYN_REPORT before the SYN_DROPPED, remove everything after it.
let mut prev_report = 0; // (if there's no previous SYN_REPORT, then the entire vector is bogus) let mut prev_report = 0; // (if there's no previous SYN_REPORT, then the entire vector is bogus)
for (idx, event) in self.pending_events.iter().take(idx).enumerate().rev() { for (idx, event) in self.pending_events.iter().take(idx).enumerate().rev() {
if event.type_ == SYN_REPORT as u16 { if event.type_ == Synchronization::SYN_REPORT {
prev_report = idx; prev_report = idx;
break; break;
} }
@ -830,7 +816,7 @@ impl Device {
self.pending_events.push_back(libc::input_event { self.pending_events.push_back(libc::input_event {
time, time,
type_: EventType::SYNCHRONIZATION.0 as _, type_: EventType::SYNCHRONIZATION.0 as _,
code: SYN_REPORT as u16, code: Synchronization::SYN_REPORT,
value: 0, value: 0,
}); });
Ok(()) Ok(())
@ -902,7 +888,7 @@ impl Device {
#[derive(Debug, Copy, Clone, PartialEq, Eq)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum InputEventKind { pub enum InputEventKind {
Synchronization, Synchronization(Synchronization),
Key(Key), Key(Key),
RelAxis(RelativeAxisType), RelAxis(RelativeAxisType),
AbsAxis(AbsoluteAxisType), AbsAxis(AbsoluteAxisType),
@ -938,7 +924,7 @@ impl InputEvent {
pub fn kind(&self) -> InputEventKind { pub fn kind(&self) -> InputEventKind {
let code = self.code(); let code = self.code();
match self.event_type() { match self.event_type() {
EventType::SYNCHRONIZATION => InputEventKind::Synchronization, EventType::SYNCHRONIZATION => InputEventKind::Synchronization(Synchronization(code)),
EventType::KEY => InputEventKind::Key(Key::new(code)), EventType::KEY => InputEventKind::Key(Key::new(code)),
EventType::RELATIVE => InputEventKind::RelAxis(RelativeAxisType(code)), EventType::RELATIVE => InputEventKind::RelAxis(RelativeAxisType(code)),
EventType::ABSOLUTE => InputEventKind::AbsAxis(AbsoluteAxisType(code)), EventType::ABSOLUTE => InputEventKind::AbsAxis(AbsoluteAxisType(code)),