X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_callbacks.c;h=7f2e23befdab846df78973ae6e5524c7f05f83b4;hb=65138c495648cd547734c045268e7551bb493bb7;hp=8c7280547910268db626b5caef0e5aa4b4ba1e2b;hpb=3d059cdfbb1482fd92174664fbca0c29672f4db8;p=freeglut diff --git a/src/freeglut_callbacks.c b/src/freeglut_callbacks.c index 8c72805..7f2e23b 100644 --- a/src/freeglut_callbacks.c +++ b/src/freeglut_callbacks.c @@ -29,8 +29,6 @@ #include "config.h" #endif -#define G_LOG_DOMAIN "freeglut-callbacks" - #include "../include/GL/freeglut.h" #include "freeglut_internal.h" @@ -40,8 +38,10 @@ /* * All of the callbacks setting methods can be generalized to this: */ -#define SET_CALLBACK(a) if( fgStructure.Window == NULL ) return;\ - fgStructure.Window->Callbacks.a = callback; +#define SET_CALLBACK(a) \ + if( fgStructure.Window == NULL ) \ + return; \ + SET_WCB( ( *( fgStructure.Window ) ), a, callback ); /* * Sets the Display callback for the current window @@ -49,15 +49,10 @@ void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) ) { if( !callback ) - fgError ("Fatal error in program. NULL display callback not " - "permitted in GLUT 3.0+ or freeglut 2.0.1+\n"); + fgError( "Fatal error in program. NULL display callback not " + "permitted in GLUT 3.0+ or freeglut 2.0.1+\n" ); SET_CALLBACK( Display ); - - /* - * Force a redisplay with the new callback - */ - fgStructure.Window->State.Redisplay = TRUE; - + fgStructure.Window->State.Redisplay = GL_TRUE; } /* @@ -71,7 +66,8 @@ void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) ) /* * Sets the Keyboard callback for the current window */ -void FGAPIENTRY glutKeyboardFunc( void (* callback)( unsigned char, int, int ) ) +void FGAPIENTRY glutKeyboardFunc( void (* callback) + ( unsigned char, int, int ) ) { SET_CALLBACK( Keyboard ); } @@ -90,63 +86,56 @@ void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) ) void FGAPIENTRY glutIdleFunc( void (* callback)( void ) ) { freeglut_assert_ready; - - /* - * The global idle callback pointer is stored in fgState structure - */ fgState.IdleCallback = callback; } /* * Sets the Timer callback for the current window */ -void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ), int timerID ) +void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ), + int timerID ) { - SFG_Timer* timer; + SFG_Timer *timer, *node; freeglut_assert_ready; - /* - * Create a new freeglut timer hook structure - */ - timer = (SFG_Timer *)calloc( sizeof(SFG_Timer), 1 ); - if (!timer) - fgError ("Fatal error: " - "Memory allocation failure in glutTimerFunc()\n"); - - /* - * Remember the callback address and timer hook's ID - */ + 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; - - /* - * When will the time out happen (in terms of window's timer) - */ timer->TriggerTime = fgElapsedTime() + timeOut; - /* - * Have the new hook attached to the current window - */ - 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 ); } /* * Sets the Visibility callback for the current window. - * - * I had to peer to GLUT sources to clean up the mess. - * Can anyone please explain me what is going on here?!? */ static void fghVisibility( int status ) { + int glut_status = GLUT_VISIBLE; + freeglut_assert_ready; - freeglut_return_if_fail( fgStructure.Window != NULL ); - freeglut_return_if_fail( fgStructure.Window->Callbacks.Visibility != NULL ); + freeglut_return_if_fail( fgStructure.Window ); - if( status == GLUT_HIDDEN || status == GLUT_FULLY_COVERED ) - fgStructure.Window->Callbacks.Visibility( GLUT_NOT_VISIBLE ); - else - fgStructure.Window->Callbacks.Visibility( GLUT_VISIBLE ); + if( ( GLUT_HIDDEN == status ) || ( GLUT_FULLY_COVERED == status ) ) + glut_status = GLUT_NOT_VISIBLE; + INVOKE_WCB( *( fgStructure.Window ), Visibility, ( glut_status ) ); } void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) ) @@ -162,7 +151,8 @@ void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) ) /* * Sets the keyboard key release callback for the current window */ -void FGAPIENTRY glutKeyboardUpFunc( void (* callback)( unsigned char, int, int ) ) +void FGAPIENTRY glutKeyboardUpFunc( void (* callback) + ( unsigned char, int, int ) ) { SET_CALLBACK( KeyboardUp ); } @@ -178,20 +168,13 @@ void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) ) /* * Sets the joystick callback and polling rate for the current window */ -void FGAPIENTRY glutJoystickFunc( void (* callback)( unsigned int, int, int, int ), int pollInterval ) +void FGAPIENTRY glutJoystickFunc( void (* callback) + ( unsigned int, int, int, int ), + int pollInterval ) { SET_CALLBACK( Joystick ); - - freeglut_return_if_fail( fgStructure.Window != NULL ); - - /* - * Do not forget setting the joystick poll rate - */ fgStructure.Window->State.JoystickPollRate = pollInterval; - /* - * Make sure the joystick polling routine gets called as early as possible: - */ fgStructure.Window->State.JoystickLastPoll = fgElapsedTime() - fgStructure.Window->State.JoystickPollRate; @@ -208,7 +191,16 @@ void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) ) } /* - * Sets the mouse motion callback for the current window (one or more buttons are pressed) + * Sets the mouse wheel callback for the current window + */ +void FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) ) +{ + SET_CALLBACK( MouseWheel ); +} + +/* + * Sets the mouse motion callback for the current window (one or more buttons + * are pressed) */ void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) ) { @@ -216,7 +208,8 @@ void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) ) } /* - * Sets the passive mouse motion callback for the current window (no mouse buttons are pressed) + * Sets the passive mouse motion callback for the current window (no mouse + * buttons are pressed) */ void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) ) { @@ -247,8 +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; } /* @@ -257,7 +250,6 @@ void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) ) void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) ) { freeglut_assert_ready; - fgState.MenuStateCallback = callback; } @@ -267,7 +259,6 @@ void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) ) void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) ) { freeglut_assert_ready; - fgState.MenuStatusCallback = callback; }