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:
parent
59ae6d2a56
commit
9c2936cd85
@ -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 );
|
||||
|
@ -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 */
|
||||
|
@ -172,7 +172,12 @@ static void fghDisplayAll( void )
|
||||
static void fghcbCheckJoystickPolls( SFG_Window *window,
|
||||
SFG_Enumerator *enumerator )
|
||||
{
|
||||
fg_time_t checkTime = fgElapsedTime( );
|
||||
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 )
|
||||
@ -182,12 +187,17 @@ static void fghcbCheckJoystickPolls( SFG_Window *window,
|
||||
#endif /* !defined(_WIN32_WCE) */
|
||||
window->State.JoystickLastPoll = checkTime;
|
||||
}
|
||||
}
|
||||
|
||||
fgEnumSubWindows( window, fghcbCheckJoystickPolls, enumerator );
|
||||
}
|
||||
|
||||
/*
|
||||
* 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,6 +388,7 @@ void FGAPIENTRY glutMainLoopEvent( void )
|
||||
|
||||
if( fgState.Timers.First )
|
||||
fghCheckTimers( );
|
||||
if (fgState.NumActiveJoysticks>0) /* If zero, don't poll joysticks */
|
||||
fghCheckJoystickPolls( );
|
||||
fghDisplayAll( );
|
||||
|
||||
|
Reference in New Issue
Block a user