Duckstation/src/frontend-common/evdev_input_source.h

89 lines
2.6 KiB
C
Raw Normal View History

#pragma once
#include "core/types.h"
#include "input_source.h"
#include <array>
#include <functional>
#include <libevdev/libevdev.h>
#include <mutex>
#include <vector>
class EvdevInputSource final : public InputSource
{
public:
EvdevInputSource();
~EvdevInputSource() override;
bool Initialize(SettingsInterface& si, std::unique_lock<std::mutex>& settings_lock) override;
void UpdateSettings(SettingsInterface& si, std::unique_lock<std::mutex>& settings_lock) override;
void Shutdown() override;
void PollEvents() override;
std::vector<std::pair<std::string, std::string>> EnumerateDevices() override;
std::vector<InputBindingKey> EnumerateMotors() override;
bool GetGenericBindingMapping(const std::string_view& device, GenericInputBindingMapping* mapping) override;
void UpdateMotorState(InputBindingKey key, float intensity) override;
void UpdateMotorState(InputBindingKey large_key, InputBindingKey small_key, float large_intensity,
float small_intensity) override;
std::optional<InputBindingKey> ParseKeyString(const std::string_view& device,
const std::string_view& binding) override;
std::string ConvertKeyToString(InputBindingKey key) override;
private:
struct ControllerData
{
ControllerData(int fd_, struct libevdev* obj_);
ControllerData(const ControllerData&) = delete;
ControllerData(ControllerData&& move);
~ControllerData();
ControllerData& operator=(const ControllerData&) = delete;
ControllerData& operator=(ControllerData&& move);
struct libevdev* obj = nullptr;
int fd = -1;
int controller_id = 0;
u32 num_motors = 0;
float deadzone = 0.25f;
struct Axis
{
std::string name;
u32 id;
s32 min;
s32 range;
u32 neg_button;
u32 pos_button;
GenericInputBinding neg_generic;
GenericInputBinding pos_generic;
float last_value;
};
struct Button
{
Button() = default;
Button(std::string name_, u32 id_, GenericInputBinding generic_)
: name(std::move(name_)), id(id_), generic(generic_)
{
}
std::string name;
u32 id;
GenericInputBinding generic;
};
std::string uniq;
std::string name;
std::vector<Axis> axes;
std::vector<Button> buttons;
};
ControllerData* GetControllerById(int id);
ControllerData* GetControllerByUniq(const std::string_view& uniq);
bool InitializeController(int index, ControllerData* cd);
void HandleControllerEvents(ControllerData* cd);
std::vector<ControllerData> m_controllers;
};