void CInputManager::QueueAction(const CAction& action) { CSingleLock lock(m_actionMutex); // Avoid dispatching multiple analog actions per frame with the same ID if (action.IsAnalog()) { m_queuedActions.erase(std::remove_if(m_queuedActions.begin(), m_queuedActions.end(), [&action](const CAction& queuedAction) { return action.GetID() == queuedAction.GetID(); }), m_queuedActions.end()); } m_queuedActions.push_back(action); }
bool CInputManager::OnAction(const CAction& action) { if (action.GetID() != ACTION_NONE) { if (action.IsAnalog()) { QueueAction(action); } else { // If button was pressed this frame, send action if (action.GetHoldTime() == 0) { QueueAction(action); } else { // Only send repeated actions for basic navigation commands bool bIsNavigation = false; switch (action.GetID()) { case ACTION_MOVE_LEFT: case ACTION_MOVE_RIGHT: case ACTION_MOVE_UP: case ACTION_MOVE_DOWN: case ACTION_PAGE_UP: case ACTION_PAGE_DOWN: bIsNavigation = true; break; default: break; } if (bIsNavigation) QueueAction(action); } } return true; } return false; }