mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Fire selection events from XR input sources
This commit is contained in:
parent
50b1ddf065
commit
2e577f7eec
2 changed files with 50 additions and 1 deletions
|
@ -102,6 +102,8 @@ search
|
||||||
seeked
|
seeked
|
||||||
seeking
|
seeking
|
||||||
select
|
select
|
||||||
|
selectend
|
||||||
|
selectstart
|
||||||
serif
|
serif
|
||||||
signalingstatechange
|
signalingstatechange
|
||||||
srclang
|
srclang
|
||||||
|
|
|
@ -33,6 +33,7 @@ use crate::dom::promise::Promise;
|
||||||
use crate::dom::webglframebuffer::WebGLFramebufferAttachmentRoot;
|
use crate::dom::webglframebuffer::WebGLFramebufferAttachmentRoot;
|
||||||
use crate::dom::xrframe::XRFrame;
|
use crate::dom::xrframe::XRFrame;
|
||||||
use crate::dom::xrinputsource::XRInputSource;
|
use crate::dom::xrinputsource::XRInputSource;
|
||||||
|
use crate::dom::xrinputsourceevent::XRInputSourceEvent;
|
||||||
use crate::dom::xrreferencespace::XRReferenceSpace;
|
use crate::dom::xrreferencespace::XRReferenceSpace;
|
||||||
use crate::dom::xrrenderstate::XRRenderState;
|
use crate::dom::xrrenderstate::XRRenderState;
|
||||||
use crate::dom::xrsessionevent::XRSessionEvent;
|
use crate::dom::xrsessionevent::XRSessionEvent;
|
||||||
|
@ -48,7 +49,7 @@ use profile_traits::ipc;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::rc::Rc;
|
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]
|
#[dom_struct]
|
||||||
pub struct XRSession {
|
pub struct XRSession {
|
||||||
|
@ -170,6 +171,52 @@ impl XRSession {
|
||||||
let event = XRSessionEvent::new(&self.global(), atom!("end"), false, false, self);
|
let event = XRSessionEvent::new(&self.global(), atom!("end"), false, false, self);
|
||||||
event.upcast::<Event>().fire(self.upcast());
|
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
|
_ => (), // XXXManishearth TBD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue