Index: device/gamepad/gamepad_provider.h |
diff --git a/device/gamepad/gamepad_provider.h b/device/gamepad/gamepad_provider.h |
index 5d2e2b2eb9b744f646705cb2945d58ba4a98433b..3adf81439e5c039cd2ae0cd1176503d17a46f1bc 100644 |
--- a/device/gamepad/gamepad_provider.h |
+++ b/device/gamepad/gamepad_provider.h |
@@ -5,6 +5,8 @@ |
#ifndef DEVICE_GAMEPAD_GAMEPAD_PROVIDER_H_ |
#define DEVICE_GAMEPAD_GAMEPAD_PROVIDER_H_ |
+#include <stdint.h> |
+ |
#include <memory> |
#include <utility> |
#include <vector> |
@@ -13,11 +15,11 @@ |
#include "base/macros.h" |
#include "base/memory/ref_counted.h" |
#include "base/memory/shared_memory.h" |
-#include "base/memory/weak_ptr.h" |
#include "base/synchronization/lock.h" |
#include "base/system_monitor/system_monitor.h" |
#include "device/gamepad/gamepad_export.h" |
#include "device/gamepad/gamepad_shared_buffer.h" |
+#include "device/gamepad/gamepad_standard_mappings.h" |
#include "third_party/WebKit/public/platform/WebGamepads.h" |
namespace base { |
@@ -29,6 +31,57 @@ namespace device { |
class GamepadDataFetcher; |
+enum GamepadSource { |
+ GAMEPAD_SOURCE_NONE = 0, |
+ GAMEPAD_SOURCE_ANDROID, |
+ GAMEPAD_SOURCE_LINUX_UDEV, |
+ GAMEPAD_SOURCE_MAC_HID, |
+ GAMEPAD_SOURCE_MAC_XBOX, |
+ GAMEPAD_SOURCE_TEST, |
+ GAMEPAD_SOURCE_WIN_XINPUT, |
+ GAMEPAD_SOURCE_WIN_RAW, |
+}; |
+ |
+enum GamepadActiveState { |
+ GAMEPAD_INACTIVE = 0, |
+ GAMEPAD_ACTIVE, |
+ GAMEPAD_NEWLY_ACTIVE, |
+}; |
+ |
+struct PadState { |
+ // Which data fetcher provided this gamepad's data. |
+ GamepadSource source; |
+ // Data fetcher-specific identifier for this gamepad. |
+ int source_id; |
+ |
+ // Indicates whether or not the gamepad is actively being updated |
+ GamepadActiveState active_state; |
+ |
+ // Gamepad data, unmapped. |
+ blink::WebGamepad data; |
+ |
+ // Functions to map from device data to standard layout, if available. May |
+ // be null if no mapping is available or needed. |
+ GamepadStandardMappingFunction mapper; |
+ |
+ // Sanitization masks |
+ // axis_mask and button_mask are bitfields that represent the reset state of |
+ // each input. If a button or axis has ever reported 0 in the past the |
+ // corresponding bit will be set to 1. |
+ |
+ // If we ever increase the max axis count this will need to be updated. |
+ static_assert(blink::WebGamepad::axesLengthCap <= |
+ std::numeric_limits<uint32_t>::digits, |
+ "axis_mask is not large enough"); |
+ uint32_t axis_mask; |
+ |
+ // If we ever increase the max button count this will need to be updated. |
+ static_assert(blink::WebGamepad::buttonsLengthCap <= |
+ std::numeric_limits<uint32_t>::digits, |
+ "button_mask is not large enough"); |
+ uint32_t button_mask; |
+}; |
+ |
class DEVICE_GAMEPAD_EXPORT GamepadConnectionChangeClient { |
public: |
virtual void OnGamepadConnectionChange(bool connected, |
@@ -56,6 +109,9 @@ class DEVICE_GAMEPAD_EXPORT GamepadProvider |
base::SharedMemoryHandle GetSharedMemoryHandleForProcess( |
base::ProcessHandle renderer_process); |
+ void AddGamepadDataFetcher(GamepadDataFetcher* fetcher); |
+ void RemoveGamepadDataFetcher(GamepadDataFetcher* fetcher); |
+ |
void GetCurrentGamepadData(blink::WebGamepads* data); |
// Pause and resume the background polling thread. Can be called from any |
@@ -70,12 +126,26 @@ class DEVICE_GAMEPAD_EXPORT GamepadProvider |
// base::SystemMonitor::DevicesChangedObserver implementation. |
void OnDevicesChanged(base::SystemMonitor::DeviceType type) override; |
+ // Add a gamepad data fetcher. Takes ownership of |fetcher|. |
+ void AddGamepadDataFetcher(std::unique_ptr<GamepadDataFetcher> fetcher); |
+ |
+ // Remove gamepad data fetchers with the given source. |
+ void RemoveSourceGamepadDataFetcher(GamepadSource source); |
+ |
+ // Gets a PadState object for the given source and id. If the device hasn't |
+ // been encountered before one of the remaining slots will be reserved for it. |
+ // If no slots are available will return NULL. |
+ PadState* GetPadState(GamepadSource source, int source_id); |
+ |
+ void SetSanitizationEnabled(bool sanitize) { sanitize_ = sanitize; } |
+ |
private: |
void Initialize(std::unique_ptr<GamepadDataFetcher> fetcher); |
// Method for setting up the platform-specific data fetcher. Takes ownership |
// of |fetcher|. |
- void DoInitializePollingThread(std::unique_ptr<GamepadDataFetcher> fetcher); |
+ void DoAddGamepadDataFetcher(std::unique_ptr<GamepadDataFetcher> fetcher); |
+ void DoRemoveSourceGamepadDataFetcher(GamepadSource source); |
// Method for sending pause hints to the low-level data fetcher. Runs on |
// polling_thread_. |
@@ -91,6 +161,9 @@ class DEVICE_GAMEPAD_EXPORT GamepadProvider |
// Checks the gamepad state to see if the user has interacted with it. |
void CheckForUserGesture(); |
+ void ClearPadState(PadState& state); |
+ |
+ void MapAndSanitizeGamepadData(PadState* pad_state, blink::WebGamepad* pad); |
enum { kDesiredSamplingIntervalMs = 16 }; |
@@ -131,31 +204,14 @@ class DEVICE_GAMEPAD_EXPORT GamepadProvider |
bool devices_changed_; |
bool ever_had_user_gesture_; |
+ bool sanitize_; |
- class PadState { |
- public: |
- PadState() { SetDisconnected(); } |
- |
- bool Match(const blink::WebGamepad& pad) const; |
- void SetPad(const blink::WebGamepad& pad); |
- void SetDisconnected(); |
- void AsWebGamepad(blink::WebGamepad* pad); |
- |
- bool connected() const { return connected_; } |
- |
- private: |
- bool connected_; |
- unsigned axes_length_; |
- unsigned buttons_length_; |
- blink::WebUChar id_[blink::WebGamepad::idLengthCap]; |
- blink::WebUChar mapping_[blink::WebGamepad::mappingLengthCap]; |
- }; |
- |
- // Used to detect connections and disconnections. |
+ // Tracks the state of each gamepad slot. |
std::unique_ptr<PadState[]> pad_states_; |
// Only used on the polling thread. |
- std::unique_ptr<GamepadDataFetcher> data_fetcher_; |
+ typedef std::vector<std::unique_ptr<GamepadDataFetcher>> GamepadFetcherVector; |
+ GamepadFetcherVector data_fetchers_; |
base::Lock shared_memory_lock_; |
std::unique_ptr<GamepadSharedBuffer> gamepad_shared_buffer_; |
@@ -165,8 +221,6 @@ class DEVICE_GAMEPAD_EXPORT GamepadProvider |
GamepadConnectionChangeClient* connection_change_client_; |
- static GamepadProvider* instance_; |
- |
DISALLOW_COPY_AND_ASSIGN(GamepadProvider); |
}; |