diff --git a/Libraries/LibWeb/CMakeLists.txt b/Libraries/LibWeb/CMakeLists.txt index b2ee7b6cfd0..278070186d1 100644 --- a/Libraries/LibWeb/CMakeLists.txt +++ b/Libraries/LibWeb/CMakeLists.txt @@ -675,6 +675,7 @@ set(SOURCES Infra/JSON.cpp Infra/Strings.cpp Internals/InternalAnimationTimeline.cpp + Internals/InternalGamepad.cpp Internals/Internals.cpp Internals/InternalsBase.cpp Internals/WebUI.cpp diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index 29d8b2841a9..a5daa91a602 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -805,6 +805,7 @@ class RequestList; namespace Web::Internals { class Internals; +class InternalGamepad; class WebUI; } diff --git a/Libraries/LibWeb/Internals/InternalGamepad.cpp b/Libraries/LibWeb/Internals/InternalGamepad.cpp new file mode 100644 index 00000000000..9820c740452 --- /dev/null +++ b/Libraries/LibWeb/Internals/InternalGamepad.cpp @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2025, Luke Wilde + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::Internals { + +GC_DEFINE_ALLOCATOR(InternalGamepad); + +static constexpr Array BUTTONS = { + SDL_GAMEPAD_BUTTON_SOUTH, + SDL_GAMEPAD_BUTTON_EAST, + SDL_GAMEPAD_BUTTON_WEST, + SDL_GAMEPAD_BUTTON_NORTH, + SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, + SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, + SDL_GAMEPAD_BUTTON_BACK, + SDL_GAMEPAD_BUTTON_START, + SDL_GAMEPAD_BUTTON_LEFT_STICK, + SDL_GAMEPAD_BUTTON_RIGHT_STICK, + SDL_GAMEPAD_BUTTON_DPAD_UP, + SDL_GAMEPAD_BUTTON_DPAD_DOWN, + SDL_GAMEPAD_BUTTON_DPAD_LEFT, + SDL_GAMEPAD_BUTTON_DPAD_RIGHT, + SDL_GAMEPAD_BUTTON_GUIDE, +}; + +static constexpr Array AXES { + SDL_GAMEPAD_AXIS_LEFTX, + SDL_GAMEPAD_AXIS_LEFTY, + SDL_GAMEPAD_AXIS_RIGHTX, + SDL_GAMEPAD_AXIS_RIGHTY, +}; + +static constexpr Array TRIGGERS { + SDL_GAMEPAD_AXIS_LEFT_TRIGGER, + SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, +}; + +static constexpr char const* VIRTUAL_GAMEPAD_NAME = "Ladybird Virtual Gamepad"; + +static SDLCALL bool rumble(void* user_data, u16 low_frequency_rumble, u16 high_frequency_rumble) +{ + auto* internal_gamepad = static_cast(user_data); + internal_gamepad->received_rumble(low_frequency_rumble, high_frequency_rumble); + return true; +} + +static SDLCALL bool rumble_triggers(void* user_data, u16 left_rumble, u16 right_rumble) +{ + auto* internal_gamepad = static_cast(user_data); + internal_gamepad->received_rumble_triggers(left_rumble, right_rumble); + return true; +} + +InternalGamepad::InternalGamepad(JS::Realm& realm) + : Bindings::PlatformObject(realm) +{ + SDL_VirtualJoystickDesc virtual_joystick_desc {}; + SDL_INIT_INTERFACE(&virtual_joystick_desc); + + virtual_joystick_desc.type = SDL_JOYSTICK_TYPE_GAMEPAD; + virtual_joystick_desc.naxes = AXES.size() + TRIGGERS.size(); + virtual_joystick_desc.nbuttons = BUTTONS.size(); + + u32 button_mask = 0; + for (auto const button : BUTTONS) + button_mask |= 1 << button; + + virtual_joystick_desc.button_mask = button_mask; + + u32 axis_mask = 0; + for (auto const axis : AXES) + axis_mask |= 1 << axis; + + for (auto const trigger : TRIGGERS) + axis_mask |= 1 << trigger; + + virtual_joystick_desc.axis_mask = axis_mask; + + virtual_joystick_desc.name = VIRTUAL_GAMEPAD_NAME; + virtual_joystick_desc.userdata = this; + virtual_joystick_desc.Rumble = rumble; + virtual_joystick_desc.RumbleTriggers = rumble_triggers; + + m_sdl_joystick_id = SDL_AttachVirtualJoystick(&virtual_joystick_desc); + m_sdl_joystick = SDL_OpenJoystick(m_sdl_joystick_id); +} + +InternalGamepad::~InternalGamepad() = default; + +void InternalGamepad::initialize(JS::Realm& realm) +{ + WEB_SET_PROTOTYPE_FOR_INTERFACE(InternalGamepad); + Base::initialize(realm); +} + +void InternalGamepad::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_received_rumble_effects); + visitor.visit(m_received_rumble_trigger_effects); +} + +void InternalGamepad::finalize() +{ + disconnect(); +} + +Array const& InternalGamepad::buttons() +{ + return BUTTONS; +} + +Array const& InternalGamepad::axes() +{ + return AXES; +} + +Array const& InternalGamepad::triggers() +{ + return TRIGGERS; +} + +void InternalGamepad::set_button(int button, bool down) +{ + SDL_SetJoystickVirtualButton(m_sdl_joystick, button, down); +} + +void InternalGamepad::set_axis(int axis, short value) +{ + SDL_SetJoystickVirtualAxis(m_sdl_joystick, axis, value); +} + +GC::RootVector InternalGamepad::get_received_rumble_effects() const +{ + GC::RootVector received_rumble_effects { realm().heap() }; + for (auto const received_rumble_effect : m_received_rumble_effects) + received_rumble_effects.append(received_rumble_effect); + return received_rumble_effects; +} + +GC::RootVector InternalGamepad::get_received_rumble_trigger_effects() const +{ + GC::RootVector received_rumble_trigger_effects { realm().heap() }; + for (auto const received_rumble_trigger_effect : m_received_rumble_trigger_effects) + received_rumble_trigger_effects.append(received_rumble_trigger_effect); + return received_rumble_trigger_effects; +} + +void InternalGamepad::received_rumble(u16 low_frequency_rumble, u16 high_frequency_rumble) +{ + auto object = JS::Object::create(realm(), nullptr); + object->define_direct_property("lowFrequencyRumble"_utf16, JS::Value(low_frequency_rumble), JS::default_attributes); + object->define_direct_property("highFrequencyRumble"_utf16, JS::Value(high_frequency_rumble), JS::default_attributes); + m_received_rumble_effects.append(object); +} + +void InternalGamepad::received_rumble_triggers(u16 left_rumble, u16 right_rumble) +{ + auto object = JS::Object::create(realm(), nullptr); + object->define_direct_property("leftRumble"_utf16, JS::Value(left_rumble), JS::default_attributes); + object->define_direct_property("rightRumble"_utf16, JS::Value(right_rumble), JS::default_attributes); + m_received_rumble_trigger_effects.append(object); +} + +void InternalGamepad::disconnect() +{ + SDL_CloseJoystick(m_sdl_joystick); + SDL_DetachVirtualJoystick(m_sdl_joystick_id); +} + +} diff --git a/Libraries/LibWeb/Internals/InternalGamepad.h b/Libraries/LibWeb/Internals/InternalGamepad.h new file mode 100644 index 00000000000..a5f8fb9af8c --- /dev/null +++ b/Libraries/LibWeb/Internals/InternalGamepad.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2025, Luke Wilde + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::Internals { + +class InternalGamepad : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(InternalGamepad, Bindings::PlatformObject); + GC_DECLARE_ALLOCATOR(InternalGamepad); + +public: + static GC::Ref create(JS::Realm&); + + virtual ~InternalGamepad() override; + + Array const& buttons(); + Array const& axes(); + Array const& triggers(); + + void set_button(int button, bool down); + void set_axis(int axis, short value); + + GC::RootVector get_received_rumble_effects() const; + GC::RootVector get_received_rumble_trigger_effects() const; + + void received_rumble(u16 low_frequency_rumble, u16 high_frequency_rumble); + void received_rumble_triggers(u16 left_rumble, u16 right_rumble); + + void disconnect(); + +private: + InternalGamepad(JS::Realm&); + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; + virtual void finalize() override; + + SDL_JoystickID m_sdl_joystick_id; + SDL_Joystick* m_sdl_joystick; + Vector> m_received_rumble_effects; + Vector> m_received_rumble_trigger_effects; +}; + +} diff --git a/Libraries/LibWeb/Internals/InternalGamepad.idl b/Libraries/LibWeb/Internals/InternalGamepad.idl new file mode 100644 index 00000000000..5dd6e55fb46 --- /dev/null +++ b/Libraries/LibWeb/Internals/InternalGamepad.idl @@ -0,0 +1,14 @@ +[Exposed=Nobody] +interface InternalGamepad { + readonly attribute sequence buttons; + readonly attribute sequence axes; + readonly attribute sequence triggers; + + undefined setButton(long button, boolean down); + undefined setAxis(long axis, short value); + + sequence getReceivedRumbleEffects(); + sequence getReceivedRumbleTriggerEffects(); + + undefined disconnect(); +}; diff --git a/Libraries/LibWeb/Internals/Internals.cpp b/Libraries/LibWeb/Internals/Internals.cpp index 88be63572f4..aa659e38d8a 100644 --- a/Libraries/LibWeb/Internals/Internals.cpp +++ b/Libraries/LibWeb/Internals/Internals.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -330,4 +331,15 @@ GC::Ptr Internals::get_shadow_root(GC::Ref elemen return element->shadow_root(); } +void Internals::handle_sdl_input_events() +{ + page().handle_sdl_input_events(); +} + +GC::Ref Internals::connect_virtual_gamepad() +{ + auto& realm = this->realm(); + return realm.create(realm); +} + } diff --git a/Libraries/LibWeb/Internals/Internals.h b/Libraries/LibWeb/Internals/Internals.h index 194ed083a57..e5769a8a001 100644 --- a/Libraries/LibWeb/Internals/Internals.h +++ b/Libraries/LibWeb/Internals/Internals.h @@ -69,6 +69,10 @@ public: GC::Ptr get_shadow_root(GC::Ref); + void handle_sdl_input_events(); + + GC::Ref connect_virtual_gamepad(); + private: explicit Internals(JS::Realm&); diff --git a/Libraries/LibWeb/Internals/Internals.idl b/Libraries/LibWeb/Internals/Internals.idl index d81b4c11f65..8134dcfa60d 100644 --- a/Libraries/LibWeb/Internals/Internals.idl +++ b/Libraries/LibWeb/Internals/Internals.idl @@ -1,6 +1,7 @@ #import #import #import +#import [Exposed=Nobody] interface Internals { @@ -58,4 +59,8 @@ interface Internals { // Returns the shadow root of the element, if it has one, even if it's not normally accessible to JS. ShadowRoot? getShadowRoot(Element element); + undefined handleSDLInputEvents(); + + InternalGamepad connectVirtualGamepad(); + }; diff --git a/Libraries/LibWeb/idl_files.cmake b/Libraries/LibWeb/idl_files.cmake index 9ecbe7113ee..403bf29c21d 100644 --- a/Libraries/LibWeb/idl_files.cmake +++ b/Libraries/LibWeb/idl_files.cmake @@ -307,6 +307,7 @@ libweb_js_bindings(IndexedDB/IDBRequest) libweb_js_bindings(IndexedDB/IDBTransaction) libweb_js_bindings(IndexedDB/IDBVersionChangeEvent) libweb_js_bindings(Internals/InternalAnimationTimeline) +libweb_js_bindings(Internals/InternalGamepad) libweb_js_bindings(Internals/Internals) libweb_js_bindings(Internals/WebUI) libweb_js_bindings(IntersectionObserver/IntersectionObserver) diff --git a/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-button-pressing.txt b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-button-pressing.txt new file mode 100644 index 00000000000..933fa3f87d0 --- /dev/null +++ b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-button-pressing.txt @@ -0,0 +1,47 @@ +Before pressing button 0: [] +Received gamepadconnected event for 'Ladybird Virtual Gamepad' at index 0 +After pressing button 0: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 1: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 1: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 2: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 2: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 3: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 3: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 9: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 9: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 10: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 10: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 4: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 4: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 6: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 6: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 7: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 7: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 8: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 8: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 11: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 11: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 12: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 12: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 13: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 13: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 14: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 14: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before pressing button 5: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After pressing button 5: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":1}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After unpressed button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Received gamepaddisconnected event for 'Ladybird Virtual Gamepad' at index 0 diff --git a/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-button-press.txt b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-button-press.txt new file mode 100644 index 00000000000..7be923b1757 --- /dev/null +++ b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-button-press.txt @@ -0,0 +1,5 @@ +Initial: [] +Before user gesture of pressing a button: [] +Received gamepadconnected event for 'Ladybird Virtual Gamepad' at index 0 +After user gesture of pressing a button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Received gamepaddisconnected event for 'Ladybird Virtual Gamepad' at index 0 diff --git a/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-negative-axis-movement.txt b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-negative-axis-movement.txt new file mode 100644 index 00000000000..d25152ab456 --- /dev/null +++ b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-negative-axis-movement.txt @@ -0,0 +1,15 @@ +Initial: [] +Before user gesture of moving axis to -0.1 (-3262): [] +After user gesture of moving axis to -0.1 (-3262): [] +Before user gesture of moving axis to -0.2 (-6525): [] +After user gesture of moving axis to -0.2 (-6525): [] +Before user gesture of moving axis to -0.3 (-9788): [] +After user gesture of moving axis to -0.3 (-9788): [] +Before user gesture of moving axis to -0.4 (-13051): [] +After user gesture of moving axis to -0.4 (-13051): [] +Before user gesture of moving axis to -0.5 (-16314): [] +After user gesture of moving axis to -0.5 (-16314): [] +Before user gesture of moving axis to -0.503 (-16411): [] +Received gamepadconnected event for 'Ladybird Virtual Gamepad' at index 0 +After user gesture of moving axis to -0.503 (-16411): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[-0.5008163576714733,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Received gamepaddisconnected event for 'Ladybird Virtual Gamepad' at index 0 diff --git a/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-positive-axis-movement.txt b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-positive-axis-movement.txt new file mode 100644 index 00000000000..83acd97995b --- /dev/null +++ b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-positive-axis-movement.txt @@ -0,0 +1,15 @@ +Initial: [] +Before user gesture of moving axis to 0.1 (3262): [] +After user gesture of moving axis to 0.1 (3262): [] +Before user gesture of moving axis to 0.2 (6525): [] +After user gesture of moving axis to 0.2 (6525): [] +Before user gesture of moving axis to 0.3 (9788): [] +After user gesture of moving axis to 0.3 (9788): [] +Before user gesture of moving axis to 0.4 (13051): [] +After user gesture of moving axis to 0.4 (13051): [] +Before user gesture of moving axis to 0.5 (16314): [] +After user gesture of moving axis to 0.5 (16314): [] +Before user gesture of moving axis to 0.503 (16411): [] +Received gamepadconnected event for 'Ladybird Virtual Gamepad' at index 0 +After user gesture of moving axis to 0.503 (16411): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.5008468757152666,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Received gamepaddisconnected event for 'Ladybird Virtual Gamepad' at index 0 diff --git a/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-pressing-triggers.txt b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-pressing-triggers.txt new file mode 100644 index 00000000000..600f6070b58 --- /dev/null +++ b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-exposed-after-pressing-triggers.txt @@ -0,0 +1,16 @@ +Before moving trigger axis 4 to -1 (-32628): [] +After moving trigger axis 4 to -1 (-32628): [] +Before moving trigger axis 4 to -0.98 (-31976): [] +After moving trigger axis 4 to -0.98 (-31976): [] +Before moving trigger axis 4 to -0.96 (-31323): [] +After moving trigger axis 4 to -0.96 (-31323): [] +Before moving trigger axis 4 to -0.94 (-30671): [] +After moving trigger axis 4 to -0.94 (-30671): [] +Before moving trigger axis 4 to -0.92 (-30018): [] +After moving trigger axis 4 to -0.92 (-30018): [] +Before moving trigger axis 4 to -0.9 (-29366): [] +After moving trigger axis 4 to -0.9 (-29366): [] +Before moving trigger axis 4 to -0.8033 (-26211): [] +Received gamepadconnected event for 'Ladybird Virtual Gamepad' at index 0 +After moving trigger axis 4 to -0.8033 (-26211): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.1000396740623188},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Received gamepaddisconnected event for 'Ladybird Virtual Gamepad' at index 0 diff --git a/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-iframe.txt b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-iframe.txt new file mode 100644 index 00000000000..d065d936b35 --- /dev/null +++ b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-iframe.txt @@ -0,0 +1,9 @@ +Before pressing a button: [] +Received gamepadconnected event for 'Ladybird Virtual Gamepad' at index 0 +After pressing a button: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 0 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 0 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.7965972381170368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Received dual rumble effects: [{"lowFrequencyRumble":32767,"highFrequencyRumble":32767},{"lowFrequencyRumble":0,"highFrequencyRumble":0}] +Received trigger rumble effects: [{"leftRumble":32767,"rightRumble":32767},{"leftRumble":0,"rightRumble":0}] +Received gamepaddisconnected event for 'Ladybird Virtual Gamepad' at index 0 +After disconnecting gamepad: [] diff --git a/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-is-available-in-new-navigables.txt b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-is-available-in-new-navigables.txt new file mode 100644 index 00000000000..c01640ff944 --- /dev/null +++ b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-is-available-in-new-navigables.txt @@ -0,0 +1,5 @@ +Before pressing button in top level: [] +Received gamepadconnected event for 'Ladybird Virtual Gamepad' at index 0 +After pressing button in top level: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Gamepad should not be immediately exposed in the new navigable: [] +Gamepad is now exposed in the new navigable: [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.000015259021896696368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":true,"touched":true,"value":1},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] diff --git a/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-moving-axes.txt b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-moving-axes.txt new file mode 100644 index 00000000000..1028a733db5 --- /dev/null +++ b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-moving-axes.txt @@ -0,0 +1,74 @@ +Before moving axis 0 to 1 (32628): [] +Received gamepadconnected event for 'Ladybird Virtual Gamepad' at index 0 +After moving axis 0 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 0 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 0 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.7965972381170368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 0 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.7965972381170368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 0 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.3983062485694666,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 0 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.3983062485694666,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 0 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[-0.39827573052567333,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 0 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[-0.39827573052567333,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 0 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.7965972381170368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 0 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.7965972381170368,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 0 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 1 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.000015259021896696368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 1 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 1 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 1 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.7965972381170368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 1 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.7965972381170368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 1 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.3983062485694666,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 1 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.3983062485694666,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 1 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,-0.39827573052567333,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 1 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,-0.39827573052567333,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 1 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.7965972381170368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 1 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.7965972381170368,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 1 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 2 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.000015259021896696368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 2 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 2 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 2 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.7965972381170368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 2 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.7965972381170368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 2 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.3983062485694666,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 2 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.3983062485694666,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 2 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,-0.39827573052567333,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 2 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,-0.39827573052567333,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 2 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.7965972381170368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 2 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.7965972381170368,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 2 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 3 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.000015259021896696368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 3 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 3 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 3 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.7965972381170368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 3 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.7965972381170368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 3 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.3983062485694666],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 3 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.3983062485694666],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 3 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,-0.39827573052567333],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 3 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,-0.39827573052567333],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 3 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.7965972381170368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 3 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.7965972381170368],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 3 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 4 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 4 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 4 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 4 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.8982818079165014},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 4 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.8982818079165014},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 4 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.6991485335856197},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 4 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.6991485335856197},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 4 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.3008514664143803},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 4 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.3008514664143803},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 4 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.8982818079165014},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 4 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.8982818079165014},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 4 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 5 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 5 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 5 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 5 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.8982818079165014},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 5 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.8982818079165014},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 5 to 0.4 (13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.6991485335856197},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 5 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.6991485335856197},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 5 to -0.4 (-13051): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.3008514664143803},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 5 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.3008514664143803},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 5 to 0.8 (26102): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.8982818079165014},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Before moving axis 5 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.8982818079165014},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +After moving axis 5 to 1 (32628): [{"id":"Ladybird Virtual Gamepad","index":0,"connected":true,"mapping":"standard","axes":[0.9957579919127184,0.9957579919127184,0.9957579919127184,0.9957579919127184],"buttons":[{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":true,"touched":true,"value":0.9978637043366801},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0},{"pressed":false,"touched":false,"value":0}],"vibrationActuator":{"effects":["dual-rumble","trigger-rumble"]}}] +Received gamepaddisconnected event for 'Ladybird Virtual Gamepad' at index 0 diff --git a/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-rumble.txt b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-rumble.txt new file mode 100644 index 00000000000..572b614ac8f --- /dev/null +++ b/Tests/LibWeb/Text/expected/GamepadAPI/gamepad-rumble.txt @@ -0,0 +1,45 @@ +Checking if effect 'dual-rumble' with params '{"duration":5001}' throws +TypeError: Invalid effect +Checking if effect 'dual-rumble' with params '{"startDelay":5001}' throws +TypeError: Invalid effect +Checking if effect 'dual-rumble' with params '{"duration":2500,"startDelay":2501}' throws +TypeError: Invalid effect +Checking if effect 'dual-rumble' with params '{"duration":1,"weakMagnitude":-0.1}' throws +TypeError: Invalid effect +Checking if effect 'dual-rumble' with params '{"duration":1,"weakMagnitude":1.1}' throws +TypeError: Invalid effect +Checking if effect 'dual-rumble' with params '{"duration":1,"strongMagnitude":-0.1}' throws +TypeError: Invalid effect +Checking if effect 'dual-rumble' with params '{"duration":1,"strongMagnitude":1.1}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"duration":5001}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"startDelay":5001}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"duration":2500,"startDelay":2501}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"duration":1,"weakMagnitude":-0.1}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"duration":1,"weakMagnitude":1.1}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"duration":1,"strongMagnitude":-0.1}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"duration":1,"strongMagnitude":1.1}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"duration":1,"leftTrigger":-0.1}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"duration":1,"leftTrigger":1.1}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"duration":1,"rightTrigger":-0.1}' throws +TypeError: Invalid effect +Checking if effect 'trigger-rumble' with params '{"duration":1,"rightTrigger":1.1}' throws +TypeError: Invalid effect +Playing valid dual rumble effect +Dual rumble promise resolved with 'complete' +Playing valid trigger rumble effect +Trigger rumble promise resolved with 'complete' +Testing preempting a rumble effect +newDualRumbleResult: 'complete', preemptedResult: 'preempted' +Received dual rumble effects: [{"lowFrequencyRumble":32767,"highFrequencyRumble":32767},{"lowFrequencyRumble":0,"highFrequencyRumble":0},{"lowFrequencyRumble":6553,"highFrequencyRumble":6553},{"lowFrequencyRumble":65535,"highFrequencyRumble":65535},{"lowFrequencyRumble":0,"highFrequencyRumble":0}] +Received trigger rumble effects: [{"leftRumble":32767,"rightRumble":32767},{"leftRumble":0,"rightRumble":0}] +Received gamepaddisconnected event for 'Ladybird Virtual Gamepad' at index 0 diff --git a/Tests/LibWeb/Text/input/GamepadAPI/gamepad-button-pressing.html b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-button-pressing.html new file mode 100644 index 00000000000..e07bbea8c9f --- /dev/null +++ b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-button-pressing.html @@ -0,0 +1,25 @@ + + + + diff --git a/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-button-press.html b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-button-press.html new file mode 100644 index 00000000000..45c71849466 --- /dev/null +++ b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-button-press.html @@ -0,0 +1,22 @@ + + + + diff --git a/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-negative-axis-movement.html b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-negative-axis-movement.html new file mode 100644 index 00000000000..20d67058b71 --- /dev/null +++ b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-negative-axis-movement.html @@ -0,0 +1,27 @@ + + + + diff --git a/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-positive-axis-movement.html b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-positive-axis-movement.html new file mode 100644 index 00000000000..7e841f6f8ef --- /dev/null +++ b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-positive-axis-movement.html @@ -0,0 +1,27 @@ + + + + diff --git a/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-pressing-triggers.html b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-pressing-triggers.html new file mode 100644 index 00000000000..400d68bd7b6 --- /dev/null +++ b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-exposed-after-pressing-triggers.html @@ -0,0 +1,27 @@ + + + + diff --git a/Tests/LibWeb/Text/input/GamepadAPI/gamepad-helper.js b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-helper.js new file mode 100644 index 00000000000..8b0a45fccc8 --- /dev/null +++ b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-helper.js @@ -0,0 +1,44 @@ +(() => { + globalThis.handleSDLInputEvents = () => { + internals.handleSDLInputEvents(); + return new Promise(resolve => { + setTimeout(() => resolve(), 0); + }); + }; + + globalThis.getStringifiedGamepads = () => { + const gamepads = navigator.getGamepads().map(gamepad => ({ + id: gamepad.id, + index: gamepad.index, + connected: gamepad.connected, + mapping: gamepad.mapping, + axes: gamepad.axes, + buttons: gamepad.buttons.map(button => ({ + pressed: button.pressed, + touched: button.touched, + value: button.value, + })), + vibrationActuator: { + effects: gamepad.vibrationActuator.effects, + }, + })); + + return JSON.stringify(gamepads); + }; + + globalThis.listenForGamepadConnected = () => { + window.addEventListener("gamepadconnected", ({ gamepad }) => { + println( + `Received gamepadconnected event for '${gamepad.id}' at index ${gamepad.index}` + ); + }); + }; + + globalThis.listenForGamepadDisconnected = () => { + window.addEventListener("gamepaddisconnected", ({ gamepad }) => { + println( + `Received gamepaddisconnected event for '${gamepad.id}' at index ${gamepad.index}` + ); + }); + }; +})(); diff --git a/Tests/LibWeb/Text/input/GamepadAPI/gamepad-iframe.html b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-iframe.html new file mode 100644 index 00000000000..fdf3defdbe8 --- /dev/null +++ b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-iframe.html @@ -0,0 +1,68 @@ + + + + + diff --git a/Tests/LibWeb/Text/input/GamepadAPI/gamepad-is-available-in-new-navigables.html b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-is-available-in-new-navigables.html new file mode 100644 index 00000000000..1a2bceb9cfc --- /dev/null +++ b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-is-available-in-new-navigables.html @@ -0,0 +1,56 @@ + + + + diff --git a/Tests/LibWeb/Text/input/GamepadAPI/gamepad-moving-axes.html b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-moving-axes.html new file mode 100644 index 00000000000..8a981ec4e63 --- /dev/null +++ b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-moving-axes.html @@ -0,0 +1,28 @@ + + + + diff --git a/Tests/LibWeb/Text/input/GamepadAPI/gamepad-rumble.html b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-rumble.html new file mode 100644 index 00000000000..a20cc2fc120 --- /dev/null +++ b/Tests/LibWeb/Text/input/GamepadAPI/gamepad-rumble.html @@ -0,0 +1,75 @@ + + + +