#include "global.h" /* ----------------------------------------------------------------------------- Class: InputFilter Desc: See header. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Chris Danford ----------------------------------------------------------------------------- */ #include "InputFilter.h" #include "RageLog.h" #include "RageInput.h" #include "RageThreads.h" InputFilter* INPUTFILTER = NULL; // global and accessable from anywhere in our program InputFilter::InputFilter() { queuemutex = new RageMutex; memset( m_BeingHeld, 0, sizeof(m_BeingHeld) ); memset( m_BeingForced, 0, sizeof(m_BeingForced) ); memset( m_fSecsHeld, 0, sizeof(m_fSecsHeld) ); for( int d=0; d2000) times per Update(). DeviceInput di( (InputDevice)0,0,now); INPUTMAN->Update( fDeltaTime ); /* Make sure that nothing gets inserted while we do this, to prevent * things like "key pressed, key release, key repeat". */ LockMut(*queuemutex); for( int d=0; d 0 ) { m_fSecsToForce[d][b] -= fDeltaTime; if( m_fSecsToForce[d][b] <= 0 ) StopForcingKey( di ); } if( !IsBeingPressed(di) ) continue; const float fOldHoldTime = m_fSecsHeld[d][b]; m_fSecsHeld[d][b] += fDeltaTime; const float fNewHoldTime = m_fSecsHeld[d][b]; float fTimeBetweenRepeats; InputEventType iet; if( fOldHoldTime > TIME_BEFORE_SLOW_REPEATS ) { if( fOldHoldTime > TIME_BEFORE_FAST_REPEATS ) { fTimeBetweenRepeats = TIME_BETWEEN_FAST_REPEATS; iet = IET_FAST_REPEAT; } else { fTimeBetweenRepeats = TIME_BETWEEN_SLOW_REPEATS; iet = IET_SLOW_REPEAT; } if( int(fOldHoldTime/fTimeBetweenRepeats) != int(fNewHoldTime/fTimeBetweenRepeats) ) { queue.push_back( InputEvent(di,iet) ); } } } } } bool InputFilter::IsBeingPressed( DeviceInput di ) { return m_BeingHeld[di.device][di.button] || m_BeingForced[di.device][di.button]; } float InputFilter::GetSecsHeld( DeviceInput di ) { return m_fSecsHeld[di.device][di.button]; } void InputFilter::GetInputEvents( InputEventArray &array ) { LockMut(*queuemutex); array = queue; queue.clear(); }