use consortium_ipc::IpcSafe;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, PartialEq, Eq, IpcSafe, Deserialize, Serialize)]
#[non_exhaustive]
pub enum InputEvent {
Button {
code: ButtonCode,
pressed: bool,
},
Pointer {
x: i16,
y: i16,
},
PointerButton {
button: PointerButton,
pressed: bool,
},
Touch {
id: u8,
phase: TouchPhase,
x: i16,
y: i16,
},
Scroll {
axis: ScrollAxis,
delta: i16,
},
Key {
scancode: u16,
pressed: bool,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IpcSafe, Deserialize, Serialize)]
#[non_exhaustive]
pub enum ButtonCode {
DpadUp,
DpadDown,
DpadLeft,
DpadRight,
South,
East,
West,
North,
L1,
R1,
Start,
Select,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IpcSafe, Deserialize, Serialize)]
#[non_exhaustive]
pub enum PointerButton {
Left,
Right,
Middle,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IpcSafe, Deserialize, Serialize)]
#[non_exhaustive]
pub enum TouchPhase {
Down,
Move,
Up,
Cancel,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IpcSafe, Deserialize, Serialize)]
#[non_exhaustive]
pub enum ScrollAxis {
Vertical,
Horizontal,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn events_round_trip_through_a_codec() {
let events = [
InputEvent::Button {
code: ButtonCode::South,
pressed: true,
},
InputEvent::Pointer { x: -12, y: 300 },
InputEvent::PointerButton {
button: PointerButton::Right,
pressed: false,
},
InputEvent::Touch {
id: 2,
phase: TouchPhase::Move,
x: 120,
y: 64,
},
InputEvent::Scroll {
axis: ScrollAxis::Vertical,
delta: -3,
},
InputEvent::Key {
scancode: 0x2C,
pressed: true,
},
];
let mut buf = [0u8; 32];
for event in events {
let encoded = postcard::to_slice(&event, &mut buf).expect("encode");
let decoded: InputEvent = postcard::from_bytes(encoded).expect("decode");
assert_eq!(event, decoded);
}
}
}