From d060e3a50c987d10799ccc739bdbf9d7d7a13c10 Mon Sep 17 00:00:00 2001 From: Hannes Schulze Date: Thu, 6 Feb 2025 18:24:59 +0100 Subject: implement settings --- lib/nes/app/input/input-manager.cc | 43 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'lib/nes/app/input/input-manager.cc') diff --git a/lib/nes/app/input/input-manager.cc b/lib/nes/app/input/input-manager.cc index ceb6690..e88ac84 100644 --- a/lib/nes/app/input/input-manager.cc +++ b/lib/nes/app/input/input-manager.cc @@ -15,6 +15,7 @@ namespace nes::app return res; } + auto get_name() const -> std::string_view override { return "(None)"; } auto read_buttons() -> sys::button_mask override { return sys::button_mask{}; } }; } // namespace @@ -36,6 +37,10 @@ namespace nes::app // This controller was previously used and assigned an index -> replace the current device with this // (known) controller. auto const i = static_cast(index); + if (keyboard_index_ == index) + { + keyboard_index_ = input_device_controller::index::unused; + } if (inputs_[i].controller) { inputs_[i].controller->set_index(input_device_controller::index::unused); @@ -56,6 +61,43 @@ namespace nes::app fill_unassigned_inputs(); } + auto input_manager::toggle_input(u32 const i) -> void + { + // If currently none/keyboard, use the first available controller. + auto curr_was_prev = inputs_[i].controller == nullptr; + if (curr_was_prev && keyboard_index_ == input_device_controller::index::unused) + { + // If currently none and keyboard is available, switch to keyboard. + keyboard_index_ = static_cast(i); + inputs_[i].controller = nullptr; + inputs_[i].device = keyboard_; + return; + } + + // Reset old controller index + if (inputs_[i].controller) { inputs_[i].controller->set_index(input_device_controller::index::unused); } + if (keyboard_index_ == static_cast(i)) { keyboard_index_ = input_device_controller::index::unused; } + + for (auto& controller : controllers_) + { + if (&controller == inputs_[i].controller) + { + curr_was_prev = true; + } + else if (curr_was_prev && controller.get_index() == input_device_controller::index::unused) + { + inputs_[i].controller = &controller; + inputs_[i].controller->set_index(static_cast(i)); + inputs_[i].device = &controller; + return; + } + } + + // No successor found, switch to none. + inputs_[i].controller = nullptr; + inputs_[i].device = &input_device_dummy::get_instance(); + } + auto input_manager::fill_unassigned_inputs() -> void { auto it = controllers_.begin(); @@ -87,6 +129,7 @@ namespace nes::app // We're all out of controllers -> fall back to the keyboard (if this is the first missing controller) // or nothing. inputs_[i].device = fallback; + if (fallback == keyboard_) { keyboard_index_ = static_cast(i); } fallback = &input_device_dummy::get_instance(); // Only use the keyboard as a fallback once. } } -- cgit v1.3.1