X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_callbacks.c;h=7f2e23befdab846df78973ae6e5524c7f05f83b4;hb=14e6aa04047e7be64404a3eceaa20aeba9ce1ab4;hp=9eee649b6a1474f3874d61c9f264f21740d74a08;hpb=a73ad23c19c15d9a94bba45b4c56ca9c8f73e619;p=freeglut diff --git a/src/freeglut_callbacks.c b/src/freeglut_callbacks.c index 9eee649..7f2e23b 100644 --- a/src/freeglut_callbacks.c +++ b/src/freeglut_callbacks.c @@ -41,7 +41,7 @@ #define SET_CALLBACK(a) \ if( fgStructure.Window == NULL ) \ return; \ - FETCH_WCB( ( *( fgStructure.Window ) ), a ) = callback; + SET_WCB( ( *( fgStructure.Window ) ), a, callback ); /* * Sets the Display callback for the current window @@ -52,7 +52,7 @@ void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) ) fgError( "Fatal error in program. NULL display callback not " "permitted in GLUT 3.0+ or freeglut 2.0.1+\n" ); SET_CALLBACK( Display ); - fgStructure.Window->State.Redisplay = TRUE; + fgStructure.Window->State.Redisplay = GL_TRUE; } /* @@ -95,19 +95,32 @@ void FGAPIENTRY glutIdleFunc( void (* callback)( void ) ) void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ), int timerID ) { - SFG_Timer* timer; + SFG_Timer *timer, *node; freeglut_assert_ready; - timer = (SFG_Timer *)calloc( sizeof(SFG_Timer), 1 ); - if( !timer ) - fgError( "Fatal error: " - "Memory allocation failure in glutTimerFunc()\n" ); + 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; - fgListAppend( &fgState.Timers, &timer->Node ); + + for( node = fgState.Timers.First; node; node = node->Node.Next ) + { + if( node->TriggerTime > timer->TriggerTime ) + break; + } + + fgListInsert( &fgState.Timers, &node->Node, &timer->Node ); } /*