MultiGamepadProvider.h [plain text]
#pragma once
#if ENABLE(GAMEPAD) && HAVE(MULTIGAMEPADPROVIDER_SUPPORT)
#include "GamepadProvider.h"
#include "GamepadProviderClient.h"
#include <wtf/Forward.h>
#include <wtf/HashSet.h>
namespace WebCore {
class MultiGamepadProvider : public GamepadProvider, public GamepadProviderClient {
public:
virtual ~MultiGamepadProvider() = default;
WEBCORE_EXPORT static MultiGamepadProvider& singleton();
void setUsesOnlyHIDGamepadProvider(bool hidProviderOnly) { m_usesOnlyHIDProvider = hidProviderOnly; }
void startMonitoringGamepads(GamepadProviderClient&) final;
void stopMonitoringGamepads(GamepadProviderClient&) final;
const Vector<PlatformGamepad*>& platformGamepads() final { return m_gamepadVector; }
bool isMockGamepadProvider() const { return false; }
void platformGamepadConnected(PlatformGamepad&, EventMakesGamepadsVisible) final;
void platformGamepadDisconnected(PlatformGamepad&) final;
void platformGamepadInputActivity(EventMakesGamepadsVisible) final;
protected:
WEBCORE_EXPORT void dispatchPlatformGamepadInputActivity();
private:
unsigned indexForNewlyConnectedDevice();
bool m_shouldMakeGamepadsVisible { false };
size_t m_initialGamepadsCount { 0 };
Vector<PlatformGamepad*> m_gamepadVector;
class PlatformGamepadWrapper : public PlatformGamepad {
public:
PlatformGamepadWrapper(unsigned index, PlatformGamepad* wrapped)
: PlatformGamepad(index)
, m_platformGamepad(wrapped)
{
m_id = wrapped->id();
m_mapping = wrapped->mapping();
m_connectTime = wrapped->connectTime();
}
MonotonicTime lastUpdateTime() const final { return m_platformGamepad->lastUpdateTime(); }
const Vector<SharedGamepadValue>& axisValues() const final { return m_platformGamepad->axisValues(); }
const Vector<SharedGamepadValue>& buttonValues() const final { return m_platformGamepad->buttonValues(); }
const char* source() const final { return m_platformGamepad->source(); }
private:
PlatformGamepad* m_platformGamepad;
};
HashMap<PlatformGamepad*, std::unique_ptr<PlatformGamepadWrapper>> m_gamepadMap;
bool m_hidImportComplete { false };
bool m_usesOnlyHIDProvider { false };
};
}
#endif // ENABLE(GAMEPAD) && HAVE(MULTIGAMEPADPROVIDER_SUPPORT)