/* Creates a timer and sets its callback */ void FGAPIENTRY glutTimerFunc( unsigned int timeOut, FGCBTimer callback, int timerID ) { SFG_Timer *timer, *node; FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTimerFunc" ); if( (timer = fgState.FreeTimers.Last) ) { fgListRemove( &fgState.FreeTimers, &timer->Node ); } else { if( ! (timer = malloc(sizeof(SFG_Timer))) ) fgError( "Fatal error: " "Memory allocation failure in glutTimerFunc()" ); } timer->Callback = callback; timer->ID = timerID; timer->TriggerTime = fgElapsedTime() + timeOut; /* Insert such that timers are sorted by end-time */ for( node = fgState.Timers.First; node; node = node->Node.Next ) { if( node->TriggerTime > timer->TriggerTime ) break; } fgListInsert( &fgState.Timers, &node->Node, &timer->Node ); }
/* * Sets the Timer callback for the current window */ void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ), int timerID ) { SFG_Timer *timer, *node; glutes_assert_ready; if( (timer = fgState.FreeTimers.Last) ) { fgListRemove( &fgState.FreeTimers, &timer->Node ); } else { if( ! (timer = malloc(sizeof(SFG_Timer))) ) fgError( "Fatal error: " "Memory allocation failure in glutTimerFunc()\n" ); } timer->Callback = callback; timer->ID = timerID; timer->TriggerTime = fgElapsedTime() + timeOut; for( node = fgState.Timers.First; node; node = node->Node.Next ) { if( node->TriggerTime > timer->TriggerTime ) break; } fgListInsert( &fgState.Timers, &node->Node, &timer->Node ); }