BGE Bugfix, SDL joysticks arrow keys didnt work when 2 joysticks were being used at the same time.

The event queue was running for every joystick sensor without checking if the events were for that joystick.
seperating the event queue for each joystick is overkill so instead deal with all joysticks events in once function.

Also removed some unused functions
This commit is contained in:
Campbell Barton 2008-09-02 06:12:19 +00:00
parent 81ad271d15
commit 84dcfa181b
7 changed files with 74 additions and 158 deletions

@ -99,38 +99,6 @@ void SCA_Joystick::ReleaseInstance()
} }
} }
void SCA_Joystick::HandleEvents()
{
if(m_isinit)
{
if(SDL_PollEvent(&m_private->m_event))
{
switch(m_private->m_event.type)
{
case SDL_JOYAXISMOTION:
HANDLE_AXISMOTION(OnAxisMotion);
break;
case SDL_JOYHATMOTION:
HANDLE_HATMOTION(OnHatMotion);
break;
case SDL_JOYBUTTONUP:
HANDLE_BUTTONUP(OnButtonUp);
break;
case SDL_JOYBUTTONDOWN:
HANDLE_BUTTONDOWN(OnButtonDown);
break;
case SDL_JOYBALLMOTION:
HANDLE_BALLMOTION(OnBallMotion);
break;
default:
HANDLE_NOEVENT(OnNothing);
break;
}
}
}
}
void SCA_Joystick::cSetPrecision(int val) void SCA_Joystick::cSetPrecision(int val)
{ {
m_prec = val; m_prec = val;
@ -229,76 +197,6 @@ int SCA_Joystick::pGetHat(int direction)
return 0; return 0;
} }
bool SCA_Joystick::GetJoyAxisMotion()
{
bool result = false;
if(m_isinit){
if(SDL_PollEvent(&m_private->m_event)){
switch(m_private->m_event.type)
{
case SDL_JOYAXISMOTION:
result = true;
break;
}
}
}
return result;
}
bool SCA_Joystick::GetJoyButtonPress()
{
bool result = false;
if(m_isinit){
if(SDL_PollEvent(&m_private->m_event)){
switch(m_private->m_event.type)
{
case SDL_JOYBUTTONDOWN:
result = true;
break;
}
}
}
return result;
}
bool SCA_Joystick::GetJoyButtonRelease()
{
bool result = false;
if(m_isinit)
{
if(SDL_PollEvent(&m_private->m_event)){
switch(m_private->m_event.type)
{
case SDL_JOYBUTTONUP:
result = true;
break;
}
}
}
return result;
}
bool SCA_Joystick::GetJoyHatMotion()
{
bool result = false;
if(m_isinit){
if(SDL_PollEvent(&m_private->m_event)){
switch(m_private->m_event.type)
{
case SDL_JOYHATMOTION:
result = true;
break;
}
}
}
return 0;
}
int SCA_Joystick::GetNumberOfAxes() int SCA_Joystick::GetNumberOfAxes()
{ {
int number; int number;

@ -29,6 +29,7 @@
#define _SCA_JOYSTICK_H_ #define _SCA_JOYSTICK_H_
#include "SCA_JoystickDefines.h" #include "SCA_JoystickDefines.h"
#include "SDL.h"
/* /*
* Basic Joystick class * Basic Joystick class
@ -103,6 +104,16 @@ class SCA_Joystick
/* is triggered */ /* is triggered */
bool m_istrig; bool m_istrig;
/*
* event callbacks
*/
void OnAxisMotion(SDL_Event *sdl_event);
void OnHatMotion(SDL_Event *sdl_event);
void OnButtonUp(SDL_Event *sdl_event);
void OnButtonDown(SDL_Event *sdl_event);
void OnNothing(SDL_Event *sdl_event);
void OnBallMotion(SDL_Event *sdl_event){}
/* /*
* Open the joystick * Open the joystick
*/ */
@ -112,17 +123,6 @@ class SCA_Joystick
* Close the joystick * Close the joystick
*/ */
void DestroyJoystickDevice(void); void DestroyJoystickDevice(void);
/*
* event callbacks
*/
void OnAxisMotion(void);
void OnHatMotion(void);
void OnButtonUp(void);
void OnButtonDown(void);
void OnNothing(void);
void OnBallMotion(void){}
/* /*
* fills the axis mnember values * fills the axis mnember values
@ -158,9 +158,9 @@ class SCA_Joystick
public: public:
static SCA_Joystick *GetInstance( short int joyindex ); static SCA_Joystick *GetInstance( short int joyindex );
static void HandleEvents( void );
void ReleaseInstance(); void ReleaseInstance();
void HandleEvents();
/* /*
*/ */
@ -212,16 +212,6 @@ public:
bool IsTrig(void){ bool IsTrig(void){
return m_istrig; return m_istrig;
} }
/*
* returns true if an event is being processed
*/
bool GetJoyAxisMotion(void);
bool GetJoyButtonPress(void);
bool GetJoyButtonRelease(void);
bool GetJoyHatMotion(void);
/* /*
* returns the # of... * returns the # of...
@ -237,7 +227,7 @@ public:
int Connected(void); int Connected(void);
}; };
void Joystick_HandleEvents( void );
#endif #endif

@ -40,12 +40,4 @@
#define JOYINDEX_MAX 8 #define JOYINDEX_MAX 8
/* function callbacks */
#define HANDLE_AXISMOTION(fn) ((fn)(), 0L)
#define HANDLE_HATMOTION(fn) ((fn)(), 0L)
#define HANDLE_BUTTONUP(fn) ((fn)(), 0L)
#define HANDLE_BUTTONDOWN(fn) ((fn)(), 0L)
#define HANDLE_BALLMOTION(fn) ((fn)(), 0L)
#define HANDLE_NOEVENT(fn) ((fn)(), 0L)
#endif #endif

@ -30,41 +30,75 @@
void SCA_Joystick::OnAxisMotion(void) void SCA_Joystick::OnAxisMotion(SDL_Event* sdl_event)
{ {
pFillAxes(); pFillAxes();
m_axisnum = m_private->m_event.jaxis.axis; m_axisnum = sdl_event->jaxis.axis;
m_axisvalue = m_private->m_event.jaxis.value; m_axisvalue = sdl_event->jaxis.value;
m_istrig = 1; m_istrig = 1;
} }
void SCA_Joystick::OnHatMotion(void) void SCA_Joystick::OnHatMotion(SDL_Event* sdl_event)
{ {
m_hatdir = m_private->m_event.jhat.value; m_hatdir = sdl_event->jhat.value;
m_hatnum = m_private->m_event.jhat.hat; m_hatnum = sdl_event->jhat.hat;
m_istrig = 1; m_istrig = 1;
} }
void SCA_Joystick::OnButtonUp(void) void SCA_Joystick::OnButtonUp(SDL_Event* sdl_event)
{ {
m_buttonnum = -2; m_buttonnum = -2;
} }
void SCA_Joystick::OnButtonDown(void) void SCA_Joystick::OnButtonDown(SDL_Event* sdl_event)
{ {
m_buttonmax = GetNumberOfButtons(); m_buttonmax = GetNumberOfButtons();
if(m_private->m_event.jbutton.button >= 1 || m_private->m_event.jbutton.button <= m_buttonmax) if(sdl_event->jbutton.button >= 1 || sdl_event->jbutton.button <= m_buttonmax)
{ {
m_istrig = 1; m_istrig = 1;
m_buttonnum = m_private->m_event.jbutton.button; m_buttonnum = sdl_event->jbutton.button;
} }
} }
void SCA_Joystick::OnNothing(void) void SCA_Joystick::OnNothing(SDL_Event* sdl_event)
{ {
m_istrig = 0; m_istrig = 0;
} }
/* only handle events for 1 joystick */
void SCA_Joystick::HandleEvents(void)
{
SDL_Event sdl_event;
if(SDL_PollEvent(&sdl_event))
{
/* Note! m_instance[sdl_event.jaxis.which]
* will segfault if over JOYINDEX_MAX, not too nice but what are the chances? */
switch(sdl_event.type)
{
case SDL_JOYAXISMOTION:
SCA_Joystick::m_instance[sdl_event.jaxis.which]->OnAxisMotion(&sdl_event);
break;
case SDL_JOYHATMOTION:
SCA_Joystick::m_instance[sdl_event.jhat.which]->OnHatMotion(&sdl_event);
break;
case SDL_JOYBUTTONUP:
SCA_Joystick::m_instance[sdl_event.jbutton.which]->OnButtonUp(&sdl_event);
break;
case SDL_JOYBUTTONDOWN:
SCA_Joystick::m_instance[sdl_event.jbutton.which]->OnButtonDown(&sdl_event);
break;
case SDL_JOYBALLMOTION:
SCA_Joystick::m_instance[sdl_event.jball.which]->OnBallMotion(&sdl_event);
break;
default:
printf("SCA_Joystick::HandleEvents, Unknown SDL event, this should not happen\n");
break;
}
}
}

@ -32,10 +32,6 @@
class SCA_Joystick::PrivateData class SCA_Joystick::PrivateData
{ {
public: public:
/*
* SDL events structure
*/
SDL_Event m_event;
/* /*
* The Joystick * The Joystick
*/ */

@ -44,7 +44,6 @@ SCA_JoystickManager::SCA_JoystickManager(class SCA_LogicManager* logicmgr)
for (i=0; i<JOYINDEX_MAX; i++) { for (i=0; i<JOYINDEX_MAX; i++) {
m_joystick[i] = SCA_Joystick::GetInstance( i ); m_joystick[i] = SCA_Joystick::GetInstance( i );
} }
//m_joystick = NULL;
} }
@ -59,14 +58,21 @@ SCA_JoystickManager::~SCA_JoystickManager()
void SCA_JoystickManager::NextFrame(double curtime,double deltatime) void SCA_JoystickManager::NextFrame(double curtime,double deltatime)
{ {
set<SCA_ISensor*>::iterator it; if (m_sensors.size()==0) {
for (it = m_sensors.begin(); it != m_sensors.end(); it++) return;
{ }
SCA_JoystickSensor* joysensor = (SCA_JoystickSensor*)(*it); else {
if(!joysensor->IsSuspended()) set<SCA_ISensor*>::iterator it;
SCA_Joystick::HandleEvents(); /* Handle all SDL Joystick events */
for (it = m_sensors.begin(); it != m_sensors.end(); it++)
{ {
m_joystick[joysensor->GetJoyIndex()]->HandleEvents(); SCA_JoystickSensor* joysensor = (SCA_JoystickSensor*)(*it);
joysensor->Activate(m_logicmgr, NULL); if(!joysensor->IsSuspended())
{
joysensor->Activate(m_logicmgr, NULL);
}
} }
} }
} }

@ -245,10 +245,10 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
} }
if (js->IsTrig()) { if (js->IsTrig()) {
/* This test detects changes with the joystick trigger state. /* The if below detects changes with the joystick trigger state.
* js->IsTrig() will stay true as long as the key is held. * js->IsTrig() will stay true as long as the key is held.
* even though the event from SDL will only be sent once. * even though the event from SDL will only be sent once.
* istrig_js && m_istrig_lastjs - when this is true it means this sensor * (js->IsTrig() && m_istrig_lastjs) - when true it means this sensor
* had the same joystick trigger state last time, * had the same joystick trigger state last time,
* Setting the result false this time means it wont run the sensors * Setting the result false this time means it wont run the sensors
* controller every time (like a pulse sensor) * controller every time (like a pulse sensor)