aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/gamepadbuttonlist.rs
diff options
context:
space:
mode:
authorDaniel Adams <70986246+msub2@users.noreply.github.com>2024-02-17 08:42:31 -1000
committerGitHub <noreply@github.com>2024-02-17 18:42:31 +0000
commitc999d4546c7dbfee670da38553dd95929c05b82b (patch)
treeef81c5b69dc4068ea63c5570c383d541e9dd7d11 /components/script/dom/gamepadbuttonlist.rs
parent1cc546c4fc509142a0a3e796036bee604be243ab (diff)
downloadservo-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.rs39
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())
+ }
+}