joystick:

- only poll joysticks if we have an active joystick
- active joystick is defined as having callback and having positive (NON-ZERO!) pollInterval, as per GLUT sources
- use fgState.NumActiveJoysticks instead of fghHaveJoystick to save bunch of unnecessary function calls etc
- fghcbCheckJoystickPolls more concervative, per window we first check if a joystick is active (per above definition)

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1554 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
dcnieho 2013-03-06 03:39:00 +00:00
parent 59ae6d2a56
commit 9c2936cd85
3 changed files with 36 additions and 37 deletions

View File

@ -213,13 +213,21 @@ void FGAPIENTRY glutJoystickFunc( FGCBJoystick callback, int pollInterval )
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickFunc" );
fgInitialiseJoysticks ();
if ( ( ( fgStructure.CurrentWindow->State.JoystickPollRate < 0 ) ||
!FETCH_WCB(*fgStructure.CurrentWindow,Joystick) ) && /* Joystick callback was disabled */
( callback && ( pollInterval >= 0 ) ) ) /* but is now enabled */
if ( (
fgStructure.CurrentWindow->State.JoystickPollRate <= 0 || /* Joystick callback was disabled */
!FETCH_WCB(*fgStructure.CurrentWindow,Joystick)
) &&
(
callback && ( pollInterval > 0 ) /* but is now enabled */
) )
++fgState.NumActiveJoysticks;
else if ( ( ( fgStructure.CurrentWindow->State.JoystickPollRate >= 0 ) &&
FETCH_WCB(*fgStructure.CurrentWindow,Joystick) ) && /* Joystick callback was enabled */
( !callback || ( pollInterval < 0 ) ) ) /* but is now disabled */
else if ( (
fgStructure.CurrentWindow->State.JoystickPollRate > 0 && /* Joystick callback was enabled */
FETCH_WCB(*fgStructure.CurrentWindow,Joystick)
) &&
(
!callback || ( pollInterval <= 0 ) /* but is now disabled */
) )
--fgState.NumActiveJoysticks;
SET_CALLBACK( Joystick );

View File

@ -316,7 +316,7 @@ struct tagSFG_State
fgExecutionState ExecState; /* Used for GLUT termination */
char *ProgramName; /* Name of the invoking program */
GLboolean JoysticksInitialised; /* Only initialize if application calls for them */
int NumActiveJoysticks; /* Number of active joysticks -- if zero, don't poll joysticks */
int NumActiveJoysticks; /* Number of active joysticks (callback defined and positive pollrate) -- if zero, don't poll joysticks */
GLboolean InputDevsInitialised; /* Only initialize if application calls for them */
int MouseWheelTicks; /* Number of ticks the mouse wheel has turned */

View File

@ -172,15 +172,21 @@ static void fghDisplayAll( void )
static void fghcbCheckJoystickPolls( SFG_Window *window,
SFG_Enumerator *enumerator )
{
fg_time_t checkTime = fgElapsedTime( );
if( window->State.JoystickLastPoll + window->State.JoystickPollRate <=
checkTime )
fg_time_t checkTime;
if (window->State.JoystickPollRate > 0 && FETCH_WCB( *window, Joystick ))
{
/* This window has a joystick to be polled (if pollrate <= 0, user needs to poll manually with glutForceJoystickFunc */
checkTime= fgElapsedTime( );
if( window->State.JoystickLastPoll + window->State.JoystickPollRate <=
checkTime )
{
#if !defined(_WIN32_WCE)
fgJoystickPollWindow( window );
fgJoystickPollWindow( window );
#endif /* !defined(_WIN32_WCE) */
window->State.JoystickLastPoll = checkTime;
window->State.JoystickLastPoll = checkTime;
}
}
fgEnumSubWindows( window, fghcbCheckJoystickPolls, enumerator );
@ -188,6 +194,10 @@ static void fghcbCheckJoystickPolls( SFG_Window *window,
/*
* Check all windows for joystick polling
*
* The real way to do this is to make use of the glutTimer() API
* to more cleanly re-implement the joystick API. Then, this code
* and all other "joystick timer" code can be yanked.
*/
static void fghCheckJoystickPolls( void )
{
@ -312,29 +322,8 @@ void fgWarning( const char *fmt, ... )
* there is a joystick callback. We have a short-circuit early
* return if we find any joystick handler registered.
*
* The real way to do this is to make use of the glutTimer() API
* to more cleanly re-implement the joystick API. Then, this code
* and all other "joystick timer" code can be yanked.
*
*/
static void fghCheckJoystickCallback( SFG_Window* w, SFG_Enumerator* e)
{
if( FETCH_WCB( *w, Joystick ) )
{
e->found = GL_TRUE;
e->data = w;
}
fgEnumSubWindows( w, fghCheckJoystickCallback, e );
}
static int fghHaveJoystick( void )
{
SFG_Enumerator enumerator;
enumerator.found = GL_FALSE;
enumerator.data = NULL;
fgEnumWindows( fghCheckJoystickCallback, &enumerator );
return !!enumerator.data;
}
static void fghHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e)
{
if( w->State.Redisplay && w->State.Visible )
@ -353,6 +342,7 @@ static int fghHavePendingRedisplays (void)
fgEnumWindows( fghHavePendingRedisplaysCallback, &enumerator );
return !!enumerator.data;
}
/*
* Returns the number of GLUT ticks (milliseconds) till the next timer event.
*/
@ -378,9 +368,9 @@ static void fghSleepForEvents( void )
return;
msec = fghNextTimer( );
/* XXX Use GLUT timers for joysticks... */
/* XXX Should use GLUT timers for joysticks... */
/* XXX Dumb; forces granularity to .01sec */
if( fghHaveJoystick( ) && ( msec > 10 ) )
if( fgState.NumActiveJoysticks>0 && ( msec > 10 ) )
msec = 10;
fgPlatformSleepForEvents ( msec );
@ -398,7 +388,8 @@ void FGAPIENTRY glutMainLoopEvent( void )
if( fgState.Timers.First )
fghCheckTimers( );
fghCheckJoystickPolls( );
if (fgState.NumActiveJoysticks>0) /* If zero, don't poll joysticks */
fghCheckJoystickPolls( );
fghDisplayAll( );
fgCloseWindows( );