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 );
/*
* 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 )
{
SFG_Timer *timer = fgState.Timers.First;
if( timer->TriggerTime > checkTime )
+ /* XXX: are timers always sorted by triggerTime? If not, this and fghNextTimer are wrong */
break;
fgListRemove( &fgState.Timers, &timer->Node );
/* Platform-dependent time in milliseconds, as an unsigned 64-bit integer.
* This doesn't overflow in any reasonable time, so no need to worry about
* that. The GLUT API return value will however overflow after 49.7 days,
- * and on Windows we (currently) do not have access to a 64-bit timestamp,
- * which means internal time will still get in trouble when running the
+ * which means you will still get in trouble when running the
* application for more than 49.7 days.
- * This value wraps every 49.7 days, but integer overflows cancel
- * when subtracting an initial start time, unless the total time exceeds
- * 32-bit, where the GLUT API return value is also overflowed.
*/
fg_time_t fgSystemTime(void)
{
* 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 )
fgEnumWindows( fghHavePendingRedisplaysCallback, &enumerator );
return !!enumerator.data;
}
+
/*
* Returns the number of GLUT ticks (milliseconds) till the next timer event.
*/
{
fg_time_t msec;
- if( fgState.IdleCallback || fghHavePendingRedisplays( ) )
+ if( fghHavePendingRedisplays( ) )
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 );
if( fgState.Timers.First )
fghCheckTimers( );
- fghCheckJoystickPolls( );
+ if (fgState.NumActiveJoysticks>0) /* If zero, don't poll joysticks */
+ fghCheckJoystickPolls( );
fghDisplayAll( );
fgCloseWindows( );
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoop" );
+ if (!fgStructure.Windows.First)
+ fgError(" ERROR: glutMainLoop called with no windows created.");
+
fgPlatformMainLoopPreliminaryWork ();
fgState.ExecState = GLUT_EXEC_STATE_RUNNING ;
fgSetWindow( window );
fgState.IdleCallback( );
}
-
- fghSleepForEvents( );
+ else
+ fghSleepForEvents( );
}
}