mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-07 17:29:36 +00:00
inputsystem: fix UB in touch events callback, make touch more responsive
This commit is contained in:
@@ -1530,16 +1530,6 @@ bool CInputSystem::GetRawMouseAccumulators( int& accumX, int& accumY )
|
||||
#endif
|
||||
}
|
||||
|
||||
bool CInputSystem::GetTouchAccumulators( InputEventType_t &event, int &fingerId, int& accumX, int& accumY )
|
||||
{
|
||||
event = m_touchAccumEvent;
|
||||
fingerId = m_touchAccumFingerId;
|
||||
accumX = m_touchAccumX;
|
||||
accumY = m_touchAccumY;
|
||||
|
||||
return m_bJoystickInitialized;
|
||||
}
|
||||
|
||||
void CInputSystem::SetConsoleTextMode( bool bConsoleTextMode )
|
||||
{
|
||||
/* If someone calls this after init, shut it down. */
|
||||
|
||||
@@ -44,6 +44,8 @@
|
||||
|
||||
#include "steam/steam_api.h"
|
||||
|
||||
#define TOUCH_FINGER_MAX_COUNT 10
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Implementation of the input system
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -101,7 +103,7 @@ public:
|
||||
virtual void *GetHapticsInterfaceAddress() const { return NULL;}
|
||||
#endif
|
||||
bool GetRawMouseAccumulators( int& accumX, int& accumY );
|
||||
bool GetTouchAccumulators( InputEventType_t &event, int &fingerId, int& accumX, int& accumY );
|
||||
virtual bool GetTouchAccumulators( int fingerId, float &dx, float &dy );
|
||||
|
||||
virtual void SetConsoleTextMode( bool bConsoleTextMode );
|
||||
|
||||
@@ -458,8 +460,7 @@ public:
|
||||
bool m_bRawInputSupported;
|
||||
int m_mouseRawAccumX, m_mouseRawAccumY;
|
||||
|
||||
InputEventType_t m_touchAccumEvent;
|
||||
int m_touchAccumFingerId, m_touchAccumX, m_touchAccumY;
|
||||
float m_touchAccumX[TOUCH_FINGER_MAX_COUNT], m_touchAccumY[TOUCH_FINGER_MAX_COUNT];
|
||||
|
||||
// For the 'SleepUntilInput' feature
|
||||
HANDLE m_hEvent;
|
||||
|
||||
+30
-12
@@ -48,6 +48,9 @@ void CInputSystem::InitializeTouch( void )
|
||||
// abort startup if user requests no touch
|
||||
if ( CommandLine()->FindParm("-notouch") ) return;
|
||||
|
||||
memset( m_touchAccumX, 0, sizeof(m_touchAccumX) );
|
||||
memset( m_touchAccumY, 0, sizeof(m_touchAccumY) );
|
||||
|
||||
m_bJoystickInitialized = true;
|
||||
SDL_AddEventWatch(TouchSDLWatcher, this);
|
||||
}
|
||||
@@ -61,20 +64,35 @@ void CInputSystem::ShutdownTouch()
|
||||
m_bTouchInitialized = false;
|
||||
}
|
||||
|
||||
bool CInputSystem::GetTouchAccumulators( int fingerId, float &dx, float &dy )
|
||||
{
|
||||
dx = m_touchAccumX[fingerId];
|
||||
dy = m_touchAccumY[fingerId];
|
||||
|
||||
m_touchAccumX[fingerId] = m_touchAccumY[fingerId] = 0.f;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CInputSystem::FingerEvent(int eventType, int fingerId, float x, float y, float dx, float dy)
|
||||
{
|
||||
// Shit, but should work with arm/x86
|
||||
if( fingerId >= TOUCH_FINGER_MAX_COUNT )
|
||||
return;
|
||||
|
||||
int data0 = fingerId << 16 | eventType;
|
||||
int _x = (int)((double)x*0xFFFF);
|
||||
int _y = (int)((double)y*0xFFFF);
|
||||
int data1 = _x << 16 | (_y & 0xFFFF);
|
||||
if( eventType == IE_FingerUp )
|
||||
{
|
||||
m_touchAccumX[fingerId] = 0.f;
|
||||
m_touchAccumY[fingerId] = 0.f;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_touchAccumX[fingerId] += dx;
|
||||
m_touchAccumY[fingerId] += dy;
|
||||
}
|
||||
|
||||
union{int i;float f;} ifconv;
|
||||
ifconv.f = dx;
|
||||
int _dx = ifconv.i;
|
||||
ifconv.f = dy;
|
||||
int _dy = ifconv.i;
|
||||
|
||||
PostEvent(data0, m_nLastSampleTick, data1, _dx, _dy);
|
||||
int _x,_y;
|
||||
memcpy( &_x, &x, sizeof(float) );
|
||||
memcpy( &_y, &y, sizeof(float) );
|
||||
PostEvent(eventType, m_nLastSampleTick, fingerId, _x, _y);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user