15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_BROWSER_GAMEPAD_GAMEPAD_PLATFORM_DATA_FETCHER_MAC_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_GAMEPAD_GAMEPAD_PLATFORM_DATA_FETCHER_MAC_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_cftyperef.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gamepad/gamepad_data_fetcher.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gamepad/gamepad_standard_mappings.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/browser/gamepad/xbox_data_fetcher_mac.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gamepad_hardware_buffer.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGamepads.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <CoreFoundation/CoreFoundation.h> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <IOKit/hid/IOHIDManager.h> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__OBJC__) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class NSArray; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NSArray; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GamepadPlatformDataFetcherMac : public GamepadDataFetcher, 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public XboxDataFetcher::Delegate { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GamepadPlatformDataFetcherMac(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~GamepadPlatformDataFetcherMac(); 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void GetGamepadData(blink::WebGamepads* pads, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool devices_changed_hint) OVERRIDE; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PauseHint(bool paused) OVERRIDE; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enabled_; 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::ScopedCFTypeRef<IOHIDManagerRef> hid_manager_ref_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static GamepadPlatformDataFetcherMac* InstanceFromContext(void* context); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void DeviceAddCallback(void* context, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IOReturn result, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* sender, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IOHIDDeviceRef ref); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void DeviceRemoveCallback(void* context, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IOReturn result, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* sender, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IOHIDDeviceRef ref); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ValueChangedCallback(void* context, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IOReturn result, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* sender, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IOHIDValueRef ref); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t GetEmptySlot(); 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t GetSlotForDevice(IOHIDDeviceRef device); 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t GetSlotForXboxDevice(XboxController* device); 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeviceAdd(IOHIDDeviceRef device); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddButtonsAndAxes(NSArray* elements, size_t slot); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeviceRemove(IOHIDDeviceRef device); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ValueChanged(IOHIDValueRef value); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void XboxDeviceAdd(XboxController* device) OVERRIDE; 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void XboxDeviceRemove(XboxController* device) OVERRIDE; 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void XboxValueChanged(XboxController* device, 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const XboxController::Data& data) OVERRIDE; 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RegisterForNotifications(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnregisterFromNotifications(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<XboxDataFetcher> xbox_fetcher_; 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebGamepads data_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Side-band data that's not passed to the consumer, but we need to maintain 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to update data_. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AssociatedData { 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_xbox; 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) union { 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) struct { 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IOHIDDeviceRef device_ref; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IOHIDElementRef button_elements[blink::WebGamepad::buttonsLengthCap]; 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IOHIDElementRef axis_elements[blink::WebGamepad::buttonsLengthCap]; 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CFIndex axis_minimums[blink::WebGamepad::axesLengthCap]; 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CFIndex axis_maximums[blink::WebGamepad::axesLengthCap]; 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Function to map from device data to standard layout, if available. 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // May be null if no mapping is available. 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GamepadStandardMappingFunction mapper; 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } hid; 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) struct { 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) XboxController* device; 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UInt32 location_id; 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } xbox; 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AssociatedData associated_[blink::WebGamepads::itemsLengthCap]; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GamepadPlatformDataFetcherMac); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_BROWSER_GAMEPAD_GAMEPAD_PLATFORM_DATA_FETCHER_MAC_H_ 107