Adding a Frequently Asked Questions file
[freeglut] / src / freeglut_ext.c
index cf2f4f9..a1d6f59 100644 (file)
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
 #define GLX_GLXEXT_PROTOTYPES
-
 #include <GL/freeglut.h>
 #include "freeglut_internal.h"
 
-
-struct name_address_pair
+static GLUTproc fghGetProcAddress( const char* procName )
 {
-    const char *name;
-    void *address;
-};
+    /* optimization: quick initial check */
+    if( strncmp( procName, "glut", 4 ) != 0 )
+        return NULL;
 
-static struct name_address_pair glut_functions[] =
-{
-   { "glutInit", (void *) glutInit },
-   { "glutInitDisplayMode", (void *) glutInitDisplayMode },
-   { "glutInitDisplayString", (void *) glutInitDisplayString },
-   { "glutInitWindowPosition", (void *) glutInitWindowPosition },
-   { "glutInitWindowSize", (void *) glutInitWindowSize },
-   { "glutMainLoop", (void *) glutMainLoop },
-   { "glutCreateWindow", (void *) glutCreateWindow },
-   { "glutCreateSubWindow", (void *) glutCreateSubWindow },
-   { "glutDestroyWindow", (void *) glutDestroyWindow },
-   { "glutPostRedisplay", (void *) glutPostRedisplay },
-   { "glutPostWindowRedisplay", (void *) glutPostWindowRedisplay },
-   { "glutSwapBuffers", (void *) glutSwapBuffers },
-   { "glutGetWindow", (void *) glutGetWindow },
-   { "glutSetWindow", (void *) glutSetWindow },
-   { "glutSetWindowTitle", (void *) glutSetWindowTitle },
-   { "glutSetIconTitle", (void *) glutSetIconTitle },
-   { "glutPositionWindow", (void *) glutPositionWindow },
-   { "glutReshapeWindow", (void *) glutReshapeWindow },
-   { "glutPopWindow", (void *) glutPopWindow },
-   { "glutPushWindow", (void *) glutPushWindow },
-   { "glutIconifyWindow", (void *) glutIconifyWindow },
-   { "glutShowWindow", (void *) glutShowWindow },
-   { "glutHideWindow", (void *) glutHideWindow },
-   { "glutFullScreen", (void *) glutFullScreen },
-   { "glutSetCursor", (void *) glutSetCursor },
-   { "glutWarpPointer", (void *) glutWarpPointer },
-   { "glutEstablishOverlay", (void *) glutEstablishOverlay },
-   { "glutRemoveOverlay", (void *) glutRemoveOverlay },
-   { "glutUseLayer", (void *) glutUseLayer },
-   { "glutPostOverlayRedisplay", (void *) glutPostOverlayRedisplay },
-   { "glutPostWindowOverlayRedisplay", (void *) glutPostWindowOverlayRedisplay },
-   { "glutShowOverlay", (void *) glutShowOverlay },
-   { "glutHideOverlay", (void *) glutHideOverlay },
-   { "glutCreateMenu", (void *) glutCreateMenu },
-   { "glutDestroyMenu", (void *) glutDestroyMenu },
-   { "glutGetMenu", (void *) glutGetMenu },
-   { "glutSetMenu", (void *) glutSetMenu },
-   { "glutAddMenuEntry", (void *) glutAddMenuEntry },
-   { "glutAddSubMenu", (void *) glutAddSubMenu },
-   { "glutChangeToMenuEntry", (void *) glutChangeToMenuEntry },
-   { "glutChangeToSubMenu", (void *) glutChangeToSubMenu },
-   { "glutRemoveMenuItem", (void *) glutRemoveMenuItem },
-   { "glutAttachMenu", (void *) glutAttachMenu },
-   { "glutDetachMenu", (void *) glutDetachMenu },
-   { "glutDisplayFunc", (void *) glutDisplayFunc },
-   { "glutReshapeFunc", (void *) glutReshapeFunc },
-   { "glutKeyboardFunc", (void *) glutKeyboardFunc },
-   { "glutMouseFunc", (void *) glutMouseFunc },
-   { "glutMotionFunc", (void *) glutMotionFunc },
-   { "glutPassiveMotionFunc", (void *) glutPassiveMotionFunc },
-   { "glutEntryFunc", (void *) glutEntryFunc },
-   { "glutVisibilityFunc", (void *) glutVisibilityFunc },
-   { "glutIdleFunc", (void *) glutIdleFunc },
-   { "glutTimerFunc", (void *) glutTimerFunc },
-   { "glutMenuStateFunc", (void *) glutMenuStateFunc },
-   { "glutSpecialFunc", (void *) glutSpecialFunc },
-   { "glutSpaceballMotionFunc", (void *) glutSpaceballMotionFunc },
-   { "glutSpaceballRotateFunc", (void *) glutSpaceballRotateFunc },
-   { "glutSpaceballButtonFunc", (void *) glutSpaceballButtonFunc },
-   { "glutButtonBoxFunc", (void *) glutButtonBoxFunc },
-   { "glutDialsFunc", (void *) glutDialsFunc },
-   { "glutTabletMotionFunc", (void *) glutTabletMotionFunc },
-   { "glutTabletButtonFunc", (void *) glutTabletButtonFunc },
-   { "glutMenuStatusFunc", (void *) glutMenuStatusFunc },
-   { "glutOverlayDisplayFunc", (void *) glutOverlayDisplayFunc },
-   { "glutWindowStatusFunc", (void *) glutWindowStatusFunc },
-   { "glutKeyboardUpFunc", (void *) glutKeyboardUpFunc },
-   { "glutSpecialUpFunc", (void *) glutSpecialUpFunc },
-#if !TARGET_HOST_WINCE
-   { "glutJoystickFunc", (void *) glutJoystickFunc },
-#endif //TARGET_HOST_WINCE
-   { "glutSetColor", (void *) glutSetColor },
-   { "glutGetColor", (void *) glutGetColor },
-   { "glutCopyColormap", (void *) glutCopyColormap },
-   { "glutGet", (void *) glutGet },
-   { "glutDeviceGet", (void *) glutDeviceGet },
-   { "glutExtensionSupported", (void *) glutExtensionSupported },
-   { "glutGetModifiers", (void *) glutGetModifiers },
-   { "glutLayerGet", (void *) glutLayerGet },
-   { "glutBitmapCharacter", (void *) glutBitmapCharacter },
-   { "glutBitmapWidth", (void *) glutBitmapWidth },
-   { "glutStrokeCharacter", (void *) glutStrokeCharacter },
-   { "glutStrokeWidth", (void *) glutStrokeWidth },
-   { "glutBitmapLength", (void *) glutBitmapLength },
-   { "glutStrokeLength", (void *) glutStrokeLength },
-   { "glutWireSphere", (void *) glutWireSphere },
-   { "glutSolidSphere", (void *) glutSolidSphere },
-   { "glutWireCone", (void *) glutWireCone },
-   { "glutSolidCone", (void *) glutSolidCone },
-   { "glutWireCube", (void *) glutWireCube },
-   { "glutSolidCube", (void *) glutSolidCube },
-   { "glutWireTorus", (void *) glutWireTorus },
-   { "glutSolidTorus", (void *) glutSolidTorus },
-   { "glutWireDodecahedron", (void *) glutWireDodecahedron },
-   { "glutSolidDodecahedron", (void *) glutSolidDodecahedron },
-   { "glutWireTeapot", (void *) glutWireTeapot },
-   { "glutSolidTeapot", (void *) glutSolidTeapot },
-   { "glutWireOctahedron", (void *) glutWireOctahedron },
-   { "glutSolidOctahedron", (void *) glutSolidOctahedron },
-   { "glutWireTetrahedron", (void *) glutWireTetrahedron },
-   { "glutSolidTetrahedron", (void *) glutSolidTetrahedron },
-   { "glutWireIcosahedron", (void *) glutWireIcosahedron },
-   { "glutSolidIcosahedron", (void *) glutSolidIcosahedron },
-   { "glutVideoResizeGet", (void *) glutVideoResizeGet },
-   { "glutSetupVideoResizing", (void *) glutSetupVideoResizing },
-   { "glutStopVideoResizing", (void *) glutStopVideoResizing },
-   { "glutVideoResize", (void *) glutVideoResize },
-   { "glutVideoPan", (void *) glutVideoPan },
-   { "glutReportErrors", (void *) glutReportErrors },
-   { "glutIgnoreKeyRepeat", (void *) glutIgnoreKeyRepeat },
-   { "glutSetKeyRepeat", (void *) glutSetKeyRepeat },
-#if !TARGET_HOST_WINCE
-   { "glutForceJoystickFunc", (void *) glutForceJoystickFunc },
-   { "glutGameModeString", (void *) glutGameModeString },
-   { "glutEnterGameMode", (void *) glutEnterGameMode },
-   { "glutLeaveGameMode", (void *) glutLeaveGameMode },
-   { "glutGameModeGet", (void *) glutGameModeGet },
-#endif //TARGET_HOST_WINCE
-   /* freeglut extensions */
-   { "glutMainLoopEvent", (void *) glutMainLoopEvent },
-   { "glutLeaveMainLoop", (void *) glutLeaveMainLoop },
-   { "glutCloseFunc", (void *) glutCloseFunc },
-   { "glutWMCloseFunc", (void *) glutWMCloseFunc },
-   { "glutMenuDestroyFunc", (void *) glutMenuDestroyFunc },
-   { "glutSetOption", (void *) glutSetOption },
-   { "glutSetWindowData", (void *) glutSetWindowData },
-   { "glutGetWindowData", (void *) glutGetWindowData },
-   { "glutSetMenuData", (void *) glutSetMenuData },
-   { "glutGetMenuData", (void *) glutGetMenuData },
-   { "glutBitmapHeight", (void *) glutBitmapHeight },
-   { "glutStrokeHeight", (void *) glutStrokeHeight },
-   { "glutBitmapString", (void *) glutBitmapString },
-   { "glutStrokeString", (void *) glutStrokeString },
-   { "glutWireRhombicDodecahedron", (void *) glutWireRhombicDodecahedron },
-   { "glutSolidRhombicDodecahedron", (void *) glutSolidRhombicDodecahedron },
-   { "glutWireSierpinskiSponge ", (void *) glutWireSierpinskiSponge },
-   { "glutSolidSierpinskiSponge ", (void *) glutSolidSierpinskiSponge },
-   { "glutGetProcAddress", (void *) glutGetProcAddress },
-   { "glutMouseWheelFunc", (void *) glutMouseWheelFunc },
-   { NULL, NULL }
-};
+#define CHECK_NAME(x) if( strcmp( procName, #x ) == 0) return (GLUTproc)x;
+    CHECK_NAME(glutInit);
+    CHECK_NAME(glutInitDisplayMode);
+    CHECK_NAME(glutInitDisplayString);
+    CHECK_NAME(glutInitWindowPosition);
+    CHECK_NAME(glutInitWindowSize);
+    CHECK_NAME(glutMainLoop);
+    CHECK_NAME(glutCreateWindow);
+    CHECK_NAME(glutCreateSubWindow);
+    CHECK_NAME(glutDestroyWindow);
+    CHECK_NAME(glutPostRedisplay);
+    CHECK_NAME(glutPostWindowRedisplay);
+    CHECK_NAME(glutSwapBuffers);
+    CHECK_NAME(glutGetWindow);
+    CHECK_NAME(glutSetWindow);
+    CHECK_NAME(glutSetWindowTitle);
+    CHECK_NAME(glutSetIconTitle);
+    CHECK_NAME(glutPositionWindow);
+    CHECK_NAME(glutReshapeWindow);
+    CHECK_NAME(glutPopWindow);
+    CHECK_NAME(glutPushWindow);
+    CHECK_NAME(glutIconifyWindow);
+    CHECK_NAME(glutShowWindow);
+    CHECK_NAME(glutHideWindow);
+    CHECK_NAME(glutFullScreen);
+    CHECK_NAME(glutSetCursor);
+    CHECK_NAME(glutWarpPointer);
+    CHECK_NAME(glutEstablishOverlay);
+    CHECK_NAME(glutRemoveOverlay);
+    CHECK_NAME(glutUseLayer);
+    CHECK_NAME(glutPostOverlayRedisplay);
+    CHECK_NAME(glutPostWindowOverlayRedisplay);
+    CHECK_NAME(glutShowOverlay);
+    CHECK_NAME(glutHideOverlay);
+    CHECK_NAME(glutCreateMenu);
+    CHECK_NAME(glutDestroyMenu);
+    CHECK_NAME(glutGetMenu);
+    CHECK_NAME(glutSetMenu);
+    CHECK_NAME(glutAddMenuEntry);
+    CHECK_NAME(glutAddSubMenu);
+    CHECK_NAME(glutChangeToMenuEntry);
+    CHECK_NAME(glutChangeToSubMenu);
+    CHECK_NAME(glutRemoveMenuItem);
+    CHECK_NAME(glutAttachMenu);
+    CHECK_NAME(glutDetachMenu);
+    CHECK_NAME(glutDisplayFunc);
+    CHECK_NAME(glutReshapeFunc);
+    CHECK_NAME(glutKeyboardFunc);
+    CHECK_NAME(glutMouseFunc);
+    CHECK_NAME(glutMotionFunc);
+    CHECK_NAME(glutPassiveMotionFunc);
+    CHECK_NAME(glutEntryFunc);
+    CHECK_NAME(glutVisibilityFunc);
+    CHECK_NAME(glutIdleFunc);
+    CHECK_NAME(glutTimerFunc);
+    CHECK_NAME(glutMenuStateFunc);
+    CHECK_NAME(glutSpecialFunc);
+    CHECK_NAME(glutSpaceballMotionFunc);
+    CHECK_NAME(glutSpaceballRotateFunc);
+    CHECK_NAME(glutSpaceballButtonFunc);
+    CHECK_NAME(glutButtonBoxFunc);
+    CHECK_NAME(glutDialsFunc);
+    CHECK_NAME(glutTabletMotionFunc);
+    CHECK_NAME(glutTabletButtonFunc);
+    CHECK_NAME(glutMenuStatusFunc);
+    CHECK_NAME(glutOverlayDisplayFunc);
+    CHECK_NAME(glutWindowStatusFunc);
+    CHECK_NAME(glutKeyboardUpFunc);
+    CHECK_NAME(glutSpecialUpFunc);
+#if !defined(_WIN32_WCE)
+    CHECK_NAME(glutJoystickFunc);
+#endif /* !defined(_WIN32_WCE) */
+    CHECK_NAME(glutSetColor);
+    CHECK_NAME(glutGetColor);
+    CHECK_NAME(glutCopyColormap);
+    CHECK_NAME(glutGet);
+    CHECK_NAME(glutDeviceGet);
+    CHECK_NAME(glutExtensionSupported);
+    CHECK_NAME(glutGetModifiers);
+    CHECK_NAME(glutLayerGet);
+    CHECK_NAME(glutBitmapCharacter);
+    CHECK_NAME(glutBitmapWidth);
+    CHECK_NAME(glutStrokeCharacter);
+    CHECK_NAME(glutStrokeWidth);
+    CHECK_NAME(glutBitmapLength);
+    CHECK_NAME(glutStrokeLength);
+    CHECK_NAME(glutWireSphere);
+    CHECK_NAME(glutSolidSphere);
+    CHECK_NAME(glutWireCone);
+    CHECK_NAME(glutSolidCone);
+    CHECK_NAME(glutWireCube);
+    CHECK_NAME(glutSolidCube);
+    CHECK_NAME(glutWireTorus);
+    CHECK_NAME(glutSolidTorus);
+    CHECK_NAME(glutWireDodecahedron);
+    CHECK_NAME(glutSolidDodecahedron);
+    CHECK_NAME(glutWireTeapot);
+    CHECK_NAME(glutSolidTeapot);
+    CHECK_NAME(glutWireOctahedron);
+    CHECK_NAME(glutSolidOctahedron);
+    CHECK_NAME(glutWireTetrahedron);
+    CHECK_NAME(glutSolidTetrahedron);
+    CHECK_NAME(glutWireIcosahedron);
+    CHECK_NAME(glutSolidIcosahedron);
+    CHECK_NAME(glutVideoResizeGet);
+    CHECK_NAME(glutSetupVideoResizing);
+    CHECK_NAME(glutStopVideoResizing);
+    CHECK_NAME(glutVideoResize);
+    CHECK_NAME(glutVideoPan);
+    CHECK_NAME(glutReportErrors);
+    CHECK_NAME(glutIgnoreKeyRepeat);
+    CHECK_NAME(glutSetKeyRepeat);
+#if !defined(_WIN32_WCE)
+    CHECK_NAME(glutForceJoystickFunc);
+    CHECK_NAME(glutGameModeString);
+    CHECK_NAME(glutEnterGameMode);
+    CHECK_NAME(glutLeaveGameMode);
+    CHECK_NAME(glutGameModeGet);
+#endif /* !defined(_WIN32_WCE) */
+    /* freeglut extensions */
+    CHECK_NAME(glutMainLoopEvent);
+    CHECK_NAME(glutLeaveMainLoop);
+    CHECK_NAME(glutCloseFunc);
+    CHECK_NAME(glutWMCloseFunc);
+    CHECK_NAME(glutMenuDestroyFunc);
+    CHECK_NAME(glutSetOption);
+    CHECK_NAME(glutSetWindowData);
+    CHECK_NAME(glutGetWindowData);
+    CHECK_NAME(glutSetMenuData);
+    CHECK_NAME(glutGetMenuData);
+    CHECK_NAME(glutBitmapHeight);
+    CHECK_NAME(glutStrokeHeight);
+    CHECK_NAME(glutBitmapString);
+    CHECK_NAME(glutStrokeString);
+    CHECK_NAME(glutWireRhombicDodecahedron);
+    CHECK_NAME(glutSolidRhombicDodecahedron);
+    CHECK_NAME(glutWireSierpinskiSponge);
+    CHECK_NAME(glutSolidSierpinskiSponge);
+    CHECK_NAME(glutWireCylinder);
+    CHECK_NAME(glutSolidCylinder);
+    CHECK_NAME(glutGetProcAddress);
+    CHECK_NAME(glutMouseWheelFunc);
+    CHECK_NAME(glutJoystickGetNumAxes);
+    CHECK_NAME(glutJoystickGetNumButtons);
+    CHECK_NAME(glutJoystickNotWorking);
+    CHECK_NAME(glutJoystickGetDeadBand);
+    CHECK_NAME(glutJoystickSetDeadBand);
+    CHECK_NAME(glutJoystickGetSaturation);
+    CHECK_NAME(glutJoystickSetSaturation);
+    CHECK_NAME(glutJoystickSetMinRange);
+    CHECK_NAME(glutJoystickSetMaxRange);
+    CHECK_NAME(glutJoystickSetCenter);
+    CHECK_NAME(glutJoystickGetMinRange);
+    CHECK_NAME(glutJoystickGetMaxRange);
+    CHECK_NAME(glutJoystickGetCenter);
+#undef CHECK_NAME
 
+    return NULL;
+}
 
-void *FGAPIENTRY glutGetProcAddress( const char *procName )
+
+GLUTproc FGAPIENTRY
+glutGetProcAddress( const char *procName )
 {
+    GLUTproc p;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetProcAddress" );
+
     /* Try GLUT functions first */
-    int i;
-    for( i = 0; glut_functions[ i ].name; i++ )
-        if( strcmp( glut_functions[ i ].name, procName ) == 0)
-            return glut_functions[ i ].address;
+    p = fghGetProcAddress( procName );
+    if( p != NULL )
+        return p;
 
     /* Try core GL functions */
-#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE
-    return( void * )wglGetProcAddress( ( LPCSTR )procName );
-#elif TARGET_HOST_UNIX_X11 && defined( GLX_ARB_get_proc_address )
-    return(void * )glXGetProcAddressARB( ( const GLubyte * )procName );
+#if TARGET_HOST_MS_WINDOWS
+    return(GLUTproc)wglGetProcAddress( ( LPCSTR )procName );
+#elif TARGET_HOST_POSIX_X11 && defined( GLX_ARB_get_proc_address )
+    return(GLUTproc)glXGetProcAddressARB( ( const GLubyte * )procName );
 #else
     return NULL;
 #endif