mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-05-01 11:45:42 -04:00
89 lines
2.6 KiB
C++
89 lines
2.6 KiB
C++
#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;
|
|
};
|