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