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

Side by Side 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: Addressed review feedback 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "device/gamepad/game_controller_data_fetcher_mac.h"
6
7 #include <string.h>
8
9 #include "base/strings/string16.h"
10 #include "base/strings/string_util.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/time/time.h"
13 #include "device/gamepad/gamepad_standard_mappings.h"
14
15 #import <GameController/GameController.h>
16
17 using blink::WebGamepad;
18 using blink::WebGamepads;
19
20 namespace device {
21
22 namespace {
23
24 void CopyNSStringAsUTF16LittleEndian(NSString* src,
25 blink::WebUChar* dest,
26 size_t dest_len) {
27 NSData* as16 = [src dataUsingEncoding:NSUTF16LittleEndianStringEncoding];
28 memset(dest, 0, dest_len);
29 [as16 getBytes:dest length:dest_len - sizeof(blink::WebUChar)];
30 }
31
32 } // namespace
33
34 GameControllerDataFetcherMac::GameControllerDataFetcherMac() {}
35
36 GameControllerDataFetcherMac::~GameControllerDataFetcherMac() {}
37
38 GamepadSource GameControllerDataFetcherMac::source() {
39 return Factory::static_source();
40 }
41
42 void GameControllerDataFetcherMac::GetGamepadData(bool) {
43 NSArray* controllers = [GCController controllers];
44
45 for (GCController* controller in controllers) {
46 auto extended_gamepad = [controller extendedGamepad];
47
48 // We only support the extendedGamepad profile, the basic gamepad profile
49 // appears to only be for iOS devices.
50 if (!extended_gamepad)
51 continue;
52
53 int player_index = [controller playerIndex];
54 PadState* state = GetPadState(player_index);
55 if (!state)
56 continue;
57
58 WebGamepad& pad = state->data;
59
60 // This first time we encounter a gamepad, set its name, mapping, and
61 // axes/button counts. This information is static, so it only needs to be
62 // done once.
63 if (state->active_state == GAMEPAD_NEWLY_ACTIVE) {
64 NSString* vendorName = [controller vendorName];
65 NSString* ident =
66 [NSString stringWithFormat:@"%@ (STANDARD GAMEPAD)",
67 vendorName ? vendorName : @"Unknown"];
68 CopyNSStringAsUTF16LittleEndian(ident, pad.id, sizeof(pad.id));
69
70 CopyNSStringAsUTF16LittleEndian(@"standard", pad.mapping,
71 sizeof(pad.mapping));
72
73 pad.axesLength = AXIS_INDEX_COUNT;
74 pad.buttonsLength = BUTTON_INDEX_COUNT - 1;
75 pad.connected = true;
76 }
77
78 pad.timestamp = base::TimeTicks::Now().ToInternalValue();
79
80 pad.axes[AXIS_INDEX_LEFT_STICK_X] =
81 [[[extended_gamepad leftThumbstick] xAxis] value];
82 pad.axes[AXIS_INDEX_LEFT_STICK_Y] =
83 -[[[extended_gamepad leftThumbstick] yAxis] value];
84 pad.axes[AXIS_INDEX_RIGHT_STICK_X] =
85 [[[extended_gamepad rightThumbstick] xAxis] value];
86 pad.axes[AXIS_INDEX_RIGHT_STICK_Y] =
87 -[[[extended_gamepad rightThumbstick] yAxis] value];
88
89 #define BUTTON(i, b) \
90 pad.buttons[i].pressed = [b isPressed]; \
91 pad.buttons[i].value = [b value];
92
93 BUTTON(BUTTON_INDEX_PRIMARY, [extended_gamepad buttonA]);
94 BUTTON(BUTTON_INDEX_SECONDARY, [extended_gamepad buttonB]);
95 BUTTON(BUTTON_INDEX_TERTIARY, [extended_gamepad buttonX]);
96 BUTTON(BUTTON_INDEX_QUATERNARY, [extended_gamepad buttonY]);
97 BUTTON(BUTTON_INDEX_LEFT_SHOULDER, [extended_gamepad leftShoulder]);
98 BUTTON(BUTTON_INDEX_RIGHT_SHOULDER, [extended_gamepad rightShoulder]);
99 BUTTON(BUTTON_INDEX_LEFT_TRIGGER, [extended_gamepad leftTrigger]);
100 BUTTON(BUTTON_INDEX_RIGHT_TRIGGER, [extended_gamepad rightTrigger]);
101
102 // No start, select, or thumbstick buttons
103
104 BUTTON(BUTTON_INDEX_DPAD_UP, [[extended_gamepad dpad] up]);
105 BUTTON(BUTTON_INDEX_DPAD_DOWN, [[extended_gamepad dpad] down]);
106 BUTTON(BUTTON_INDEX_DPAD_LEFT, [[extended_gamepad dpad] left]);
107 BUTTON(BUTTON_INDEX_DPAD_RIGHT, [[extended_gamepad dpad] right]);
108
109 #undef BUTTON
110 }
111 }
112
113 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698