webxr_api/
events.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use 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    /// Input source connected
17    AddInput(InputSource),
18    /// Input source disconnected
19    RemoveInput(InputId),
20    /// Input updated (this is a disconnect+reconnect)
21    UpdateInput(InputId, InputSource),
22    /// Session ended by device
23    SessionEnd,
24    /// Session focused/blurred/etc
25    VisibilityChange(Visibility),
26    /// Selection started / ended
27    Select(InputId, SelectKind, SelectEvent, Frame),
28    /// Input from an input source has changed
29    InputChanged(InputId, InputFrame),
30    /// Reference space has changed
31    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    /// Session fully displayed to user
38    Visible,
39    /// Session still visible, but is not the primary focus
40    VisibleBlurred,
41    /// Session not visible
42    Hidden,
43}
44
45/// Convenience structure for buffering up events
46/// when no event callback has been set
47pub 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}