diff options
Diffstat (limited to 'vgui2/src/keyrepeat.cpp')
| -rw-r--r-- | vgui2/src/keyrepeat.cpp | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/vgui2/src/keyrepeat.cpp b/vgui2/src/keyrepeat.cpp new file mode 100644 index 0000000..db129e6 --- /dev/null +++ b/vgui2/src/keyrepeat.cpp @@ -0,0 +1,177 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "inputsystem/InputEnums.h" + +#include "vgui/KeyCode.h" +#include "vgui/keyrepeat.h" +#include "tier0/dbg.h" + +// memdbgon must be the last include file in a .cpp file +#include "tier0/memdbgon.h" + +//#define DEBUG_REPEATS + +#ifdef DEBUG_REPEATS +#define DbgRepeat(...) ConMsg( __VA_ARGS__ ) +#else +#define DbgRepeat(...) +#endif + +using namespace vgui; + +vgui::KeyCode g_iCodesForAliases[FM_NUM_KEYREPEAT_ALIASES] = +{ + KEY_XBUTTON_UP, + KEY_XBUTTON_DOWN, + KEY_XBUTTON_LEFT, + KEY_XBUTTON_RIGHT +}; + +//----------------------------------------------------------------------------- +// Purpose: Map joystick codes to our internal ones +//----------------------------------------------------------------------------- +static int GetIndexForCode( vgui::KeyCode code ) +{ + KeyCode localCode = GetBaseButtonCode( code ); + + switch ( localCode ) + { + case KEY_XBUTTON_DOWN: + case KEY_XSTICK1_DOWN: + case KEY_XSTICK2_DOWN: + return KR_ALIAS_DOWN; break; + case KEY_XBUTTON_UP: + case KEY_XSTICK1_UP: + case KEY_XSTICK2_UP: + return KR_ALIAS_UP; break; + case KEY_XBUTTON_LEFT: + case KEY_XSTICK1_LEFT: + case KEY_XSTICK2_LEFT: + return KR_ALIAS_LEFT; break; + case KEY_XBUTTON_RIGHT: + case KEY_XSTICK1_RIGHT: + case KEY_XSTICK2_RIGHT: + return KR_ALIAS_RIGHT; break; + default: + break; + } + return -1; +} + +//----------------------------------------------------------------------------- +CKeyRepeatHandler::CKeyRepeatHandler() +{ + Reset(); + for ( int i = 0; i < FM_NUM_KEYREPEAT_ALIASES; i++ ) + { + m_flRepeatTimes[i] = 0.16; + } +} + +//----------------------------------------------------------------------------- +// Purpose: Clear all state +//----------------------------------------------------------------------------- +void CKeyRepeatHandler::Reset() +{ + DbgRepeat( "KeyRepeat: Reset\n" ); + + memset( m_bAliasDown, 0, sizeof( m_bAliasDown ) ); + m_bHaveKeyDown = false; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CKeyRepeatHandler::KeyDown( vgui::KeyCode code ) +{ + int joyStick = GetJoystickForCode( code ); + int iIndex = GetIndexForCode(code); + if ( iIndex == -1 ) + return; + + if ( m_bAliasDown[ joyStick ][ iIndex ] ) + return; + + DbgRepeat( "KeyRepeat: KeyDown %d(%d)\n", joyStick, iIndex ); + + Reset(); + m_bAliasDown[ joyStick ][ iIndex ] = true; + m_flNextKeyRepeat[ joyStick ] = Plat_FloatTime() + 0.4; + m_bHaveKeyDown = true; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CKeyRepeatHandler::KeyUp( vgui::KeyCode code ) +{ + int joyStick = GetJoystickForCode( code ); + int iIndex = GetIndexForCode(code); + if ( iIndex == -1 ) + return; + + DbgRepeat( "KeyRepeat: KeyUp %d(%d)\n", joyStick, iIndex ); + + m_bAliasDown[ joyStick ][ iIndex ] = false; + + m_bHaveKeyDown = false; + for ( int i = 0; i < FM_NUM_KEYREPEAT_ALIASES; i++ ) + { + for ( int j = 0; j < MAX_JOYSTICKS; j++ ) + { + if ( m_bAliasDown[ j ][ i ] ) + { + m_bHaveKeyDown = true; + break; + } + } + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +vgui::KeyCode CKeyRepeatHandler::KeyRepeated( void ) +{ + if ( IsPC() ) + return BUTTON_CODE_NONE; + + if ( !m_bHaveKeyDown ) + return BUTTON_CODE_NONE; + + float currentTime = Plat_FloatTime(); + + for ( int j = 0; j < MAX_JOYSTICKS; j++ ) + { + if ( m_flNextKeyRepeat[ j ] < currentTime ) + { + for ( int i = 0; i < FM_NUM_KEYREPEAT_ALIASES; i++ ) + { + if ( m_bAliasDown[ j ][ i ] ) + { + m_flNextKeyRepeat[ j ] = currentTime + m_flRepeatTimes[i]; + DbgRepeat( "KeyRepeat: Repeat %d(%d)\n", j, i ); + + return ButtonCodeToJoystickButtonCode( g_iCodesForAliases[i], j ); + } + } + } + } + + return BUTTON_CODE_NONE; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CKeyRepeatHandler::SetKeyRepeatTime( vgui::KeyCode code, float flRepeat ) +{ + int iIndex = GetIndexForCode(code); + Assert( iIndex != -1 ); + m_flRepeatTimes[ iIndex ] = flRepeat; +} |