diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2020-01-08 17:54:26 +0530 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2020-01-09 08:16:25 +0530 |
commit | f721113f8d2b6bae00b9be280d80c6a7d16861b6 (patch) | |
tree | 24a068413b582f9695ec1cb5d377449a3a2bff14 /components/script/dom/xrinputsourcearray.rs | |
parent | a90a42012bfcd4393ac447938efadfd5b4583be0 (diff) | |
download | servo-f721113f8d2b6bae00b9be280d80c6a7d16861b6.tar.gz servo-f721113f8d2b6bae00b9be280d80c6a7d16861b6.zip |
Handle AddInput/RemoveInput events
Diffstat (limited to 'components/script/dom/xrinputsourcearray.rs')
-rw-r--r-- | components/script/dom/xrinputsourcearray.rs | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/components/script/dom/xrinputsourcearray.rs b/components/script/dom/xrinputsourcearray.rs index 48f84991db0..45e0f2851e4 100644 --- a/components/script/dom/xrinputsourcearray.rs +++ b/components/script/dom/xrinputsourcearray.rs @@ -5,13 +5,16 @@ use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::XRInputSourceArrayBinding; use crate::dom::bindings::codegen::Bindings::XRInputSourceArrayBinding::XRInputSourceArrayMethods; +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::event::Event; use crate::dom::globalscope::GlobalScope; use crate::dom::xrinputsource::XRInputSource; +use crate::dom::xrinputsourceschangeevent::XRInputSourcesChangeEvent; use crate::dom::xrsession::XRSession; use dom_struct::dom_struct; -use webxr_api::InputId; +use webxr_api::{InputId, InputSource}; #[dom_struct] pub struct XRInputSourceArray { @@ -48,6 +51,56 @@ impl XRInputSourceArray { }); } + pub fn add_input_source(&self, session: &XRSession, info: InputSource) { + let mut input_sources = self.input_sources.borrow_mut(); + let global = self.global(); + let input = XRInputSource::new(&global, &session, info); + debug_assert!( + input_sources.iter().find(|i| i.id() == info.id).is_none(), + "Should never add a duplicate input id!" + ); + input_sources.push(Dom::from_ref(&input)); + + let added = [input]; + + let event = XRInputSourcesChangeEvent::new( + &global, + atom!("inputsourceschange"), + false, + true, + session, + &added, + &[], + ); + // Release the refcell guard + drop(input_sources); + event.upcast::<Event>().fire(session.upcast()); + } + + pub fn remove_input_source(&self, session: &XRSession, id: InputId) { + let mut input_sources = self.input_sources.borrow_mut(); + let global = self.global(); + let removed = if let Some(i) = input_sources.iter().find(|i| i.id() == id) { + [DomRoot::from_ref(&**i)] + } else { + return; + }; + + let event = XRInputSourcesChangeEvent::new( + &global, + atom!("inputsourceschange"), + false, + true, + session, + &[], + &removed, + ); + input_sources.retain(|i| i.id() != id); + // release the refcell guard + drop(input_sources); + event.upcast::<Event>().fire(session.upcast()); + } + pub fn find(&self, id: InputId) -> Option<DomRoot<XRInputSource>> { self.input_sources .borrow() |