X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffg_callbacks.c;h=01b256e9a21f547c5e1a36b67b8cbe41f3946a77;hb=77ee35c8d522dddac4e2c88e8de166491d4d762c;hp=b3e29179ce702afb5d5299c99f2ca94db8cb0efc;hpb=19242860f0cd6d3f2c3e32e87e15fe5e1151d072;p=freeglut diff --git a/src/fg_callbacks.c b/src/fg_callbacks.c index b3e2917..01b256e 100644 --- a/src/fg_callbacks.c +++ b/src/fg_callbacks.c @@ -30,71 +30,19 @@ /* -- INTERFACE FUNCTIONS -------------------------------------------------- */ -/* - * All of the callbacks setting methods can be generalized to this: - */ -#define SET_CALLBACK(a) \ -do \ -{ \ - if( fgStructure.CurrentWindow == NULL ) \ - return; \ - SET_WCB( ( *( fgStructure.CurrentWindow ) ), a, callback ); \ -} while( 0 ) /* - * Sets the Display callback for the current window + * Global callbacks. */ -void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDisplayFunc" ); - if( !callback ) - fgError( "Fatal error in program. NULL display callback not " - "permitted in GLUT 3.0+ or freeglut 2.0.1+" ); - SET_CALLBACK( Display ); -} - -/* - * Sets the Reshape callback for the current window - */ -void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReshapeFunc" ); - SET_CALLBACK( Reshape ); -} - -/* - * Sets the Keyboard callback for the current window - */ -void FGAPIENTRY glutKeyboardFunc( void (* callback) - ( unsigned char, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutKeyboardFunc" ); - SET_CALLBACK( Keyboard ); -} - -/* - * Sets the Special callback for the current window - */ -void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpecialFunc" ); - SET_CALLBACK( Special ); -} - -/* - * Sets the global idle callback - */ -void FGAPIENTRY glutIdleFunc( void (* callback)( void ) ) +/* Sets the global idle callback */ +void FGAPIENTRY glutIdleFunc( FGCBIdle callback ) { FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIdleFunc" ); fgState.IdleCallback = callback; } -/* - * Sets the Timer callback for the current window - */ -void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ), - int timerID ) +/* Creates a timer and sets its callback */ +void FGAPIENTRY glutTimerFunc( unsigned int timeOut, FGCBTimer callback, int timerID ) { SFG_Timer *timer, *node; @@ -124,22 +72,117 @@ void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ), fgListInsert( &fgState.Timers, &node->Node, &timer->Node ); } +/* Deprecated version of glutMenuStatusFunc callback setting method */ +void FGAPIENTRY glutMenuStateFunc( FGCBMenuState callback ) +{ + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStateFunc" ); + fgState.MenuStateCallback = callback; +} + +/* Sets the global menu status callback for the current window */ +void FGAPIENTRY glutMenuStatusFunc( FGCBMenuStatus callback ) +{ + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStatusFunc" ); + fgState.MenuStatusCallback = callback; +} + + +/* + * Menu specific callbacks. + */ +/* Callback upon menu destruction */ +void FGAPIENTRY glutMenuDestroyFunc( FGCBDestroy callback ) +{ + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuDestroyFunc" ); + if( fgStructure.CurrentMenu ) + fgStructure.CurrentMenu->Destroy = callback; +} + + +/* + * All of the window-specific callbacks setting methods can be generalized to this: + */ +#define SET_CALLBACK(a) \ +do \ +{ \ + if( fgStructure.CurrentWindow == NULL ) \ + return; \ + SET_WCB( ( *( fgStructure.CurrentWindow ) ), a, callback ); \ +} while( 0 ) +/* + * And almost every time the callback setter function can be implemented like this: + */ +#define IMPLEMENT_CALLBACK_FUNC_2NAME(a,b) \ +void FGAPIENTRY glut##a##Func( FGCB##b callback ) \ +{ \ + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glut"#a"Func" ); \ + SET_CALLBACK( b ); \ +} +#define IMPLEMENT_CALLBACK_FUNC(a) IMPLEMENT_CALLBACK_FUNC_2NAME(a,a) + +/* Implement all these callback setter functions... */ +IMPLEMENT_CALLBACK_FUNC(Reshape); +IMPLEMENT_CALLBACK_FUNC(Position); +IMPLEMENT_CALLBACK_FUNC(Keyboard); +IMPLEMENT_CALLBACK_FUNC(KeyboardUp); +IMPLEMENT_CALLBACK_FUNC(Special); +IMPLEMENT_CALLBACK_FUNC(SpecialUp); +IMPLEMENT_CALLBACK_FUNC(Mouse); +IMPLEMENT_CALLBACK_FUNC(MouseWheel); +IMPLEMENT_CALLBACK_FUNC(Motion); +IMPLEMENT_CALLBACK_FUNC_2NAME(PassiveMotion,Passive); +IMPLEMENT_CALLBACK_FUNC(Entry); +/* glutWMCloseFunc is an alias for glutCloseFunc; both set the window's Destroy callback */ +IMPLEMENT_CALLBACK_FUNC_2NAME(Close,Destroy); +IMPLEMENT_CALLBACK_FUNC_2NAME(WMClose,Destroy); +IMPLEMENT_CALLBACK_FUNC(OverlayDisplay); +IMPLEMENT_CALLBACK_FUNC(WindowStatus); +IMPLEMENT_CALLBACK_FUNC(ButtonBox); +IMPLEMENT_CALLBACK_FUNC(Dials); +IMPLEMENT_CALLBACK_FUNC(TabletMotion); +IMPLEMENT_CALLBACK_FUNC(TabletButton); +IMPLEMENT_CALLBACK_FUNC(MultiEntry); +IMPLEMENT_CALLBACK_FUNC(MultiButton); +IMPLEMENT_CALLBACK_FUNC(MultiMotion); +IMPLEMENT_CALLBACK_FUNC(MultiPassive); +IMPLEMENT_CALLBACK_FUNC(InitContext); +IMPLEMENT_CALLBACK_FUNC(Pause); +IMPLEMENT_CALLBACK_FUNC(Resume); + + + +/* + * Sets the Display callback for the current window + */ +void FGAPIENTRY glutDisplayFunc( FGCBDisplay callback ) +{ + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDisplayFunc" ); + if( !callback ) + fgError( "Fatal error in program. NULL display callback not " + "permitted in GLUT 3.0+ or freeglut 2.0.1+" ); + SET_CALLBACK( Display ); +} + /* * Sets the Visibility callback for the current window. */ static void fghVisibility( int status ) { - int glut_status = GLUT_VISIBLE; + int vis_status; FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Visibility Callback" ); freeglut_return_if_fail( fgStructure.CurrentWindow ); + /* Translate window status func states to visibility states */ if( ( GLUT_HIDDEN == status ) || ( GLUT_FULLY_COVERED == status ) ) - glut_status = GLUT_NOT_VISIBLE; - INVOKE_WCB( *( fgStructure.CurrentWindow ), Visibility, ( glut_status ) ); + vis_status = GLUT_NOT_VISIBLE; + else /* GLUT_FULLY_RETAINED, GLUT_PARTIALLY_RETAINED */ + vis_status = GLUT_VISIBLE; + + INVOKE_WCB( *( fgStructure.CurrentWindow ), Visibility, ( vis_status ) ); } -void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) ) +void FGAPIENTRY glutVisibilityFunc( FGCBVisibility callback ) { FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutVisibilityFunc" ); SET_CALLBACK( Visibility ); @@ -151,30 +194,9 @@ 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 ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutKeyboardUpFunc" ); - SET_CALLBACK( KeyboardUp ); -} - -/* - * Sets the special key release callback for the current window - */ -void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpecialUpFunc" ); - SET_CALLBACK( SpecialUp ); -} - -/* * 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( FGCBJoystick callback, int pollInterval ) { FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickFunc" ); fgInitialiseJoysticks (); @@ -198,116 +220,12 @@ void FGAPIENTRY glutJoystickFunc( void (* callback) fgStructure.CurrentWindow->State.JoystickLastPoll = 0; } -/* - * Sets the mouse callback for the current window - */ -void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMouseFunc" ); - SET_CALLBACK( Mouse ); -} - -/* - * Sets the mouse wheel callback for the current window - */ -void FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMouseWheelFunc" ); - 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 ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMotionFunc" ); - SET_CALLBACK( Motion ); -} - -/* - * Sets the passive mouse motion callback for the current window (no mouse - * buttons are pressed) - */ -void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPassiveMotionFunc" ); - SET_CALLBACK( Passive ); -} -/* - * Window mouse entry/leave callback - */ -void FGAPIENTRY glutEntryFunc( void (* callback)( int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutEntryFunc" ); - SET_CALLBACK( Entry ); -} - -/* - * Window destruction callbacks - */ -void FGAPIENTRY glutCloseFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCloseFunc" ); - SET_CALLBACK( Destroy ); -} - -void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWMCloseFunc" ); - glutCloseFunc( callback ); -} - -/* A. Donev: Destruction callback for menus */ -void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuDestroyFunc" ); - if( fgStructure.CurrentMenu ) - fgStructure.CurrentMenu->Destroy = callback; -} - -/* - * Deprecated version of glutMenuStatusFunc callback setting method - */ -void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStateFunc" ); - fgState.MenuStateCallback = callback; -} - -/* - * Sets the global menu status callback for the current window - */ -void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStatusFunc" ); - fgState.MenuStatusCallback = callback; -} - -/* - * Sets the overlay display callback for the current window - */ -void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutOverlayDisplayFunc" ); - SET_CALLBACK( OverlayDisplay ); -} - -/* - * Sets the window status callback for the current window - */ -void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWindowStatusFunc" ); - SET_CALLBACK( WindowStatus ); -} /* * Sets the spaceball motion callback for the current window */ -void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) ) +void FGAPIENTRY glutSpaceballMotionFunc( FGCBSpaceMotion callback ) { FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballMotionFunc" ); fgInitialiseSpaceball(); @@ -318,7 +236,7 @@ void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) ) /* * Sets the spaceball rotate callback for the current window */ -void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) ) +void FGAPIENTRY glutSpaceballRotateFunc( FGCBSpaceRotation callback ) { FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballRotateFunc" ); fgInitialiseSpaceball(); @@ -329,7 +247,7 @@ void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) ) /* * Sets the spaceball button callback for the current window */ -void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) ) +void FGAPIENTRY glutSpaceballButtonFunc( FGCBSpaceButton callback ) { FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballButtonFunc" ); fgInitialiseSpaceball(); @@ -337,103 +255,4 @@ void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) ) SET_CALLBACK( SpaceButton ); } -/* - * Sets the button box callback for the current window - */ -void FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutButtonBoxFunc" ); - SET_CALLBACK( ButtonBox ); -} - -/* - * Sets the dials box callback for the current window - */ -void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDialsFunc" ); - SET_CALLBACK( Dials ); -} - -/* - * Sets the tablet motion callback for the current window - */ -void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTabletMotionFunc" ); - SET_CALLBACK( TabletMotion ); -} - -/* - * Sets the tablet buttons callback for the current window - */ -void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTabletButtonFunc" ); - SET_CALLBACK( TabletButton ); -} - -/* - * Sets the multi-pointer entry callback for the current window - */ -void FGAPIENTRY glutMultiEntryFunc( void (* callback)(int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiEntryFunc" ); - SET_CALLBACK( MultiEntry ); -} - -/* - * Sets the multi-pointer button callback for the current window - */ -void FGAPIENTRY glutMultiButtonFunc( void (* callback)(int, int, int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiButtonFunc" ); - SET_CALLBACK( MultiButton ); -} - -/* - * Sets the multi-pointer motion callback for the current window - */ -void FGAPIENTRY glutMultiMotionFunc( void (* callback)(int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiMotionFunc" ); - SET_CALLBACK( MultiMotion ); -} - -/* - * Sets the multi-pointer passive motion callback for the current window - */ -void FGAPIENTRY glutMultiPassiveFunc( void (* callback)(int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiPassiveFunc" ); - SET_CALLBACK( MultiPassive ); -} - -/* - * Sets the context reload callback for the current window - */ -void FGAPIENTRY glutFixMyNameInitContextFunc( void (* callback)() ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFixMyNameInitContextFunc" ); - SET_CALLBACK( FixMyNameInitContext ); -} - -/* - * Sets the pause callback for the current window - */ -void FGAPIENTRY glutFixMyNamePauseFunc( void (* callback)() ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFixMyNamePauseFunc" ); - SET_CALLBACK( FixMyNamePause ); -} - -/* - * Sets the resume callback for the current window - */ -void FGAPIENTRY glutFixMyNameResumeFunc( void (* callback)() ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFixMyNameResumeFunc" ); - SET_CALLBACK( FixMyNameResume ); -} - /*** END OF FILE ***/