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" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickFunc" );
|
||||||
fgInitialiseJoysticks ();
|
fgInitialiseJoysticks ();
|
||||||
|
|
||||||
if ( ( ( fgStructure.CurrentWindow->State.JoystickPollRate < 0 ) ||
|
if ( (
|
||||||
!FETCH_WCB(*fgStructure.CurrentWindow,Joystick) ) && /* Joystick callback was disabled */
|
fgStructure.CurrentWindow->State.JoystickPollRate <= 0 || /* Joystick callback was disabled */
|
||||||
( callback && ( pollInterval >= 0 ) ) ) /* but is now enabled */
|
!FETCH_WCB(*fgStructure.CurrentWindow,Joystick)
|
||||||
|
) &&
|
||||||
|
(
|
||||||
|
callback && ( pollInterval > 0 ) /* but is now enabled */
|
||||||
|
) )
|
||||||
++fgState.NumActiveJoysticks;
|
++fgState.NumActiveJoysticks;
|
||||||
else if ( ( ( fgStructure.CurrentWindow->State.JoystickPollRate >= 0 ) &&
|
else if ( (
|
||||||
FETCH_WCB(*fgStructure.CurrentWindow,Joystick) ) && /* Joystick callback was enabled */
|
fgStructure.CurrentWindow->State.JoystickPollRate > 0 && /* Joystick callback was enabled */
|
||||||
( !callback || ( pollInterval < 0 ) ) ) /* but is now disabled */
|
FETCH_WCB(*fgStructure.CurrentWindow,Joystick)
|
||||||
|
) &&
|
||||||
|
(
|
||||||
|
!callback || ( pollInterval <= 0 ) /* but is now disabled */
|
||||||
|
) )
|
||||||
--fgState.NumActiveJoysticks;
|
--fgState.NumActiveJoysticks;
|
||||||
|
|
||||||
SET_CALLBACK( Joystick );
|
SET_CALLBACK( Joystick );
|
||||||
|
@ -316,7 +316,7 @@ struct tagSFG_State
|
|||||||
fgExecutionState ExecState; /* Used for GLUT termination */
|
fgExecutionState ExecState; /* Used for GLUT termination */
|
||||||
char *ProgramName; /* Name of the invoking program */
|
char *ProgramName; /* Name of the invoking program */
|
||||||
GLboolean JoysticksInitialised; /* Only initialize if application calls for them */
|
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 */
|
GLboolean InputDevsInitialised; /* Only initialize if application calls for them */
|
||||||
|
|
||||||
int MouseWheelTicks; /* Number of ticks the mouse wheel has turned */
|
int MouseWheelTicks; /* Number of ticks the mouse wheel has turned */
|
||||||
|
@ -172,7 +172,12 @@ static void fghDisplayAll( void )
|
|||||||
static void fghcbCheckJoystickPolls( SFG_Window *window,
|
static void fghcbCheckJoystickPolls( SFG_Window *window,
|
||||||
SFG_Enumerator *enumerator )
|
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 <=
|
if( window->State.JoystickLastPoll + window->State.JoystickPollRate <=
|
||||||
checkTime )
|
checkTime )
|
||||||
@ -182,12 +187,17 @@ static void fghcbCheckJoystickPolls( SFG_Window *window,
|
|||||||
#endif /* !defined(_WIN32_WCE) */
|
#endif /* !defined(_WIN32_WCE) */
|
||||||
window->State.JoystickLastPoll = checkTime;
|
window->State.JoystickLastPoll = checkTime;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fgEnumSubWindows( window, fghcbCheckJoystickPolls, enumerator );
|
fgEnumSubWindows( window, fghcbCheckJoystickPolls, enumerator );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check all windows for joystick polling
|
* 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 )
|
static void fghCheckJoystickPolls( void )
|
||||||
{
|
{
|
||||||
@ -312,29 +322,8 @@ void fgWarning( const char *fmt, ... )
|
|||||||
* there is a joystick callback. We have a short-circuit early
|
* there is a joystick callback. We have a short-circuit early
|
||||||
* return if we find any joystick handler registered.
|
* 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)
|
static void fghHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e)
|
||||||
{
|
{
|
||||||
if( w->State.Redisplay && w->State.Visible )
|
if( w->State.Redisplay && w->State.Visible )
|
||||||
@ -353,6 +342,7 @@ static int fghHavePendingRedisplays (void)
|
|||||||
fgEnumWindows( fghHavePendingRedisplaysCallback, &enumerator );
|
fgEnumWindows( fghHavePendingRedisplaysCallback, &enumerator );
|
||||||
return !!enumerator.data;
|
return !!enumerator.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the number of GLUT ticks (milliseconds) till the next timer event.
|
* Returns the number of GLUT ticks (milliseconds) till the next timer event.
|
||||||
*/
|
*/
|
||||||
@ -378,9 +368,9 @@ static void fghSleepForEvents( void )
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
msec = fghNextTimer( );
|
msec = fghNextTimer( );
|
||||||
/* XXX Use GLUT timers for joysticks... */
|
/* XXX Should use GLUT timers for joysticks... */
|
||||||
/* XXX Dumb; forces granularity to .01sec */
|
/* XXX Dumb; forces granularity to .01sec */
|
||||||
if( fghHaveJoystick( ) && ( msec > 10 ) )
|
if( fgState.NumActiveJoysticks>0 && ( msec > 10 ) )
|
||||||
msec = 10;
|
msec = 10;
|
||||||
|
|
||||||
fgPlatformSleepForEvents ( msec );
|
fgPlatformSleepForEvents ( msec );
|
||||||
@ -398,6 +388,7 @@ void FGAPIENTRY glutMainLoopEvent( void )
|
|||||||
|
|
||||||
if( fgState.Timers.First )
|
if( fgState.Timers.First )
|
||||||
fghCheckTimers( );
|
fghCheckTimers( );
|
||||||
|
if (fgState.NumActiveJoysticks>0) /* If zero, don't poll joysticks */
|
||||||
fghCheckJoystickPolls( );
|
fghCheckJoystickPolls( );
|
||||||
fghDisplayAll( );
|
fghDisplayAll( );
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user