struct InputMapping { auto bind() -> void; auto bind(shared_pointer device, uint group, uint input, int16 oldValue, int16 newValue) -> bool; auto poll() -> int16; auto rumble(bool enable) -> void; auto unbind() -> void; auto isDigital() const -> bool { return type == 0; } auto isAnalog() const -> bool { return type == 1; } auto isRumble() const -> bool { return type == 2; } auto assignmentName() -> string; auto deviceName() -> string; string path; //configuration file key path string name; //input name (human readable) uint type = 0; string assignment = "None"; shared_pointer device; uint group = 0; uint input = 0; enum class Qualifier : uint { None, Lo, Hi, Rumble } qualifier = Qualifier::None; }; struct InputHotkey : InputMapping { function void> press; function void> release; int16 state = 0; }; struct InputDevice { string name; vector mappings; }; struct InputPort { string name; vector devices; }; struct InputEmulator { Emulator::Interface* interface = nullptr; string name; vector ports; }; struct InputManager { InputManager(); auto bind(Emulator::Interface*) -> void; auto bind() -> void; auto poll() -> void; auto onChange(shared_pointer device, uint group, uint input, int16_t oldValue, int16_t newValue) -> void; auto quit() -> void; auto findMouse() -> shared_pointer; //hotkeys.cpp auto appendHotkeys() -> void; auto pollHotkeys() -> void; vector> devices; vector emulators; vector hotkeys; InputEmulator* emulator = nullptr; //points to InputEmulator that represents the currently active emulator uint64 lastPoll; //time in milliseconds since last call to poll() uint64 latency; //minimum time in milliseconds before poll() can be called again }; extern unique_pointer inputManager;