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_WIN_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_GAMEPAD_GAMEPAD_PLATFORM_DATA_FETCHER_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WIN32_LEAN_AND_MEAN
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WIN32_LEAN_AND_MEAN
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdlib.h>
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <Unknwn.h>
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <WinDef.h>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <XInput.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/scoped_native_library.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gamepad/gamepad_data_fetcher.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/gamepad/gamepad_standard_mappings.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/gamepad/raw_input_data_fetcher_win.h"
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGamepads.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GamepadPlatformDataFetcherWin : public GamepadDataFetcher {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GamepadPlatformDataFetcherWin();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GamepadPlatformDataFetcherWin();
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void GetGamepadData(blink::WebGamepads* pads,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool devices_changed_hint) OVERRIDE;
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void PauseHint(bool paused) OVERRIDE;
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // XInput-specific implementation for GetGamepadData.
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool GetXInputGamepadData(blink::WebGamepads* pads,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            bool devices_changed_hint);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The three function types we use from xinput1_3.dll.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef void (WINAPI *XInputEnableFunc)(BOOL enable);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef DWORD (WINAPI *XInputGetCapabilitiesFunc)(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef DWORD (WINAPI *XInputGetStateFunc)(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DWORD dwUserIndex, XINPUT_STATE* pState);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get functions from dynamically loaded xinput1_3.dll. We don't use
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DELAYLOAD because the import library for Win8 SDK pulls xinput1_4 which
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // isn't redistributable. Returns true if loading was successful. We include
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // xinput1_3.dll with Chrome.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetXInputDllFunctions();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scan for connected XInput and DirectInput gamepads.
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void EnumerateDevices(blink::WebGamepads* pads);
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool GetXInputPadConnectivity(int i, blink::WebGamepad* pad) const;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void GetXInputPadData(int i, blink::WebGamepad* pad);
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void GetRawInputPadData(int i, blink::WebGamepad* pad);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int FirstAvailableGamepadId() const;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HasXInputGamepad(int index) const;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool HasRawInputGamepad(const HANDLE handle) const;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ScopedNativeLibrary xinput_dll_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool xinput_available_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Function pointers to XInput functionality, retrieved in
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |GetXinputDllFunctions|.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XInputEnableFunc xinput_enable_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XInputGetCapabilitiesFunc xinput_get_capabilities_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XInputGetStateFunc xinput_get_state_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum PadConnectionStatus {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISCONNECTED,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    XINPUT_CONNECTED,
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RAWINPUT_CONNECTED
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct PadState {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PadConnectionStatus status;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GamepadStandardMappingFunction mapper;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int xinput_index; // XInput-only
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    HANDLE raw_input_handle;  // RawInput-only fields.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PadState pad_state_[blink::WebGamepads::itemsLengthCap];
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<RawInputDataFetcher> raw_input_fetcher_;
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GamepadPlatformDataFetcherWin);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_BROWSER_GAMEPAD_GAMEPAD_PLATFORM_DATA_FETCHER_WIN_H_
101