1use euclid::RigidTransform3D;
6
7use crate::{
8 ApiSpace, BaseSpace, Frame, InputFrame, InputId, InputSource, SelectEvent, SelectKind,
9 WebXrSender,
10};
11
12#[derive(Clone, Debug)]
13#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
14#[allow(clippy::large_enum_variant)]
15pub enum Event {
16 AddInput(InputSource),
18 RemoveInput(InputId),
20 UpdateInput(InputId, InputSource),
22 SessionEnd,
24 VisibilityChange(Visibility),
26 Select(InputId, SelectKind, SelectEvent, Frame),
28 InputChanged(InputId, InputFrame),
30 ReferenceSpaceChanged(BaseSpace, RigidTransform3D<f32, ApiSpace, ApiSpace>),
32}
33
34#[derive(Clone, Copy, Debug)]
35#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
36pub enum Visibility {
37 Visible,
39 VisibleBlurred,
41 Hidden,
43}
44
45pub enum EventBuffer {
48 Buffered(Vec<Event>),
49 Sink(WebXrSender<Event>),
50}
51
52impl Default for EventBuffer {
53 fn default() -> Self {
54 EventBuffer::Buffered(vec![])
55 }
56}
57
58impl EventBuffer {
59 pub fn callback(&mut self, event: Event) {
60 match *self {
61 EventBuffer::Buffered(ref mut events) => events.push(event),
62 EventBuffer::Sink(ref dest) => {
63 let _ = dest.send(event);
64 },
65 }
66 }
67
68 pub fn upgrade(&mut self, dest: WebXrSender<Event>) {
69 if let EventBuffer::Buffered(ref mut events) = *self {
70 for event in events.drain(..) {
71 let _ = dest.send(event);
72 }
73 }
74 *self = EventBuffer::Sink(dest)
75 }
76}