diff options
Diffstat (limited to 'lib/nes/app/input/input-manager.hh')
| -rw-r--r-- | lib/nes/app/input/input-manager.hh | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/nes/app/input/input-manager.hh b/lib/nes/app/input/input-manager.hh new file mode 100644 index 0000000..10308c7 --- /dev/null +++ b/lib/nes/app/input/input-manager.hh @@ -0,0 +1,45 @@ +#pragma once + +#include "nes/app/input/input-device-keyboard.hh" +#include "nes/app/input/input-device-controller.hh" +#include "nes/common/list.hh" + +namespace nes +{ + /// Manages input devices. + /// + /// The main purpose of this class is to assign newly plugged in controllers as the primary/secondary input and fall + /// back to the keyboard if needed. + class input_manager + { + static constexpr auto input_count = std::size_t{ 2 }; + + input_device_keyboard* keyboard_; + list<input_device_controller> controllers_; + struct + { + input_device* device{ nullptr }; + input_device_controller* controller{ nullptr }; + } inputs_[input_count]{}; + + public: + explicit input_manager(input_device_keyboard&); + + input_manager(input_manager const&) = delete; + input_manager(input_manager&&) = delete; + auto operator=(input_manager const&) -> input_manager& = delete; + auto operator=(input_manager&&) -> input_manager& = delete; + + auto get_input_1() const -> input_device& { return *inputs_[0].device; } + auto get_input_2() const -> input_device& { return *inputs_[1].device; } + + auto get_keyboard() const -> input_device_keyboard& { return *keyboard_; } + auto get_controllers() const -> list<input_device_controller> const& { return controllers_; } + + auto add_controller(input_device_controller&) -> void; + auto remove_controller(input_device_controller&) -> void; + + private: + auto fill_unassigned_inputs() -> void; + }; +} // namespace nes
\ No newline at end of file |
