Finished off most of the issues with freeglut_structure.c, from a stylistic
[freeglut] / src / freeglut_callbacks.c
index b741a0c..f395716 100644 (file)
  */
 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");
     SET_CALLBACK( Display );
+    fgStructure.Window->State.Redisplay = TRUE;
 }
 
 /*
@@ -81,10 +85,6 @@ 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;
 }
 
@@ -97,37 +97,24 @@ void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ), i
 
     freeglut_assert_ready;
 
-    /*
-     * Create a new freeglut timer hook structure
-     */
-    timer = calloc( sizeof(SFG_Timer), 1 );
+    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
-     */
     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 );
 }
 
 /*
  * 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 )
 {
-    freeglut_assert_ready; freeglut_return_if_fail( fgStructure.Window != NULL );
+    freeglut_assert_ready;
+    freeglut_return_if_fail( fgStructure.Window != NULL );
     freeglut_return_if_fail( fgStructure.Window->Callbacks.Visibility != NULL );
 
     if( status == GLUT_HIDDEN  || status == GLUT_FULLY_COVERED )
@@ -168,17 +155,8 @@ void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) )
 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;
 
@@ -195,7 +173,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 ) )
 {
@@ -203,7 +190,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 ) )
 {
@@ -234,7 +222,8 @@ void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) )
 /* A. Donev: Destruction callback for menus */
 void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) )
 {
-   if( fgStructure.Menu == NULL ) return;
+   if( fgStructure.Menu == NULL )
+     return;
    fgStructure.Menu->Destroy = callback;
 }
 
@@ -244,7 +233,6 @@ void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) )
 void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) )
 {
     freeglut_assert_ready;
-
     fgState.MenuStateCallback = callback;
 }
 
@@ -254,7 +242,6 @@ void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) )
 void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) )
 {
     freeglut_assert_ready;
-
     fgState.MenuStatusCallback = callback;
 }