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.
80 lines
2.4 KiB
80 lines
2.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Linux/Android touch implementation for inputsystem |
|
// |
|
//===========================================================================// |
|
|
|
/* For force feedback testing. */ |
|
#include "inputsystem.h" |
|
#include "tier1/convar.h" |
|
#include "tier0/icommandline.h" |
|
#include "SDL.h" |
|
#include "SDL_touch.h" |
|
// NOTE: This has to be the last file included! |
|
#include "tier0/memdbgon.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Handle the events coming from the Touch SDL subsystem. |
|
//----------------------------------------------------------------------------- |
|
int TouchSDLWatcher( void *userInfo, SDL_Event *event ) |
|
{ |
|
CInputSystem *pInputSystem = (CInputSystem *)userInfo; |
|
|
|
if( !event || !pInputSystem ) return 1; |
|
|
|
switch ( event->type ) { |
|
case SDL_FINGERDOWN: |
|
pInputSystem->FingerEvent( IE_FingerDown, event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, event->tfinger.dx, event->tfinger.dy ); |
|
break; |
|
case SDL_FINGERUP: |
|
pInputSystem->FingerEvent( IE_FingerUp, event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, event->tfinger.dx, event->tfinger.dy ); |
|
break; |
|
case SDL_FINGERMOTION: |
|
pInputSystem->FingerEvent( IE_FingerMotion ,event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, event->tfinger.dx, event->tfinger.dy ); |
|
break; |
|
} |
|
|
|
return 1; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Initialize all joysticks |
|
//----------------------------------------------------------------------------- |
|
void CInputSystem::InitializeTouch( void ) |
|
{ |
|
if ( m_bTouchInitialized ) |
|
ShutdownTouch(); |
|
|
|
// abort startup if user requests no touch |
|
if ( CommandLine()->FindParm("-notouch") ) return; |
|
|
|
m_bJoystickInitialized = true; |
|
SDL_AddEventWatch(TouchSDLWatcher, this); |
|
} |
|
|
|
void CInputSystem::ShutdownTouch() |
|
{ |
|
if ( !m_bTouchInitialized ) |
|
return; |
|
|
|
SDL_DelEventWatch( TouchSDLWatcher, this ); |
|
m_bTouchInitialized = false; |
|
} |
|
|
|
void CInputSystem::FingerEvent(int eventType, int fingerId, float x, float y, float dx, float dy) |
|
{ |
|
// Shit, but should work with arm/x86 |
|
|
|
int data0 = fingerId << 16 | eventType; |
|
int _x = (int)((double)x*0xFFFF); |
|
int _y = (int)((double)y*0xFFFF); |
|
int data1 = _x << 16 | (_y & 0xFFFF); |
|
|
|
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); |
|
}
|
|
|