diff options
author | Daniel Adams <70986246+msub2@users.noreply.github.com> | 2024-02-17 08:42:31 -1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-17 18:42:31 +0000 |
commit | c999d4546c7dbfee670da38553dd95929c05b82b (patch) | |
tree | ef81c5b69dc4068ea63c5570c383d541e9dd7d11 /components/script/dom/gamepadbuttonlist.rs | |
parent | 1cc546c4fc509142a0a3e796036bee604be243ab (diff) | |
download | servo-c999d4546c7dbfee670da38553dd95929c05b82b.tar.gz servo-c999d4546c7dbfee670da38553dd95929c05b82b.zip |
Implement non-XR Gamepad discovery and input (#31200)
* Create embedder event to send to constellation
* Handle gamepad message in constellation, send to script thread
* Handle GamepadEvent in script thread and dispatch event to document
* Add missing Clones, fix event
* Add gamepad task source
* Adjust GamepadIndex type, remove unused imports
* Add internal getter for gamepads list
* Update gamepad new methods
* Handle gamepad connect and disconnect events
* Proto will be none, no need for HandleObject
* Initialize buttons and axes to standard mapping
* Adjust update type index types
* Update GamepadButton update function
* Adjust Gamepad mapping comments to match spec, add update logic
* Amend comment
* Update button and axis inputs on Updated event
* Add GilRs as gamepad backend in servoshell
* Add spec links, queue gamepad updates on task source
* ./mach fmt
* Fix comment length
* Split out button init, update spec comments
* Move gamepad event handling from document to global
* Map and normalize axes/button values
* Use std::time for gamepad timestamp
* Adjust gamepad handling in event loop
* Move button press/touch check into map+normalize function
- Small change but is more in line with spec
* ./mach fmt
* Update comment spec links and warning messages
* Doc comments -> regular comments
* Add window event handlers for gamepad connect/disconnect
* Adjust gamepad disconnect behavior
* Add missing TODO's, adjust gamepad/gamepadbutton list methods and formatting
* Update button handling from gilrs, add comments
* Enable gamepad pref during WPT tests and update expectations
* Update WPT expectations in meta-legacy-layout
Diffstat (limited to 'components/script/dom/gamepadbuttonlist.rs')
-rw-r--r-- | components/script/dom/gamepadbuttonlist.rs | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/components/script/dom/gamepadbuttonlist.rs b/components/script/dom/gamepadbuttonlist.rs index e28e33e05a8..961f265e37f 100644 --- a/components/script/dom/gamepadbuttonlist.rs +++ b/components/script/dom/gamepadbuttonlist.rs @@ -5,9 +5,10 @@ use dom_struct::dom_struct; use crate::dom::bindings::codegen::Bindings::GamepadButtonListBinding::GamepadButtonListMethods; -use crate::dom::bindings::reflector::Reflector; -use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::root::{Dom, DomRoot, DomSlice}; use crate::dom::gamepadbutton::GamepadButton; +use crate::dom::globalscope::GlobalScope; // https://w3c.github.io/gamepad/#gamepadbutton-interface #[dom_struct] @@ -16,8 +17,6 @@ pub struct GamepadButtonList { list: Vec<Dom<GamepadButton>>, } -// TODO: support gamepad discovery -#[allow(dead_code)] impl GamepadButtonList { #[allow(crown::unrooted_must_root)] fn new_inherited(list: &[&GamepadButton]) -> GamepadButtonList { @@ -26,6 +25,10 @@ impl GamepadButtonList { list: list.iter().map(|button| Dom::from_ref(*button)).collect(), } } + + pub fn new(global: &GlobalScope, list: &[&GamepadButton]) -> DomRoot<GamepadButtonList> { + reflect_dom_object(Box::new(GamepadButtonList::new_inherited(list)), global) + } } impl GamepadButtonListMethods for GamepadButtonList { @@ -46,3 +49,31 @@ impl GamepadButtonListMethods for GamepadButtonList { self.Item(index) } } + +impl GamepadButtonList { + /// Initialize the number of buttons in the "standard" gamepad mapping. + /// <https://www.w3.org/TR/gamepad/#dfn-initializing-buttons> + pub fn init_buttons(global: &GlobalScope) -> DomRoot<GamepadButtonList> { + let standard_buttons = &[ + GamepadButton::new(global, false, false), // Bottom button in right cluster + GamepadButton::new(global, false, false), // Right button in right cluster + GamepadButton::new(global, false, false), // Left button in right cluster + GamepadButton::new(global, false, false), // Top button in right cluster + GamepadButton::new(global, false, false), // Top left front button + GamepadButton::new(global, false, false), // Top right front button + GamepadButton::new(global, false, false), // Bottom left front button + GamepadButton::new(global, false, false), // Bottom right front button + GamepadButton::new(global, false, false), // Left button in center cluster + GamepadButton::new(global, false, false), // Right button in center cluster + GamepadButton::new(global, false, false), // Left stick pressed button + GamepadButton::new(global, false, false), // Right stick pressed button + GamepadButton::new(global, false, false), // Top button in left cluster + GamepadButton::new(global, false, false), // Bottom button in left cluster + GamepadButton::new(global, false, false), // Left button in left cluster + GamepadButton::new(global, false, false), // Right button in left cluster + GamepadButton::new(global, false, false), // Center button in center cluster + ]; + rooted_vec!(let buttons <- standard_buttons.iter().map(|button| DomRoot::from_ref(&**button))); + Self::new(global, buttons.r()) + } +} |