| Index: components/exo/gamepad.cc
|
| diff --git a/components/exo/gamepad.cc b/components/exo/gamepad.cc
|
| index b997045dd5a4c665c6c3a9e15cb8e3c7959977d3..c7a5f562d275bb5dda7a217afe72ca411209aefe 100644
|
| --- a/components/exo/gamepad.cc
|
| +++ b/components/exo/gamepad.cc
|
| @@ -16,7 +16,8 @@
|
| #include "components/exo/shell_surface.h"
|
| #include "components/exo/surface.h"
|
| #include "device/gamepad/gamepad_data_fetcher.h"
|
| -#include "device/gamepad/gamepad_platform_data_fetcher.h"
|
| +#include "device/gamepad/gamepad_pad_state_provider.h"
|
| +#include "device/gamepad/gamepad_platform_data_fetcher_linux.h"
|
| #include "ui/aura/client/focus_client.h"
|
| #include "ui/aura/window.h"
|
|
|
| @@ -30,7 +31,7 @@ bool GamepadButtonValuesAreEqual(double a, double b) {
|
|
|
| std::unique_ptr<device::GamepadDataFetcher> CreateGamepadPlatformDataFetcher() {
|
| return std::unique_ptr<device::GamepadDataFetcher>(
|
| - new device::GamepadPlatformDataFetcher());
|
| + new device::GamepadPlatformDataFetcherLinux());
|
| }
|
|
|
| // Time between gamepad polls in milliseconds.
|
| @@ -45,7 +46,8 @@ constexpr unsigned kPollingTimeIntervalMs = 16;
|
| // This class is reference counted to allow it to shut down safely on the
|
| // polling thread even if the Gamepad has been destroyed on the origin thread.
|
| class Gamepad::ThreadSafeGamepadChangeFetcher
|
| - : public base::RefCountedThreadSafe<
|
| + : public device::GamepadPadStateProvider,
|
| + public base::RefCountedThreadSafe<
|
| Gamepad::ThreadSafeGamepadChangeFetcher> {
|
| public:
|
| using ProcessGamepadChangesCallback =
|
| @@ -74,7 +76,7 @@ class Gamepad::ThreadSafeGamepadChangeFetcher
|
| private:
|
| friend class base::RefCountedThreadSafe<ThreadSafeGamepadChangeFetcher>;
|
|
|
| - virtual ~ThreadSafeGamepadChangeFetcher() {}
|
| + ~ThreadSafeGamepadChangeFetcher() override {}
|
|
|
| // Enables or disables polling.
|
| void EnablePollingOnPollingThread(bool enabled) {
|
| @@ -84,6 +86,7 @@ class Gamepad::ThreadSafeGamepadChangeFetcher
|
| if (is_enabled_) {
|
| if (!fetcher_) {
|
| fetcher_ = create_fetcher_callback_.Run();
|
| + InitializeDataFetcher(fetcher_.get());
|
| DCHECK(fetcher_);
|
| }
|
| SchedulePollOnPollingThread();
|
| @@ -119,7 +122,31 @@ class Gamepad::ThreadSafeGamepadChangeFetcher
|
| DCHECK(fetcher_);
|
|
|
| blink::WebGamepads new_state = state_;
|
| - fetcher_->GetGamepadData(&new_state, false);
|
| + fetcher_->GetGamepadData(
|
| + false /* No hardware changed notification from the system */);
|
| +
|
| + new_state.length = 0;
|
| + device::PadState& pad_state = pad_states_.get()[0];
|
| +
|
| + // After querying the gamepad clear the state if it did not have it's active
|
| + // state updated but is still listed as being associated with a specific
|
| + // source. This indicates the gamepad is disconnected.
|
| + if (!pad_state.active_state &&
|
| + pad_state.source != device::GAMEPAD_SOURCE_NONE) {
|
| + ClearPadState(pad_state);
|
| + }
|
| +
|
| + MapAndSanitizeGamepadData(&pad_state, &new_state.items[0],
|
| + false /* Don't sanitize gamepad data */);
|
| +
|
| + // If the gamepad was active then increment the length of the WebGamepads
|
| + // struct to indicate it's valid, then set the pad state to inactive. If the
|
| + // gamepad is still actively reporting the next call to GetGamepadData will
|
| + // set the active state to active again.
|
| + if (pad_state.active_state) {
|
| + new_state.length++;
|
| + pad_state.active_state = device::GAMEPAD_INACTIVE;
|
| + }
|
|
|
| if (std::max(new_state.length, state_.length) > 0) {
|
| if (new_state.items[0].connected != state_.items[0].connected ||
|
|
|