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

Unified Diff: device/gamepad/game_controller_data_fetcher_mac.mm

Issue 2271353002: Added support for GameController devices on OSX (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « device/gamepad/game_controller_data_fetcher_mac.h ('k') | device/gamepad/gamepad_pad_state_provider.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « device/gamepad/game_controller_data_fetcher_mac.h ('k') | device/gamepad/gamepad_pad_state_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698