You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
4.4 KiB
177 lines
4.4 KiB
//========= 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; |
|
}
|
|
|