summaryrefslogtreecommitdiff
path: root/vgui2/src/keyrepeat.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vgui2/src/keyrepeat.cpp')
-rw-r--r--vgui2/src/keyrepeat.cpp177
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;
+}