#include "controls/padmapper.hpp" #include #include "options.h" namespace devilution { namespace { std::array::value> ButtonToReleaseAction; } // namespace void PadmapperPress(ControllerButton button, const PadmapperOptions::Action &action) { if (action.actionPressed) action.actionPressed(); SuppressedButton = action.boundInput.modifier; ButtonToReleaseAction[static_cast(button)] = &action; } void PadmapperRelease(ControllerButton button, bool invokeAction) { if (invokeAction) { const PadmapperOptions::Action *action = ButtonToReleaseAction[static_cast(button)]; if (action == nullptr) return; // Ignore unmapped buttons. // Check that the action can be triggered. if (action->actionReleased && action->isEnabled()) action->actionReleased(); } ButtonToReleaseAction[static_cast(button)] = nullptr; } bool PadmapperIsActionActive(std::string_view actionName) { for (const PadmapperOptions::Action &action : GetOptions().Padmapper.actions) { if (action.key != actionName) continue; const PadmapperOptions::Action *releaseAction = ButtonToReleaseAction[static_cast(action.boundInput.button)]; return releaseAction != nullptr && releaseAction->key == actionName; } return false; } void PadmapperReleaseAllActiveButtons() { for (const PadmapperOptions::Action *action : ButtonToReleaseAction) { if (action != nullptr) { PadmapperRelease(action->boundInput.button, /*invokeAction=*/true); } } } std::string_view PadmapperActionNameTriggeredByButtonEvent(ControllerButtonEvent ctrlEvent) { if (!ctrlEvent.up) { const PadmapperOptions::Action *pressAction = GetOptions().Padmapper.findAction(ctrlEvent.button, IsControllerButtonPressed); if (pressAction == nullptr) return {}; return pressAction->key; } const PadmapperOptions::Action *releaseAction = ButtonToReleaseAction[static_cast(ctrlEvent.button)]; if (releaseAction == nullptr) return {}; return releaseAction->key; } } // namespace devilution