Index: content/browser/gamepad/raw_input_data_fetcher_win.cc |
diff --git a/content/browser/gamepad/raw_input_data_fetcher_win.cc b/content/browser/gamepad/raw_input_data_fetcher_win.cc |
index e9238f3d38b31d682e3b572138fde8b26963d6c3..0693eef9eb87b51ccefc95850f8d2d676ac6338e 100644 |
--- a/content/browser/gamepad/raw_input_data_fetcher_win.cc |
+++ b/content/browser/gamepad/raw_input_data_fetcher_win.cc |
@@ -8,6 +8,7 @@ |
#include "base/macros.h" |
#include "base/trace_event/trace_event.h" |
+#include "content/common/gamepad_hardware_buffer.h" |
#include "content/common/gamepad_messages.h" |
namespace content { |
@@ -43,11 +44,10 @@ |
} |
RawInputDataFetcher::RawInputDataFetcher() |
- : rawinput_available_(false), |
+ : hid_dll_(base::FilePath(FILE_PATH_LITERAL("hid.dll"))), |
+ rawinput_available_(GetHidDllFunctions()), |
filter_xinput_(true), |
- events_monitored_(false), |
- last_source_id_(0), |
- last_enumeration_id_(0) { |
+ events_monitored_(false) { |
} |
RawInputDataFetcher::~RawInputDataFetcher() { |
@@ -58,12 +58,6 @@ |
void RawInputDataFetcher::WillDestroyCurrentMessageLoop() { |
StopMonitor(); |
-} |
- |
-void RawInputDataFetcher::OnAddedToProvider() { |
- hid_dll_.Reset(base::LoadNativeLibrary( |
- base::FilePath(FILE_PATH_LITERAL("hid.dll")), nullptr)); |
- rawinput_available_ = GetHidDllFunctions(); |
} |
RAWINPUTDEVICE* RawInputDataFetcher::GetRawInputDevices(DWORD flags) { |
@@ -78,13 +72,6 @@ |
return devices.release(); |
} |
-void RawInputDataFetcher::PauseHint(bool pause) { |
- if (pause) |
- StopMonitor(); |
- else |
- StartMonitor(); |
-} |
- |
void RawInputDataFetcher::StartMonitor() { |
if (!rawinput_available_ || events_monitored_) |
return; |
@@ -144,44 +131,16 @@ |
} |
} |
-void RawInputDataFetcher::GetGamepadData(bool devices_changed_hint) { |
- if (!rawinput_available_) |
- return; |
- |
- if (devices_changed_hint) |
- EnumerateDevices(); |
- |
- for (const auto& controller : controllers_) { |
- RawGamepadInfo* gamepad = controller.second; |
- PadState* state = provider()->GetPadState(GAMEPAD_SOURCE_WIN_RAW, |
- gamepad->source_id); |
- if (!state) |
- continue; |
- |
- WebGamepad& pad = state->data; |
- |
- pad.timestamp = gamepad->report_id; |
- pad.buttonsLength = gamepad->buttons_length; |
- pad.axesLength = gamepad->axes_length; |
- |
- for (unsigned int i = 0; i < pad.buttonsLength; i++) { |
- pad.buttons[i].pressed = gamepad->buttons[i]; |
- pad.buttons[i].value = gamepad->buttons[i] ? 1.0 : 0.0; |
- } |
- |
- for (unsigned int i = 0; i < pad.axesLength; i++) |
- pad.axes[i] = gamepad->axes[i].value; |
- } |
-} |
- |
-void RawInputDataFetcher::EnumerateDevices() { |
- last_enumeration_id_++; |
+std::vector<RawGamepadInfo*> RawInputDataFetcher::EnumerateDevices() { |
+ std::vector<RawGamepadInfo*> valid_controllers; |
+ |
+ ClearControllers(); |
UINT count = 0; |
UINT result = GetRawInputDeviceList(NULL, &count, sizeof(RAWINPUTDEVICELIST)); |
if (result == static_cast<UINT>(-1)) { |
PLOG(ERROR) << "GetRawInputDeviceList() failed"; |
- return; |
+ return valid_controllers; |
} |
DCHECK_EQ(0u, result); |
@@ -190,68 +149,37 @@ |
sizeof(RAWINPUTDEVICELIST)); |
if (result == static_cast<UINT>(-1)) { |
PLOG(ERROR) << "GetRawInputDeviceList() failed"; |
- return; |
+ return valid_controllers; |
} |
DCHECK_EQ(count, result); |
for (UINT i = 0; i < count; ++i) { |
if (device_list[i].dwType == RIM_TYPEHID) { |
HANDLE device_handle = device_list[i].hDevice; |
- ControllerMap::iterator controller = controllers_.find(device_handle); |
- |
- RawGamepadInfo* gamepad; |
- if (controller != controllers_.end()) { |
- gamepad = controller->second; |
- } else { |
- gamepad = ParseGamepadInfo(device_handle); |
- if (!gamepad) |
- continue; |
- |
- PadState* state = provider()->GetPadState(GAMEPAD_SOURCE_WIN_RAW, |
- gamepad->source_id); |
- if (!state) |
- continue; // No slot available for this gamepad. |
- |
- controllers_[device_handle] = gamepad; |
- |
- WebGamepad& pad = state->data; |
- pad.connected = true; |
- |
- std::string vendor = base::StringPrintf("%04x", gamepad->vendor_id); |
- std::string product = base::StringPrintf("%04x", gamepad->product_id); |
- state->mapper = GetGamepadStandardMappingFunction(vendor, product); |
- state->axis_mask = 0; |
- state->button_mask = 0; |
- |
- swprintf(pad.id, WebGamepad::idLengthCap, |
- L"%ls (%lsVendor: %04x Product: %04x)", |
- gamepad->id, state->mapper ? L"STANDARD GAMEPAD " : L"", |
- gamepad->vendor_id, gamepad->product_id); |
- |
- if (state->mapper) |
- swprintf(pad.mapping, WebGamepad::mappingLengthCap, L"standard"); |
- else |
- pad.mapping[0] = 0; |
+ RawGamepadInfo* gamepad_info = ParseGamepadInfo(device_handle); |
+ if (gamepad_info) { |
+ controllers_[device_handle] = gamepad_info; |
+ valid_controllers.push_back(gamepad_info); |
} |
- |
- gamepad->enumeration_id = last_enumeration_id_; |
- } |
- } |
- |
- // Clear out old controllers that weren't part of this enumeration pass. |
- for (const auto& controller : controllers_) { |
- RawGamepadInfo* gamepad = controller.second; |
- if (gamepad->enumeration_id != last_enumeration_id_) { |
- controllers_.erase(gamepad->handle); |
- delete gamepad; |
- } |
- } |
- |
- return; |
+ } |
+ } |
+ return valid_controllers; |
+} |
+ |
+RawGamepadInfo* RawInputDataFetcher::GetGamepadInfo(HANDLE handle) { |
+ std::map<HANDLE, RawGamepadInfo*>::iterator it = controllers_.find(handle); |
+ if (it != controllers_.end()) |
+ return it->second; |
+ |
+ return NULL; |
} |
RawGamepadInfo* RawInputDataFetcher::ParseGamepadInfo(HANDLE hDevice) { |
UINT size = 0; |
+ |
+ // Do we already have this device in the map? |
+ if (GetGamepadInfo(hDevice)) |
+ return NULL; |
// Query basic device info. |
UINT result = GetRawInputDeviceInfo(hDevice, RIDI_DEVICEINFO, |
@@ -286,8 +214,6 @@ |
return NULL; |
scoped_ptr<RawGamepadInfo> gamepad_info(new RawGamepadInfo); |
- gamepad_info->source_id = ++last_source_id_; |
- gamepad_info->enumeration_id = last_enumeration_id_; |
gamepad_info->handle = hDevice; |
gamepad_info->report_id = 0; |
gamepad_info->vendor_id = device_info->hid.dwVendorId; |
@@ -426,10 +352,6 @@ |
break; |
} |
} |
- |
- // Sometimes devices show up with no buttons or axes. Don't return these. |
- if (gamepad_info->buttons_length == 0 && gamepad_info->axes_length == 0) |
- return nullptr; |
return gamepad_info.release(); |
} |
@@ -535,9 +457,9 @@ |
// Notify the observer about events generated locally. |
if (input->header.dwType == RIM_TYPEHID && input->header.hDevice != NULL) { |
- ControllerMap::iterator it = controllers_.find(input->header.hDevice); |
- if (it != controllers_.end()) |
- UpdateGamepad(input, it->second); |
+ RawGamepadInfo* gamepad = GetGamepadInfo(input->header.hDevice); |
+ if (gamepad) |
+ UpdateGamepad(input, gamepad); |
} |
return DefRawInputProc(&input, 1, sizeof(RAWINPUTHEADER)); |