#pragma once #include "common/windows_headers.h" #include "input_source.h" #include #include #include #include class SettingsInterface; class Win32RawInputSource final : public InputSource { public: Win32RawInputSource(); ~Win32RawInputSource(); bool Initialize(SettingsInterface& si, std::unique_lock& settings_lock) override; void UpdateSettings(SettingsInterface& si, std::unique_lock& settings_lock) override; void Shutdown() override; void PollEvents() override; std::vector> EnumerateDevices() override; std::vector 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 ParseKeyString(const std::string_view& device, const std::string_view& binding) override; std::string ConvertKeyToString(InputBindingKey key) override; private: struct MouseState { HANDLE device; u32 button_state; s32 last_x; s32 last_y; }; static bool RegisterDummyClass(); static LRESULT CALLBACK DummyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); bool CreateDummyWindow(); void DestroyDummyWindow(); bool OpenDevices(); void CloseDevices(); bool ProcessRawInputEvent(const RAWINPUT* event); HWND m_dummy_window = {}; u32 m_num_keyboards = 0; u32 m_num_mice = 0; std::vector m_mice; };