Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(231)

Side by Side Diff: content/browser/gamepad/gamepad_platform_data_fetcher_mac.mm

Issue 165983005: Updating Gamepad API to match latest spec (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ifdef-gaurds Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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_mac.h" 5 #include "content/browser/gamepad/gamepad_platform_data_fetcher_mac.h"
6 6
7 #include "base/mac/foundation_util.h" 7 #include "base/mac/foundation_util.h"
8 #include "base/mac/scoped_nsobject.h" 8 #include "base/mac/scoped_nsobject.h"
9 #include "base/strings/string16.h" 9 #include "base/strings/string16.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
11 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 13
14 #import <Foundation/Foundation.h> 14 #import <Foundation/Foundation.h>
15 #include <IOKit/hid/IOHIDKeys.h> 15 #include <IOKit/hid/IOHIDKeys.h>
16 16
17 using blink::WebGamepad; 17 using blink::WebGamepad;
18 using blink::WebGamepads; 18 using blink::WebGamepads;
19 19
20 namespace content { 20 namespace content {
21 21
22 namespace { 22 namespace {
23 23
24 void copyNSStringAsUTF16LittleEndian(
25 NSString* src, blink::WebUChar* dest, size_t dest_len) {
26 NSData* as16 = [src dataUsingEncoding:NSUTF16LittleEndianStringEncoding];
27 memset(dest, 0, dest_len);
28 [as16 getBytes:dest length:dest_len - sizeof(blink::WebUChar)];
29 }
30
24 NSDictionary* DeviceMatching(uint32_t usage_page, uint32_t usage) { 31 NSDictionary* DeviceMatching(uint32_t usage_page, uint32_t usage) {
25 return [NSDictionary dictionaryWithObjectsAndKeys: 32 return [NSDictionary dictionaryWithObjectsAndKeys:
26 [NSNumber numberWithUnsignedInt:usage_page], 33 [NSNumber numberWithUnsignedInt:usage_page],
27 base::mac::CFToNSCast(CFSTR(kIOHIDDeviceUsagePageKey)), 34 base::mac::CFToNSCast(CFSTR(kIOHIDDeviceUsagePageKey)),
28 [NSNumber numberWithUnsignedInt:usage], 35 [NSNumber numberWithUnsignedInt:usage],
29 base::mac::CFToNSCast(CFSTR(kIOHIDDeviceUsageKey)), 36 base::mac::CFToNSCast(CFSTR(kIOHIDDeviceUsageKey)),
30 nil]; 37 nil];
31 } 38 }
32 39
33 float NormalizeAxis(CFIndex value, CFIndex min, CFIndex max) { 40 float NormalizeAxis(CFIndex value, CFIndex min, CFIndex max) {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey)))); 255 IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey))));
249 int vendor_int = [vendor_id intValue]; 256 int vendor_int = [vendor_id intValue];
250 int product_int = [product_id intValue]; 257 int product_int = [product_id intValue];
251 258
252 char vendor_as_str[5], product_as_str[5]; 259 char vendor_as_str[5], product_as_str[5];
253 snprintf(vendor_as_str, sizeof(vendor_as_str), "%04x", vendor_int); 260 snprintf(vendor_as_str, sizeof(vendor_as_str), "%04x", vendor_int);
254 snprintf(product_as_str, sizeof(product_as_str), "%04x", product_int); 261 snprintf(product_as_str, sizeof(product_as_str), "%04x", product_int);
255 associated_[slot].hid.mapper = 262 associated_[slot].hid.mapper =
256 GetGamepadStandardMappingFunction(vendor_as_str, product_as_str); 263 GetGamepadStandardMappingFunction(vendor_as_str, product_as_str);
257 264
265 #ifdef ENABLE_NEW_GAMEPAD_API
266 NSString* ident = [NSString stringWithFormat:
267 @"%@ (Vendor: %04x Product: %04x)",
268 product,
269 vendor_int,
270 product_int];
271 copyNSStringAsUTF16LittleEndian(
272 ident,
273 data_.items[slot].id,
274 sizeof(data_.items[slot].id));
275
276 if (associated_[slot].hid.mapper) {
277 copyNSStringAsUTF16LittleEndian(
278 @"standard",
279 data_.items[slot].mapping,
280 sizeof(data_.items[slot].mapping));
281 } else {
282 data_.items[slot].mapping[0] = 0;
283 }
284 #else
258 NSString* ident = [NSString stringWithFormat: 285 NSString* ident = [NSString stringWithFormat:
259 @"%@ (%sVendor: %04x Product: %04x)", 286 @"%@ (%sVendor: %04x Product: %04x)",
260 product, 287 product,
261 associated_[slot].hid.mapper ? "STANDARD GAMEPAD " : "", 288 associated_[slot].hid.mapper ? "STANDARD GAMEPAD " : "",
262 vendor_int, 289 vendor_int,
263 product_int]; 290 product_int];
264 NSData* as16 = [ident dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; 291 copyNSStringAsUTF16LittleEndian(
265 292 ident,
266 const size_t kOutputLengthBytes = sizeof(data_.items[slot].id); 293 data_.items[slot].id,
267 memset(&data_.items[slot].id, 0, kOutputLengthBytes); 294 sizeof(data_.items[slot].id));
268 [as16 getBytes:data_.items[slot].id 295 #endif
269 length:kOutputLengthBytes - sizeof(blink::WebUChar)];
270 296
271 base::ScopedCFTypeRef<CFArrayRef> elements( 297 base::ScopedCFTypeRef<CFArrayRef> elements(
272 IOHIDDeviceCopyMatchingElements(device, NULL, kIOHIDOptionsTypeNone)); 298 IOHIDDeviceCopyMatchingElements(device, NULL, kIOHIDOptionsTypeNone));
273 AddButtonsAndAxes(CFToNSCast(elements), slot); 299 AddButtonsAndAxes(CFToNSCast(elements), slot);
274 300
275 associated_[slot].hid.device_ref = device; 301 associated_[slot].hid.device_ref = device;
276 data_.items[slot].connected = true; 302 data_.items[slot].connected = true;
277 if (slot >= data_.length) 303 if (slot >= data_.length)
278 data_.length = slot + 1; 304 data_.length = slot + 1;
279 } 305 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 370
345 size_t slot = GetSlotForXboxDevice(device); 371 size_t slot = GetSlotForXboxDevice(device);
346 372
347 // We can't handle this many connected devices. 373 // We can't handle this many connected devices.
348 if (slot == WebGamepads::itemsLengthCap) 374 if (slot == WebGamepads::itemsLengthCap)
349 return; 375 return;
350 376
351 device->SetLEDPattern( 377 device->SetLEDPattern(
352 (XboxController::LEDPattern)(XboxController::LED_FLASH_TOP_LEFT + slot)); 378 (XboxController::LEDPattern)(XboxController::LED_FLASH_TOP_LEFT + slot));
353 379
380 #ifdef ENABLE_NEW_GAMEPAD_API
381 NSString* ident =
382 [NSString stringWithFormat:
383 @"Xbox 360 Controller (Vendor: %04x Product: %04x)",
384 device->GetProductId(), device->GetVendorId()];
385 copyNSStringAsUTF16LittleEndian(
386 ident,
387 data_.items[slot].id,
388 sizeof(data_.items[slot].id));
389
390 copyNSStringAsUTF16LittleEndian(
391 @"standard",
392 data_.items[slot].mapping,
393 sizeof(data_.items[slot].mapping));
394 #else
354 NSString* ident = 395 NSString* ident =
355 [NSString stringWithFormat: 396 [NSString stringWithFormat:
356 @"Xbox 360 Controller (STANDARD GAMEPAD Vendor: %04x Product: %04x)", 397 @"Xbox 360 Controller (STANDARD GAMEPAD Vendor: %04x Product: %04x)",
357 device->GetProductId(), device->GetVendorId()]; 398 device->GetProductId(), device->GetVendorId()];
358 NSData* as16 = [ident dataUsingEncoding:NSUTF16StringEncoding]; 399 copyNSStringAsUTF16LittleEndian(
359 const size_t kOutputLengthBytes = sizeof(data_.items[slot].id); 400 ident,
360 memset(&data_.items[slot].id, 0, kOutputLengthBytes); 401 data_.items[slot].id,
361 [as16 getBytes:data_.items[slot].id 402 sizeof(data_.items[slot].id));
362 length:kOutputLengthBytes - sizeof(blink::WebUChar)]; 403 #endif
363 404
364 associated_[slot].is_xbox = true; 405 associated_[slot].is_xbox = true;
365 associated_[slot].xbox.device = device; 406 associated_[slot].xbox.device = device;
366 associated_[slot].xbox.location_id = device->location_id(); 407 associated_[slot].xbox.location_id = device->location_id();
367 data_.items[slot].connected = true; 408 data_.items[slot].connected = true;
368 data_.items[slot].axesLength = 4; 409 data_.items[slot].axesLength = 4;
369 data_.items[slot].buttonsLength = 17; 410 data_.items[slot].buttonsLength = 17;
370 data_.items[slot].timestamp = 0; 411 data_.items[slot].timestamp = 0;
371 if (slot >= data_.length) 412 if (slot >= data_.length)
372 data_.length = slot + 1; 413 data_.length = slot + 1;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 pads->length = WebGamepads::itemsLengthCap; 472 pads->length = WebGamepads::itemsLengthCap;
432 for (size_t i = 0; i < WebGamepads::itemsLengthCap; ++i) { 473 for (size_t i = 0; i < WebGamepads::itemsLengthCap; ++i) {
433 if (!associated_[i].is_xbox && associated_[i].hid.mapper) 474 if (!associated_[i].is_xbox && associated_[i].hid.mapper)
434 associated_[i].hid.mapper(data_.items[i], &pads->items[i]); 475 associated_[i].hid.mapper(data_.items[i], &pads->items[i]);
435 else 476 else
436 pads->items[i] = data_.items[i]; 477 pads->items[i] = data_.items[i];
437 } 478 }
438 } 479 }
439 480
440 } // namespace content 481 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698