/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use euclid::RigidTransform3D; use crate::{ ApiSpace, BaseSpace, Frame, InputFrame, InputId, InputSource, SelectEvent, SelectKind, WebXrSender, }; #[derive(Clone, Debug)] #[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))] #[allow(clippy::large_enum_variant)] pub enum Event { /// Input source connected AddInput(InputSource), /// Input source disconnected RemoveInput(InputId), /// Input updated (this is a disconnect+reconnect) UpdateInput(InputId, InputSource), /// Session ended by device SessionEnd, /// Session focused/blurred/etc VisibilityChange(Visibility), /// Selection started / ended Select(InputId, SelectKind, SelectEvent, Frame), /// Input from an input source has changed InputChanged(InputId, InputFrame), /// Reference space has changed ReferenceSpaceChanged(BaseSpace, RigidTransform3D), } #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))] pub enum Visibility { /// Session fully displayed to user Visible, /// Session still visible, but is not the primary focus VisibleBlurred, /// Session not visible Hidden, } /// Convenience structure for buffering up events /// when no event callback has been set pub enum EventBuffer { Buffered(Vec), Sink(WebXrSender), } impl Default for EventBuffer { fn default() -> Self { EventBuffer::Buffered(vec![]) } } impl EventBuffer { pub fn callback(&mut self, event: Event) { match *self { EventBuffer::Buffered(ref mut events) => events.push(event), EventBuffer::Sink(ref dest) => { let _ = dest.send(event); }, } } pub fn upgrade(&mut self, dest: WebXrSender) { if let EventBuffer::Buffered(ref mut events) = *self { for event in events.drain(..) { let _ = dest.send(event); } } *self = EventBuffer::Sink(dest) } }