diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2019-10-03 11:29:18 -0700 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2019-10-03 14:13:51 -0700 |
commit | 2e577f7eec01ad0d5056fcaf89a1b80f0f81867e (patch) | |
tree | e8733f138da36c9478f52cbfcc1aa746f5aa3dd3 /components/script/dom | |
parent | 50b1ddf065b77721389e23e31b1c4caa450858cc (diff) | |
download | servo-2e577f7eec01ad0d5056fcaf89a1b80f0f81867e.tar.gz servo-2e577f7eec01ad0d5056fcaf89a1b80f0f81867e.zip |
Fire selection events from XR input sources
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/xrsession.rs | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index dacfc373540..42e001a26e8 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -33,6 +33,7 @@ use crate::dom::promise::Promise; use crate::dom::webglframebuffer::WebGLFramebufferAttachmentRoot; use crate::dom::xrframe::XRFrame; use crate::dom::xrinputsource::XRInputSource; +use crate::dom::xrinputsourceevent::XRInputSourceEvent; use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrrenderstate::XRRenderState; use crate::dom::xrsessionevent::XRSessionEvent; @@ -48,7 +49,7 @@ use profile_traits::ipc; use std::cell::Cell; use std::mem; use std::rc::Rc; -use webxr_api::{self, Event as XREvent, Frame, Session}; +use webxr_api::{self, Event as XREvent, Frame, SelectEvent, Session}; #[dom_struct] pub struct XRSession { @@ -170,6 +171,52 @@ impl XRSession { let event = XRSessionEvent::new(&self.global(), atom!("end"), false, false, self); event.upcast::<Event>().fire(self.upcast()); }, + XREvent::Select(input, kind, frame) => { + // https://immersive-web.github.io/webxr/#primary-action + let source = self + .input_sources + .borrow_mut() + .iter() + .find(|s| s.id() == input) + .map(|x| DomRoot::from_ref(&**x)); + if let Some(source) = source { + let frame = XRFrame::new(&self.global(), self, frame); + frame.set_active(true); + if kind == SelectEvent::Start { + let event = XRInputSourceEvent::new( + &self.global(), + atom!("selectstart"), + false, + false, + &frame, + &source, + ); + event.upcast::<Event>().fire(self.upcast()); + } else { + if kind == SelectEvent::Select { + let event = XRInputSourceEvent::new( + &self.global(), + atom!("select"), + false, + false, + &frame, + &source, + ); + event.upcast::<Event>().fire(self.upcast()); + } + let event = XRInputSourceEvent::new( + &self.global(), + atom!("selectend"), + false, + false, + &frame, + &source, + ); + event.upcast::<Event>().fire(self.upcast()); + } + frame.set_active(false); + } + }, _ => (), // XXXManishearth TBD } } |