+/* 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 );
+}
+