1#![forbid(unsafe_code)]
7
8pub mod mesh_input;
9
10use mesh::MeshPayload;
11use std::pin::Pin;
12use vm_resource::CanResolveTo;
13use vm_resource::ResourceId;
14use vm_resource::kind::KeyboardInputHandleKind;
15use vm_resource::kind::MouseInputHandleKind;
16
17#[derive(Debug, Copy, Clone, MeshPayload)]
19pub enum InputData {
20 Keyboard(KeyboardData),
22 Mouse(MouseData),
24}
25
26#[derive(Debug, Copy, Clone, MeshPayload)]
28pub struct MouseData {
29 pub button_mask: u8,
31 pub x: u16,
33 pub y: u16,
35}
36
37#[derive(Debug, Copy, Clone, MeshPayload)]
39pub struct KeyboardData {
40 pub code: u16,
42 pub make: bool,
44}
45
46pub trait InputSource<T>: futures::Stream<Item = T> + Unpin + Send {
48 fn set_active(&mut self, active: bool) -> Pin<Box<dyn '_ + Future<Output = ()> + Send>>;
51}
52
53pub struct ResolvedInputSource<T>(pub Box<dyn InputSource<T>>);
55
56impl<T: 'static + InputSource<KeyboardData>> From<T> for ResolvedInputSource<KeyboardData> {
57 fn from(value: T) -> Self {
58 Self(Box::new(value))
59 }
60}
61
62impl<T: 'static + InputSource<MouseData>> From<T> for ResolvedInputSource<MouseData> {
63 fn from(value: T) -> Self {
64 Self(Box::new(value))
65 }
66}
67
68impl CanResolveTo<ResolvedInputSource<KeyboardData>> for KeyboardInputHandleKind {
69 type Input<'a> = &'a str;
70}
71
72impl CanResolveTo<ResolvedInputSource<MouseData>> for MouseInputHandleKind {
73 type Input<'a> = &'a str;
74}
75
76#[derive(MeshPayload)]
79pub struct MultiplexedInputHandle {
80 pub elevation: usize,
85}
86
87impl ResourceId<KeyboardInputHandleKind> for MultiplexedInputHandle {
88 const ID: &'static str = "keyboard";
89}
90
91impl ResourceId<MouseInputHandleKind> for MultiplexedInputHandle {
92 const ID: &'static str = "mouse";
93}