summaryrefslogtreecommitdiff
path: root/lib/nes/app/input/input-manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/nes/app/input/input-manager.cc')
-rw-r--r--lib/nes/app/input/input-manager.cc43
1 files changed, 43 insertions, 0 deletions
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<u32>(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<input_device_controller::index>(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<input_device_controller::index>(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<input_device_controller::index>(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<input_device_controller::index>(i); }
fallback = &input_device_dummy::get_instance(); // Only use the keyboard as a fallback once.
}
}