X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffg_callbacks.c;h=11924b360cd54e9a489043ebdbebd40fed599dca;hb=2c12c9eb8d63cabac2d4113b4f54fdf53da8368c;hp=0b5e18500c00a8093869c53e71085631e1074ab1;hpb=37731b469087d35ce8be6bd2cff95a77c6f4277e;p=freeglut diff --git a/src/fg_callbacks.c b/src/fg_callbacks.c index 0b5e185..11924b3 100644 --- a/src/fg_callbacks.c +++ b/src/fg_callbacks.c @@ -1,5 +1,5 @@ /* - * freeglut_callbacks.c + * fg_callbacks.c * * The callbacks setting methods. * @@ -63,6 +63,7 @@ void FGAPIENTRY glutTimerFunc( unsigned int timeOut, FGCBTimer callback, int tim 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 ) @@ -115,39 +116,37 @@ do \ #define IMPLEMENT_CALLBACK_FUNC_2NAME(a,b) \ void FGAPIENTRY glut##a##Func( FGCB##b callback ) \ { \ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glut"###a##"Func" ); \ + 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); +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); +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(AppStatus) @@ -163,19 +162,50 @@ void FGAPIENTRY glutDisplayFunc( FGCBDisplay callback ) SET_CALLBACK( Display ); } +void fghDefaultReshape(int width, int height) +{ + glViewport( 0, 0, width, height ); +} + +void FGAPIENTRY glutReshapeFunc( FGCBReshape callback ) +{ + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReshapeFunc" ); + + if( !callback ) + callback = fghDefaultReshape; + + SET_CALLBACK( Reshape ); +} + /* * Sets the Visibility callback for the current window. + * NB: the Visibility func is deprecated in favor of the WindowStatus func, + * which provides more detail. The visibility func callback is implemented + * as a translation step from the windowStatus func. When the user sets the + * windowStatus func, any visibility func is overwritten. + * DEVELOPER NOTE: in the library, only invoke the window status func, this + * gets automatically translated to the visibility func if thats what the + * user has set. + * window status is kind of anemic on win32 as there are no window messages + * to notify us that the window is covered by other windows or not. + * Should one want to query this, see + * http://stackoverflow.com/questions/5445889/get-which-process-window-is-actually-visible-in-c-sharp + * for an implementation outline (but it would be polling based, not push based). */ 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( FGCBVisibility callback ) @@ -197,23 +227,32 @@ void FGAPIENTRY glutJoystickFunc( FGCBJoystick callback, int pollInterval ) FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickFunc" ); fgInitialiseJoysticks (); - if ( ( ( fgStructure.CurrentWindow->State.JoystickPollRate < 0 ) || - !FETCH_WCB(*fgStructure.CurrentWindow,Joystick) ) && /* Joystick callback was disabled */ - ( callback && ( pollInterval >= 0 ) ) ) /* but is now enabled */ + if ( ( + fgStructure.CurrentWindow->State.JoystickPollRate <= 0 || /* Joystick callback was disabled */ + !FETCH_WCB(*fgStructure.CurrentWindow,Joystick) + ) && + ( + callback && ( pollInterval > 0 ) /* but is now enabled */ + ) ) ++fgState.NumActiveJoysticks; - else if ( ( ( fgStructure.CurrentWindow->State.JoystickPollRate >= 0 ) && - FETCH_WCB(*fgStructure.CurrentWindow,Joystick) ) && /* Joystick callback was enabled */ - ( !callback || ( pollInterval < 0 ) ) ) /* but is now disabled */ + else if ( ( + fgStructure.CurrentWindow->State.JoystickPollRate > 0 && /* Joystick callback was enabled */ + FETCH_WCB(*fgStructure.CurrentWindow,Joystick) + ) && + ( + !callback || ( pollInterval <= 0 ) /* but is now disabled */ + ) ) --fgState.NumActiveJoysticks; SET_CALLBACK( Joystick ); fgStructure.CurrentWindow->State.JoystickPollRate = pollInterval; - fgStructure.CurrentWindow->State.JoystickLastPoll = - fgElapsedTime() - fgStructure.CurrentWindow->State.JoystickPollRate; - - if( fgStructure.CurrentWindow->State.JoystickLastPoll < 0 ) + /* set last poll time such that joystick will be polled asap */ + fgStructure.CurrentWindow->State.JoystickLastPoll = fgElapsedTime(); + if (fgStructure.CurrentWindow->State.JoystickLastPoll < pollInterval) fgStructure.CurrentWindow->State.JoystickLastPoll = 0; + else + fgStructure.CurrentWindow->State.JoystickLastPoll -= pollInterval; }