-/* Freeglut callbacks type definitions */
-typedef void (* FGCBDisplay )( void );
-typedef void (* FGCBReshape )( int, int );
-typedef void (* FGCBVisibility )( int );
-typedef void (* FGCBKeyboard )( unsigned char, int, int );
-typedef void (* FGCBSpecial )( int, int, int );
-typedef void (* FGCBMouse )( int, int, int, int );
-typedef void (* FGCBMouseWheel )( int, int, int, int );
-typedef void (* FGCBMotion )( int, int );
-typedef void (* FGCBPassive )( int, int );
-typedef void (* FGCBEntry )( int );
-typedef void (* FGCBWindowStatus )( int );
-typedef void (* FGCBSelect )( int, int, int );
-typedef void (* FGCBJoystick )( unsigned int, int, int, int );
-typedef void (* FGCBKeyboardUp )( unsigned char, int, int );
-typedef void (* FGCBSpecialUp )( int, int, int );
-typedef void (* FGCBOverlayDisplay)( void );
-typedef void (* FGCBSpaceMotion )( int, int, int );
-typedef void (* FGCBSpaceRotation )( int, int, int );
-typedef void (* FGCBSpaceButton )( int, int );
-typedef void (* FGCBDials )( int, int );
-typedef void (* FGCBButtonBox )( int, int );
-typedef void (* FGCBTabletMotion )( int, int );
-typedef void (* FGCBTabletButton )( int, int, int, int );
-typedef void (* FGCBDestroy )( void );
-
-typedef void (* FGCBMultiEntry )( int, int );
-typedef void (* FGCBMultiButton )( int, int, int, int, int );
-typedef void (* FGCBMultiMotion )( int, int, int );
-typedef void (* FGCBMultiPassive )( int, int, int );
-
-typedef void (* FGCBFixMyNameInitContext)();
-typedef void (* FGCBFixMyNamePause)();
-typedef void (* FGCBFixMyNameResume)();
+/*
+ * Freeglut callbacks type definitions
+ *
+ * If anything here is modified or added, update fg_callback_macros.h functions.
+ *
+ * This is not ideal, but freeglut needs to either define minimal compiler specs,
+ * or update header every time this is changed or updated.
+ */
+typedef void* FGCBUserData;
+
+typedef void (* FGCBDisplay )( void );
+typedef void (* FGCBDisplayUC )( FGCBUserData );
+typedef void (* FGCBReshape )( int, int );
+typedef void (* FGCBReshapeUC )( int, int, FGCBUserData );
+typedef void (* FGCBPosition )( int, int );
+typedef void (* FGCBPositionUC )( int, int, FGCBUserData );
+typedef void (* FGCBVisibility )( int );
+typedef void (* FGCBVisibilityUC )( int, FGCBUserData );
+typedef void (* FGCBKeyboard )( unsigned char, int, int );
+typedef void (* FGCBKeyboardUC )( unsigned char, int, int, FGCBUserData );
+typedef void (* FGCBKeyboardUp )( unsigned char, int, int );
+typedef void (* FGCBKeyboardUpUC )( unsigned char, int, int, FGCBUserData );
+typedef void (* FGCBSpecial )( int, int, int );
+typedef void (* FGCBSpecialUC )( int, int, int, FGCBUserData );
+typedef void (* FGCBSpecialUp )( int, int, int );
+typedef void (* FGCBSpecialUpUC )( int, int, int, FGCBUserData );
+typedef void (* FGCBMouse )( int, int, int, int );
+typedef void (* FGCBMouseUC )( int, int, int, int, FGCBUserData );
+typedef void (* FGCBMouseWheel )( int, int, int, int );
+typedef void (* FGCBMouseWheelUC )( int, int, int, int, FGCBUserData );
+typedef void (* FGCBMotion )( int, int );
+typedef void (* FGCBMotionUC )( int, int, FGCBUserData );
+typedef void (* FGCBPassive )( int, int );
+typedef void (* FGCBPassiveUC )( int, int, FGCBUserData );
+typedef void (* FGCBEntry )( int );
+typedef void (* FGCBEntryUC )( int, FGCBUserData );
+typedef void (* FGCBWindowStatus )( int );
+typedef void (* FGCBWindowStatusUC )( int, FGCBUserData );
+typedef void (* FGCBJoystick )( unsigned int, int, int, int );
+typedef void (* FGCBJoystickUC )( unsigned int, int, int, int, FGCBUserData );
+typedef void (* FGCBOverlayDisplay )( void );
+typedef void (* FGCBOverlayDisplayUC)( FGCBUserData );
+typedef void (* FGCBSpaceMotion )( int, int, int );
+typedef void (* FGCBSpaceMotionUC )( int, int, int, FGCBUserData );
+typedef void (* FGCBSpaceRotation )( int, int, int );
+typedef void (* FGCBSpaceRotationUC )( int, int, int, FGCBUserData );
+typedef void (* FGCBSpaceButton )( int, int );
+typedef void (* FGCBSpaceButtonUC )( int, int, FGCBUserData );
+typedef void (* FGCBDials )( int, int );
+typedef void (* FGCBDialsUC )( int, int, FGCBUserData );
+typedef void (* FGCBButtonBox )( int, int );
+typedef void (* FGCBButtonBoxUC )( int, int, FGCBUserData );
+typedef void (* FGCBTabletMotion )( int, int );
+typedef void (* FGCBTabletMotionUC )( int, int, FGCBUserData );
+typedef void (* FGCBTabletButton )( int, int, int, int );
+typedef void (* FGCBTabletButtonUC )( int, int, int, int, FGCBUserData );
+typedef void (* FGCBDestroy )( void ); /* Used for both window and menu destroy callbacks */
+typedef void (* FGCBDestroyUC )( FGCBUserData );
+
+typedef void (* FGCBMultiEntry )( int, int );
+typedef void (* FGCBMultiEntryUC )( int, int, FGCBUserData );
+typedef void (* FGCBMultiButton )( int, int, int, int, int );
+typedef void (* FGCBMultiButtonUC )( int, int, int, int, int, FGCBUserData );
+typedef void (* FGCBMultiMotion )( int, int, int );
+typedef void (* FGCBMultiMotionUC )( int, int, int, FGCBUserData );
+typedef void (* FGCBMultiPassive )( int, int, int );
+typedef void (* FGCBMultiPassiveUC )( int, int, int, FGCBUserData );
+
+typedef void (* FGCBInitContext )( void );
+typedef void (* FGCBInitContextUC )( FGCBUserData );
+typedef void (* FGCBAppStatus )( int );
+typedef void (* FGCBAppStatusUC )( int, FGCBUserData );