X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_callbacks.c;h=7f2e23befdab846df78973ae6e5524c7f05f83b4;hb=529bce67e31e6d99b07398160e04efc97216b47c;hp=dfabb907f9942d90495d8e7731228c0033ac35a1;hpb=5d724da03c1b5988304888c17c5eba8a40c0a529;p=freeglut diff --git a/src/freeglut_callbacks.c b/src/freeglut_callbacks.c index dfabb90..7f2e23b 100644 --- a/src/freeglut_callbacks.c +++ b/src/freeglut_callbacks.c @@ -41,8 +41,7 @@ #define SET_CALLBACK(a) \ if( fgStructure.Window == NULL ) \ return; \ - FETCH_WCB( ( *( fgStructure.Window ) ), a ) = callback; - /* fgStructure.Window->Callbacks.a = callback; */ + SET_WCB( ( *( fgStructure.Window ) ), a, callback ); /* * Sets the Display callback for the current window @@ -53,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; } /* @@ -96,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 ); } /* @@ -116,25 +128,14 @@ void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ), */ static void fghVisibility( int status ) { - FGCBVisibility vis; - int glut_status; + int glut_status = GLUT_VISIBLE; freeglut_assert_ready; freeglut_return_if_fail( fgStructure.Window ); - vis = FETCH_WCB( ( *( fgStructure.Window ) ), Visibility ); - freeglut_return_if_fail( vis ); - /* Callbacks.Visibility ); */ - if( status == GLUT_HIDDEN || status == GLUT_FULLY_COVERED ) + if( ( GLUT_HIDDEN == status ) || ( GLUT_FULLY_COVERED == status ) ) glut_status = GLUT_NOT_VISIBLE; - else - glut_status = GLUT_VISIBLE; - vis( glut_status ); - /* - fgStructure.Window->Callbacks.Visibility( GLUT_NOT_VISIBLE ); - else - fgStructure.Window->Callbacks.Visibility( GLUT_VISIBLE ); - */ + INVOKE_WCB( *( fgStructure.Window ), Visibility, ( glut_status ) ); } void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) ) @@ -239,9 +240,8 @@ void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) ) /* A. Donev: Destruction callback for menus */ void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) ) { - if( fgStructure.Menu == NULL ) - return; - fgStructure.Menu->Destroy = callback; + if( fgStructure.Menu ) + fgStructure.Menu->Destroy = callback; } /*