Chromium Code Reviews| Index: device/gamepad/game_controller_data_fetcher_mac.mm |
| diff --git a/device/gamepad/game_controller_data_fetcher_mac.mm b/device/gamepad/game_controller_data_fetcher_mac.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..be751bf62049cbc47429398d956fd5b20f0e9e3a |
| --- /dev/null |
| +++ b/device/gamepad/game_controller_data_fetcher_mac.mm |
| @@ -0,0 +1,108 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "device/gamepad/game_controller_data_fetcher_mac.h" |
| + |
| +#include <string.h> |
| + |
| +#include "base/strings/string16.h" |
| +#include "base/strings/string_util.h" |
| +#include "base/strings/utf_string_conversions.h" |
| +#include "base/time/time.h" |
| + |
| +#import <GameController/GameController.h> |
| + |
| +using blink::WebGamepad; |
| +using blink::WebGamepads; |
| + |
| +namespace device { |
| + |
| +namespace { |
| + |
| +void CopyNSStringAsUTF16LittleEndian(NSString* src, |
| + blink::WebUChar* dest, |
| + size_t dest_len) { |
| + NSData* as16 = [src dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; |
| + memset(dest, 0, dest_len); |
| + [as16 getBytes:dest length:dest_len - sizeof(blink::WebUChar)]; |
| +} |
| + |
| +} // namespace |
| + |
| +GameControllerDataFetcherMac::GameControllerDataFetcherMac() {} |
| + |
| +GameControllerDataFetcherMac::~GameControllerDataFetcherMac() {} |
| + |
| +GamepadSource GameControllerDataFetcherMac::source() { |
| + return Factory::static_source(); |
| +} |
| + |
| +void GameControllerDataFetcherMac::GetGamepadData(bool) { |
| + NSArray* controllers = [GCController controllers]; |
| + |
| + for (GCController* controller in controllers) { |
| + auto extended_gamepad = [controller extendedGamepad]; |
| + |
| + // We only support the extendedGamepad profile, the basic gamepad profile |
| + // appears to only be for iOS devices. |
| + if (!extended_gamepad) |
| + continue; |
| + |
| + int player_index = [controller playerIndex]; |
| + PadState* state = GetPadState(player_index); |
| + if (!state) |
| + continue; |
| + |
| + WebGamepad& pad = state->data; |
| + |
| + // This first time we encounter a gamepad, set it's name, mapping, and |
|
scottmg
2016/08/24 18:44:55
nit: it's -> its
|
| + // axes/button counts. This information is static, so it only needs to be |
| + // done once. |
| + if (state->active_state == GAMEPAD_NEWLY_ACTIVE) { |
| + NSString* vendorName = [controller vendorName]; |
| + NSString* ident = |
| + [NSString stringWithFormat:@"%@ (STANDARD GAMEPAD)", |
| + vendorName ? vendorName : @"Unknown"]; |
| + CopyNSStringAsUTF16LittleEndian(ident, pad.id, sizeof(pad.id)); |
| + |
| + CopyNSStringAsUTF16LittleEndian(@"standard", pad.mapping, |
| + sizeof(pad.mapping)); |
| + |
| + pad.axesLength = 4; |
| + pad.buttonsLength = 16; |
| + pad.connected = true; |
| + } |
| + |
| + pad.timestamp = base::TimeTicks::Now().ToInternalValue(); |
| + |
| + pad.axes[0] = [[[extended_gamepad leftThumbstick] xAxis] value]; |
| + pad.axes[1] = -[[[extended_gamepad leftThumbstick] yAxis] value]; |
| + pad.axes[2] = [[[extended_gamepad rightThumbstick] xAxis] value]; |
| + pad.axes[3] = -[[[extended_gamepad rightThumbstick] yAxis] value]; |
| + |
| +#define BUTTON(i, b) \ |
| + pad.buttons[i].pressed = [b isPressed]; \ |
| + pad.buttons[i].value = [b value]; |
| + |
| + BUTTON(0, [extended_gamepad buttonA]); |
|
scottmg
2016/08/24 18:44:55
#include "device/gamepad/gamepad_standard_mappings
|
| + BUTTON(1, [extended_gamepad buttonB]); |
| + BUTTON(2, [extended_gamepad buttonX]); |
| + BUTTON(3, [extended_gamepad buttonY]); |
| + BUTTON(4, [extended_gamepad leftShoulder]); |
| + BUTTON(5, [extended_gamepad rightShoulder]); |
| + BUTTON(6, [extended_gamepad leftTrigger]); |
| + BUTTON(7, [extended_gamepad rightTrigger]); |
| + |
| + // No start, select, or thumbstick buttons |
|
scottmg
2016/08/24 18:44:55
Sorry, I should know this, but are [8-11] these gu
|
| + |
| + BUTTON(12, [[extended_gamepad dpad] up]); |
| + BUTTON(13, [[extended_gamepad dpad] down]); |
| + BUTTON(14, [[extended_gamepad dpad] left]); |
| + BUTTON(15, [[extended_gamepad dpad] right]); |
| + |
| +#undef BUTTON |
| + } |
| +} |
| + |
| +} // namespace device |