xinput_data_fetcher_win.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright (c) 2012 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. #ifndef DEVICE_GAMEPAD_XINPUT_DATA_FETCHER_WIN_H_
  5. #define DEVICE_GAMEPAD_XINPUT_DATA_FETCHER_WIN_H_
  6. #include <memory>
  7. #include "build/build_config.h"
  8. #ifndef WIN32_LEAN_AND_MEAN
  9. #define WIN32_LEAN_AND_MEAN
  10. #endif
  11. #include <Unknwn.h>
  12. #include <WinDef.h>
  13. #include <XInput.h>
  14. #include <stdlib.h>
  15. #include <windows.h>
  16. #include "base/compiler_specific.h"
  17. #include "base/memory/weak_ptr.h"
  18. #include "base/scoped_native_library.h"
  19. #include "device/gamepad/gamepad_data_fetcher.h"
  20. #include "device/gamepad/gamepad_standard_mappings.h"
  21. #include "device/gamepad/public/cpp/gamepads.h"
  22. #include "device/gamepad/xinput_haptic_gamepad_win.h"
  23. namespace device {
  24. // XInputGetStateEx uses a slightly larger struct than XInputGetState.
  25. struct XInputGamepadEx {
  26. WORD wButtons;
  27. BYTE bLeftTrigger;
  28. BYTE bRightTrigger;
  29. SHORT sThumbLX;
  30. SHORT sThumbLY;
  31. SHORT sThumbRX;
  32. SHORT sThumbRY;
  33. DWORD dwPaddingReserved;
  34. };
  35. struct XInputStateEx {
  36. DWORD dwPacketNumber;
  37. XInputGamepadEx Gamepad;
  38. };
  39. class XInputDataFetcherWin : public GamepadDataFetcher {
  40. public:
  41. typedef GamepadDataFetcherFactoryImpl<XInputDataFetcherWin,
  42. GAMEPAD_SOURCE_WIN_XINPUT>
  43. Factory;
  44. XInputDataFetcherWin();
  45. XInputDataFetcherWin(const XInputDataFetcherWin&) = delete;
  46. XInputDataFetcherWin& operator=(const XInputDataFetcherWin&) = delete;
  47. ~XInputDataFetcherWin() override;
  48. GamepadSource source() override;
  49. // GamepadDataFetcher implementation.
  50. void GetGamepadData(bool devices_changed_hint) override;
  51. void PlayEffect(int pad_index,
  52. mojom::GamepadHapticEffectType,
  53. mojom::GamepadEffectParametersPtr,
  54. mojom::GamepadHapticsManager::PlayVibrationEffectOnceCallback,
  55. scoped_refptr<base::SequencedTaskRunner>) override;
  56. void ResetVibration(
  57. int pad_index,
  58. mojom::GamepadHapticsManager::ResetVibrationActuatorCallback,
  59. scoped_refptr<base::SequencedTaskRunner>) override;
  60. private:
  61. void OnAddedToProvider() override;
  62. // The function types we use from xinput1_3.dll.
  63. typedef void(WINAPI* XInputEnableFunc)(BOOL enable);
  64. typedef DWORD(WINAPI* XInputGetCapabilitiesFunc)(
  65. DWORD dwUserIndex,
  66. DWORD dwFlags,
  67. XINPUT_CAPABILITIES* pCapabilities);
  68. typedef DWORD(WINAPI* XInputGetStateFunc)(DWORD dwUserIndex,
  69. XINPUT_STATE* pState);
  70. typedef DWORD(WINAPI* XInputGetStateExFunc)(DWORD dwUserIndex,
  71. XInputStateEx* pState);
  72. // Get functions from dynamically loading the xinput dll.
  73. // Returns true if loading was successful.
  74. bool GetXInputDllFunctions();
  75. // Scan for connected XInput and DirectInput gamepads.
  76. void EnumerateDevices();
  77. void GetXInputPadData(int i);
  78. base::ScopedNativeLibrary xinput_dll_;
  79. bool xinput_available_;
  80. // Function pointers to XInput functionality, retrieved in
  81. // |GetXInputDllFunctions|.
  82. XInputGetCapabilitiesFunc xinput_get_capabilities_;
  83. XInputGetStateFunc xinput_get_state_;
  84. XInputGetStateExFunc xinput_get_state_ex_;
  85. XInputHapticGamepadWin::XInputSetStateFunc xinput_set_state_;
  86. bool xinput_connected_[XUSER_MAX_COUNT];
  87. std::unique_ptr<XInputHapticGamepadWin> haptics_[XUSER_MAX_COUNT];
  88. };
  89. } // namespace device
  90. #endif // DEVICE_GAMEPAD_XINPUT_DATA_FETCHER_WIN_H_