| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/gamepad/gamepad_platform_data_fetcher_win.h" | 5 #include "content/browser/gamepad/gamepad_platform_data_fetcher_win.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "base/win/windows_version.h" | 9 #include "base/win/windows_version.h" |
| 10 #include "content/common/gamepad_hardware_buffer.h" | 10 #include "content/common/gamepad_hardware_buffer.h" |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 state.raw_input_handle = gamepad->handle; | 135 state.raw_input_handle = gamepad->handle; |
| 136 | 136 |
| 137 std::string vendor = base::StringPrintf("%04x", gamepad->vendor_id); | 137 std::string vendor = base::StringPrintf("%04x", gamepad->vendor_id); |
| 138 std::string product = base::StringPrintf("%04x", gamepad->product_id); | 138 std::string product = base::StringPrintf("%04x", gamepad->product_id); |
| 139 state.mapper = GetGamepadStandardMappingFunction(vendor, product); | 139 state.mapper = GetGamepadStandardMappingFunction(vendor, product); |
| 140 | 140 |
| 141 swprintf(pad.id, WebGamepad::idLengthCap, | 141 swprintf(pad.id, WebGamepad::idLengthCap, |
| 142 L"%ls (%lsVendor: %04x Product: %04x)", | 142 L"%ls (%lsVendor: %04x Product: %04x)", |
| 143 gamepad->id, state.mapper ? L"STANDARD GAMEPAD " : L"", | 143 gamepad->id, state.mapper ? L"STANDARD GAMEPAD " : L"", |
| 144 gamepad->vendor_id, gamepad->product_id); | 144 gamepad->vendor_id, gamepad->product_id); |
| 145 |
| 146 if (state.mapper) |
| 147 swprintf(pad.mapping, WebGamepad::mappingLengthCap, L"standard"); |
| 148 else |
| 149 pad.mapping[0] = 0; |
| 150 |
| 145 pads->length++; | 151 pads->length++; |
| 146 } | 152 } |
| 147 } | 153 } |
| 148 } | 154 } |
| 149 | 155 |
| 150 | 156 |
| 151 void GamepadPlatformDataFetcherWin::GetGamepadData(WebGamepads* pads, | 157 void GamepadPlatformDataFetcherWin::GetGamepadData(WebGamepads* pads, |
| 152 bool devices_changed_hint) { | 158 bool devices_changed_hint) { |
| 153 TRACE_EVENT0("GAMEPAD", "GetGamepadData"); | 159 TRACE_EVENT0("GAMEPAD", "GetGamepadData"); |
| 154 | 160 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 DWORD res = xinput_get_capabilities_(i, XINPUT_FLAG_GAMEPAD, &caps); | 204 DWORD res = xinput_get_capabilities_(i, XINPUT_FLAG_GAMEPAD, &caps); |
| 199 if (res == ERROR_DEVICE_NOT_CONNECTED) { | 205 if (res == ERROR_DEVICE_NOT_CONNECTED) { |
| 200 pad->connected = false; | 206 pad->connected = false; |
| 201 return false; | 207 return false; |
| 202 } else { | 208 } else { |
| 203 pad->connected = true; | 209 pad->connected = true; |
| 204 swprintf(pad->id, | 210 swprintf(pad->id, |
| 205 WebGamepad::idLengthCap, | 211 WebGamepad::idLengthCap, |
| 206 L"Xbox 360 Controller (XInput STANDARD %ls)", | 212 L"Xbox 360 Controller (XInput STANDARD %ls)", |
| 207 GamepadSubTypeName(caps.SubType)); | 213 GamepadSubTypeName(caps.SubType)); |
| 214 swprintf(pad->mapping, WebGamepad::mappingLengthCap, L"standard"); |
| 208 return true; | 215 return true; |
| 209 } | 216 } |
| 210 } | 217 } |
| 211 | 218 |
| 212 void GamepadPlatformDataFetcherWin::GetXInputPadData( | 219 void GamepadPlatformDataFetcherWin::GetXInputPadData( |
| 213 int i, | 220 int i, |
| 214 WebGamepad* pad) { | 221 WebGamepad* pad) { |
| 215 XINPUT_STATE state; | 222 XINPUT_STATE state; |
| 216 memset(&state, 0, sizeof(XINPUT_STATE)); | 223 memset(&state, 0, sizeof(XINPUT_STATE)); |
| 217 TRACE_EVENT_BEGIN1("GAMEPAD", "XInputGetState", "id", i); | 224 TRACE_EVENT_BEGIN1("GAMEPAD", "XInputGetState", "id", i); |
| 218 DWORD dwResult = xinput_get_state_(pad_state_[i].xinput_index, &state); | 225 DWORD dwResult = xinput_get_state_(pad_state_[i].xinput_index, &state); |
| 219 TRACE_EVENT_END1("GAMEPAD", "XInputGetState", "id", i); | 226 TRACE_EVENT_END1("GAMEPAD", "XInputGetState", "id", i); |
| 220 | 227 |
| 221 if (dwResult == ERROR_SUCCESS) { | 228 if (dwResult == ERROR_SUCCESS) { |
| 222 pad->timestamp = state.dwPacketNumber; | 229 pad->timestamp = state.dwPacketNumber; |
| 223 pad->buttonsLength = 0; | 230 pad->buttonsLength = 0; |
| 224 #define ADD(b) pad->buttons[pad->buttonsLength++] = \ | 231 #define ADD(b) pad->buttons[pad->buttonsLength].pressed = \ |
| 225 ((state.Gamepad.wButtons & (b)) ? 1.0 : 0.0); | 232 (state.Gamepad.wButtons & (b)) != 0; \ |
| 233 pad->buttons[pad->buttonsLength++].value = \ |
| 234 ((state.Gamepad.wButtons & (b)) ? 1.f : 0.f); |
| 226 ADD(XINPUT_GAMEPAD_A); | 235 ADD(XINPUT_GAMEPAD_A); |
| 227 ADD(XINPUT_GAMEPAD_B); | 236 ADD(XINPUT_GAMEPAD_B); |
| 228 ADD(XINPUT_GAMEPAD_X); | 237 ADD(XINPUT_GAMEPAD_X); |
| 229 ADD(XINPUT_GAMEPAD_Y); | 238 ADD(XINPUT_GAMEPAD_Y); |
| 230 ADD(XINPUT_GAMEPAD_LEFT_SHOULDER); | 239 ADD(XINPUT_GAMEPAD_LEFT_SHOULDER); |
| 231 ADD(XINPUT_GAMEPAD_RIGHT_SHOULDER); | 240 ADD(XINPUT_GAMEPAD_RIGHT_SHOULDER); |
| 232 pad->buttons[pad->buttonsLength++] = state.Gamepad.bLeftTrigger / 255.0; | 241 pad->buttons[pad->buttonsLength].pressed = |
| 233 pad->buttons[pad->buttonsLength++] = state.Gamepad.bRightTrigger / 255.0; | 242 state.Gamepad.bLeftTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD; |
| 243 pad->buttons[pad->buttonsLength++].value = |
| 244 state.Gamepad.bLeftTrigger / 255.f; |
| 245 pad->buttons[pad->buttonsLength].pressed = |
| 246 state.Gamepad.bRightTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD; |
| 247 pad->buttons[pad->buttonsLength++].value = |
| 248 state.Gamepad.bRightTrigger / 255.f; |
| 234 ADD(XINPUT_GAMEPAD_BACK); | 249 ADD(XINPUT_GAMEPAD_BACK); |
| 235 ADD(XINPUT_GAMEPAD_START); | 250 ADD(XINPUT_GAMEPAD_START); |
| 236 ADD(XINPUT_GAMEPAD_LEFT_THUMB); | 251 ADD(XINPUT_GAMEPAD_LEFT_THUMB); |
| 237 ADD(XINPUT_GAMEPAD_RIGHT_THUMB); | 252 ADD(XINPUT_GAMEPAD_RIGHT_THUMB); |
| 238 ADD(XINPUT_GAMEPAD_DPAD_UP); | 253 ADD(XINPUT_GAMEPAD_DPAD_UP); |
| 239 ADD(XINPUT_GAMEPAD_DPAD_DOWN); | 254 ADD(XINPUT_GAMEPAD_DPAD_DOWN); |
| 240 ADD(XINPUT_GAMEPAD_DPAD_LEFT); | 255 ADD(XINPUT_GAMEPAD_DPAD_LEFT); |
| 241 ADD(XINPUT_GAMEPAD_DPAD_RIGHT); | 256 ADD(XINPUT_GAMEPAD_DPAD_RIGHT); |
| 242 #undef ADD | 257 #undef ADD |
| 243 pad->axesLength = 0; | 258 pad->axesLength = 0; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 260 pad->connected = false; | 275 pad->connected = false; |
| 261 return; | 276 return; |
| 262 } | 277 } |
| 263 | 278 |
| 264 WebGamepad raw_pad = *pad; | 279 WebGamepad raw_pad = *pad; |
| 265 | 280 |
| 266 raw_pad.timestamp = gamepad->report_id; | 281 raw_pad.timestamp = gamepad->report_id; |
| 267 raw_pad.buttonsLength = gamepad->buttons_length; | 282 raw_pad.buttonsLength = gamepad->buttons_length; |
| 268 raw_pad.axesLength = gamepad->axes_length; | 283 raw_pad.axesLength = gamepad->axes_length; |
| 269 | 284 |
| 270 for (unsigned int i = 0; i < raw_pad.buttonsLength; i++) | 285 for (unsigned int i = 0; i < raw_pad.buttonsLength; i++) { |
| 271 raw_pad.buttons[i] = gamepad->buttons[i] ? 1.0 : 0.0; | 286 raw_pad.buttons[i].pressed = gamepad->buttons[i]; |
| 287 raw_pad.buttons[i].value = gamepad->buttons[i] ? 1.0 : 0.0; |
| 288 } |
| 272 | 289 |
| 273 for (unsigned int i = 0; i < raw_pad.axesLength; i++) | 290 for (unsigned int i = 0; i < raw_pad.axesLength; i++) |
| 274 raw_pad.axes[i] = gamepad->axes[i].value; | 291 raw_pad.axes[i] = gamepad->axes[i].value; |
| 275 | 292 |
| 276 // Copy to the current state to the output buffer, using the mapping | 293 // Copy to the current state to the output buffer, using the mapping |
| 277 // function, if there is one available. | 294 // function, if there is one available. |
| 278 if (pad_state_[index].mapper) | 295 if (pad_state_[index].mapper) |
| 279 pad_state_[index].mapper(raw_pad, pad); | 296 pad_state_[index].mapper(raw_pad, pad); |
| 280 else | 297 else |
| 281 *pad = raw_pad; | 298 *pad = raw_pad; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 294 return false; | 311 return false; |
| 295 xinput_get_state_ = reinterpret_cast<XInputGetStateFunc>( | 312 xinput_get_state_ = reinterpret_cast<XInputGetStateFunc>( |
| 296 xinput_dll_.GetFunctionPointer("XInputGetState")); | 313 xinput_dll_.GetFunctionPointer("XInputGetState")); |
| 297 if (!xinput_get_state_) | 314 if (!xinput_get_state_) |
| 298 return false; | 315 return false; |
| 299 xinput_enable_(true); | 316 xinput_enable_(true); |
| 300 return true; | 317 return true; |
| 301 } | 318 } |
| 302 | 319 |
| 303 } // namespace content | 320 } // namespace content |
| OLD | NEW |