aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2019-10-03 11:29:18 -0700
committerManish Goregaokar <manishsmail@gmail.com>2019-10-03 14:13:51 -0700
commit2e577f7eec01ad0d5056fcaf89a1b80f0f81867e (patch)
treee8733f138da36c9478f52cbfcc1aa746f5aa3dd3 /components/script/dom
parent50b1ddf065b77721389e23e31b1c4caa450858cc (diff)
downloadservo-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.rs49
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
}
}