summaryrefslogtreecommitdiffstats
path: root/content/browser/gamepad/data_fetcher_mac.h
blob: 34f7d4bcb475012099ba737329aca9974026ebf9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright (c) 2011 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.

#ifndef CONTENT_BROWSER_GAMEPAD_DATA_FETCHER_MAC_H_
#define CONTENT_BROWSER_GAMEPAD_DATA_FETCHER_MAC_H_

#include "build/build_config.h"

#include "base/compiler_specific.h"
#include "base/mac/scoped_cftyperef.h"
#include "content/browser/gamepad/data_fetcher.h"
#include "content/common/gamepad_hardware_buffer.h"

#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/hid/IOHIDManager.h>

#if defined(__OBJC__)
@class NSArray;
#else
class NSArray;
#endif

namespace content {

class GamepadDataFetcherMac : public GamepadDataFetcher {
 public:
  GamepadDataFetcherMac();
  virtual ~GamepadDataFetcherMac();
  virtual void GetGamepadData(WebKit::WebGamepads* pads,
                              bool devices_changed_hint) OVERRIDE;
  virtual void PauseHint(bool paused) OVERRIDE;
 private:
  bool enabled_;
  base::mac::ScopedCFTypeRef<IOHIDManagerRef> hid_manager_ref_;

  static GamepadDataFetcherMac* InstanceFromContext(void* context);
  static void DeviceAddCallback(void* context,
                                IOReturn result,
                                void* sender,
                                IOHIDDeviceRef ref);
  static void DeviceRemoveCallback(void* context,
                                   IOReturn result,
                                   void* sender,
                                   IOHIDDeviceRef ref);
  static void ValueChangedCallback(void* context,
                                   IOReturn result,
                                   void* sender,
                                   IOHIDValueRef ref);

  void DeviceAdd(IOHIDDeviceRef device);
  void AddButtonsAndAxes(NSArray* elements, size_t slot);
  void DeviceRemove(IOHIDDeviceRef device);
  void ValueChanged(IOHIDValueRef value);

  void RegisterForNotifications();
  void UnregisterFromNotifications();

  WebKit::WebGamepads data_;

  // Side-band data that's not passed to the consumer, but we need to maintain
  // to update data_.
  struct AssociatedData {
    IOHIDDeviceRef device_ref;
    IOHIDElementRef button_elements[WebKit::WebGamepad::buttonsLengthCap];
    IOHIDElementRef axis_elements[WebKit::WebGamepad::buttonsLengthCap];
    CFIndex axis_minimums[WebKit::WebGamepad::axesLengthCap];
    CFIndex axis_maximums[WebKit::WebGamepad::axesLengthCap];
  };
  AssociatedData associated_[WebKit::WebGamepads::itemsLengthCap];
};

}  // namespace content

#endif  // CONTENT_BROWSER_GAMEPAD_DATA_FETCHER_MAC_H_