Added API macros for Spaceball buttons.
[freeglut] / include / GL / freeglut_std.h
index 62c6fcd..5ffc5a0 100644 (file)
 /*
  * Under windows, we have to differentiate between static and dynamic libraries
  */
-#if defined(WIN32)
-#    include <windows.h>
-#    include <windowsx.h>
-#    include <mmsystem.h>
-#    define WINDOWS
-#ifdef FREEGLUT_STATIC
-#    define FGAPI
-#    define FGAPIENTRY
-
-#    pragma comment (lib, "freeglut_static.lib")    /* link with Win32 static freeglut lib */
+#ifdef _WIN32
+/* #pragma may not be supported by some compilers.
+ * Discussion by FreeGLUT developers suggests that
+ * Visual C++ specific code involving pragmas may
+ * need to move to a separate header.  24th Dec 2003
+ */
+
+/* Define FREEGLUT_LIB_PRAGMAS to 1 to include library
+ * pragmas or to 0 to exclude library pragmas.
+ * The default behavior depends on the compiler/platform.
+ */
+#   ifndef FREEGLUT_LIB_PRAGMAS
+#       if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(_WIN32_WCE)
+#           define FREEGLUT_LIB_PRAGMAS 1
+#       else
+#           define FREEGLUT_LIB_PRAGMAS 0
+#       endif
+#   endif
+
+#  ifndef WIN32_LEAN_AND_MEAN
+#    define WIN32_LEAN_AND_MEAN 1
+#  endif
+#  ifndef NOMINMAX
+#    define NOMINMAX
+#  endif
+#   include <windows.h>
+
+/* Windows static library */
+#   ifdef FREEGLUT_STATIC
+
+#       define FGAPI
+#       define FGAPIENTRY
+
+        /* Link with Win32 static freeglut lib */
+#       if FREEGLUT_LIB_PRAGMAS
+#           ifdef NDEBUG
+#              pragma comment (lib, "freeglut_static.lib")
+#           else
+#              pragma comment (lib, "freeglut_staticd.lib")
+#           endif
+#       endif
+
+/* Windows shared library (DLL) */
+#   else
+
+#       define FGAPIENTRY __stdcall
+#       if defined(FREEGLUT_EXPORTS)
+#           define FGAPI __declspec(dllexport)
+#       else
+#           define FGAPI __declspec(dllimport)
+
+            /* Link with Win32 shared freeglut lib */
+#           if FREEGLUT_LIB_PRAGMAS
+#               ifdef NDEBUG
+#                   pragma comment (lib, "freeglut.lib")
+#               else
+#                   pragma comment (lib, "freeglutd.lib")
+#               endif
+#           endif
+
+#       endif
+
+#   endif
+
+/* Drag in other Windows libraries as required by FreeGLUT */
+#   if FREEGLUT_LIB_PRAGMAS
+#       pragma comment (lib, "glu32.lib")    /* link OpenGL Utility lib     */
+#       pragma comment (lib, "opengl32.lib") /* link Microsoft OpenGL lib   */
+#       pragma comment (lib, "gdi32.lib")    /* link Windows GDI lib        */
+#       pragma comment (lib, "winmm.lib")    /* link Windows MultiMedia lib */
+#       pragma comment (lib, "user32.lib")   /* link Windows user lib       */
+#   endif
 
 #else
 
-#      if defined(FREEGLUT_EXPORTS)
-#              define FGAPI __declspec(dllexport)
-/* #           define FGAPI */
-#      else
-#              define FGAPI __declspec(dllimport)
-#   pragma comment (lib, "freeglut.lib")    /* link with Win32 freeglut lib */
-#      endif
-#      define FGAPIENTRY __stdcall
+/* Non-Windows definition of FGAPI and FGAPIENTRY  */
+#        define FGAPI
+#        define FGAPIENTRY
 
 #endif
 
-#pragma comment (lib, "winmm.lib")       /* link with Windows MultiMedia lib */
-#pragma comment (lib, "user32.lib") /* link with Windows user lib */
-#pragma comment (lib, "gdi32.lib") /* link with Windows GDI lib */
-#pragma comment (lib, "opengl32.lib")    /* link with Microsoft OpenGL lib */
-#pragma comment (lib, "glu32.lib")       /* link with OpenGL Utility lib */
-
-
-#else
-#      define FGAPI
-#      define FGAPIENTRY
-#endif
-
 /*
  * The freeglut and GLUT API versions
  */
 #define  FREEGLUT             1
 #define  GLUT_API_VERSION     4
+#define  GLUT_XLIB_IMPLEMENTATION 13
+/* Deprecated:
+   cf. http://sourceforge.net/mailarchive/forum.php?thread_name=CABcAi1hw7cr4xtigckaGXB5X8wddLfMcbA_rZ3NAuwMrX_zmsw%40mail.gmail.com&forum_name=freeglut-developer */
 #define  FREEGLUT_VERSION_2_0 1
 
 /*
  * Always include OpenGL and GLU headers
  */
-#include <GL/gl.h>
-#include <GL/glu.h>
+/* Note: FREEGLUT_GLES is only used to cleanly bootstrap headers
+   inclusion here; use GLES constants directly
+   (e.g. GL_ES_VERSION_2_0) for all other needs */
+#ifdef FREEGLUT_GLES
+#   include <EGL/egl.h>
+#   include <GLES/gl.h>
+#   include <GLES2/gl2.h>
+#elif __APPLE__
+#   include <OpenGL/gl.h>
+#   include <OpenGL/glu.h>
+#else
+#   include <GL/gl.h>
+#   include <GL/glu.h>
+#endif
 
 /*
  * GLUT API macro definitions -- the special key codes:
  *
  * Steve Baker suggested to make it binary compatible with GLUT:
  */
-#if defined(WIN32)
+#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__WATCOMC__)
 #   define  GLUT_STROKE_ROMAN               ((void *)0x0000)
 #   define  GLUT_STROKE_MONO_ROMAN          ((void *)0x0001)
 #   define  GLUT_BITMAP_9_BY_15             ((void *)0x0002)
 #define  GLUT_INIT_DISPLAY_MODE             0x01F8
 #define  GLUT_ELAPSED_TIME                  0x02BC
 #define  GLUT_WINDOW_FORMAT_ID              0x007B
-#define  GLUT_INIT_STATE                    0x007C
 
 /*
  * GLUT API macro definitions -- the glutDeviceGet parameters
 #define  GLUT_GAME_MODE_DISPLAY_CHANGED     0x0006
 
 /*
+ * GLUT API macro definitions -- Spaceball button definitions
+ */
+
+#define  GLUT_SPACEBALL_BUTTON_A            0x0001
+#define  GLUT_SPACEBALL_BUTTON_B            0x0002
+
+/*
  * Initialization functions, see fglut_init.c
  */
 FGAPI void    FGAPIENTRY glutInit( int* pargc, char** argv );
@@ -358,12 +424,12 @@ FGAPI void    FGAPIENTRY glutInitDisplayMode( unsigned int displayMode );
 FGAPI void    FGAPIENTRY glutInitDisplayString( const char* displayMode );
 
 /*
- * Process loop function, see freeglut_main.c
+ * Process loop function, see fg_main.c
  */
 FGAPI void    FGAPIENTRY glutMainLoop( void );
 
 /*
- * Window management functions, see freeglut_window.c
+ * Window management functions, see fg_window.c
  */
 FGAPI int     FGAPIENTRY glutCreateWindow( const char* title );
 FGAPI int     FGAPIENTRY glutCreateSubWindow( int window, int x, int y, int width, int height );
@@ -382,20 +448,20 @@ FGAPI void    FGAPIENTRY glutPopWindow( void );
 FGAPI void    FGAPIENTRY glutFullScreen( void );
 
 /*
- * Display-connected functions, see freeglut_display.c
+ * Display-related functions, see fg_display.c
  */
 FGAPI void    FGAPIENTRY glutPostWindowRedisplay( int window );
 FGAPI void    FGAPIENTRY glutPostRedisplay( void );
 FGAPI void    FGAPIENTRY glutSwapBuffers( void );
 
 /*
- * Mouse cursor functions, see freeglut_cursor.c
+ * Mouse cursor functions, see fg_cursor.c
  */
 FGAPI void    FGAPIENTRY glutWarpPointer( int x, int y );
 FGAPI void    FGAPIENTRY glutSetCursor( int cursor );
 
 /*
- * Overlay stuff, see freeglut_overlay.c
+ * Overlay stuff, see fg_overlay.c
  */
 FGAPI void    FGAPIENTRY glutEstablishOverlay( void );
 FGAPI void    FGAPIENTRY glutRemoveOverlay( void );
@@ -406,7 +472,7 @@ FGAPI void    FGAPIENTRY glutShowOverlay( void );
 FGAPI void    FGAPIENTRY glutHideOverlay( void );
 
 /*
- * Menu stuff, see freeglut_menu.c
+ * Menu stuff, see fg_menu.c
  */
 FGAPI int     FGAPIENTRY glutCreateMenu( void (* callback)( int menu ) );
 FGAPI void    FGAPIENTRY glutDestroyMenu( int menu );
@@ -421,13 +487,13 @@ FGAPI void    FGAPIENTRY glutAttachMenu( int button );
 FGAPI void    FGAPIENTRY glutDetachMenu( int button );
 
 /*
- * Global callback functions, see freeglut_callbacks.c
+ * Global callback functions, see fg_callbacks.c
  */
 FGAPI void    FGAPIENTRY glutTimerFunc( unsigned int time, void (* callback)( int ), int value );
 FGAPI void    FGAPIENTRY glutIdleFunc( void (* callback)( void ) );
 
 /*
- * Window-specific callback functions, see freeglut_callbacks.c
+ * Window-specific callback functions, see fg_callbacks.c
  */
 FGAPI void    FGAPIENTRY glutKeyboardFunc( void (* callback)( unsigned char, int, int ) );
 FGAPI void    FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) );
@@ -456,7 +522,7 @@ FGAPI void    FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) );
 FGAPI void    FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) );
 
 /*
- * State setting and retrieval functions, see freeglut_state.c
+ * State setting and retrieval functions, see fg_state.c
  */
 FGAPI int     FGAPIENTRY glutGet( GLenum query );
 FGAPI int     FGAPIENTRY glutDeviceGet( GLenum query );
@@ -464,27 +530,29 @@ FGAPI int     FGAPIENTRY glutGetModifiers( void );
 FGAPI int     FGAPIENTRY glutLayerGet( GLenum query );
 
 /*
- * Font stuff, see freeglut_font.c
+ * Font stuff, see fg_font.c
  */
 FGAPI void    FGAPIENTRY glutBitmapCharacter( void* font, int character );
 FGAPI int     FGAPIENTRY glutBitmapWidth( void* font, int character );
 FGAPI void    FGAPIENTRY glutStrokeCharacter( void* font, int character );
 FGAPI int     FGAPIENTRY glutStrokeWidth( void* font, int character );
+FGAPI GLfloat FGAPIENTRY glutStrokeWidthf( void* font, int character ); /* GLUT 3.8 */
 FGAPI int     FGAPIENTRY glutBitmapLength( void* font, const unsigned char* string );
 FGAPI int     FGAPIENTRY glutStrokeLength( void* font, const unsigned char* string );
+FGAPI GLfloat FGAPIENTRY glutStrokeLengthf( void* font, const unsigned char *string ); /* GLUT 3.8 */
 
 /*
- * Geometry functions, see freeglut_geometry.c
+ * Geometry functions, see fg_geometry.c
  */
-FGAPI void    FGAPIENTRY glutWireCube( GLdouble size );
-FGAPI void    FGAPIENTRY glutSolidCube( GLdouble size );
-FGAPI void    FGAPIENTRY glutWireSphere( GLdouble radius, GLint slices, GLint stacks );
-FGAPI void    FGAPIENTRY glutSolidSphere( GLdouble radius, GLint slices, GLint stacks );
-FGAPI void    FGAPIENTRY glutWireCone( GLdouble base, GLdouble height, GLint slices, GLint stacks );
-FGAPI void    FGAPIENTRY glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks );
 
-FGAPI void    FGAPIENTRY glutWireTorus( GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings );
-FGAPI void    FGAPIENTRY glutSolidTorus( GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings );
+FGAPI void    FGAPIENTRY glutWireCube( double size );
+FGAPI void    FGAPIENTRY glutSolidCube( double size );
+FGAPI void    FGAPIENTRY glutWireSphere( double radius, GLint slices, GLint stacks );
+FGAPI void    FGAPIENTRY glutSolidSphere( double radius, GLint slices, GLint stacks );
+FGAPI void    FGAPIENTRY glutWireCone( double base, double height, GLint slices, GLint stacks );
+FGAPI void    FGAPIENTRY glutSolidCone( double base, double height, GLint slices, GLint stacks );
+FGAPI void    FGAPIENTRY glutWireTorus( double innerRadius, double outerRadius, GLint sides, GLint rings );
+FGAPI void    FGAPIENTRY glutSolidTorus( double innerRadius, double outerRadius, GLint sides, GLint rings );
 FGAPI void    FGAPIENTRY glutWireDodecahedron( void );
 FGAPI void    FGAPIENTRY glutSolidDodecahedron( void );
 FGAPI void    FGAPIENTRY glutWireOctahedron( void );
@@ -495,13 +563,14 @@ FGAPI void    FGAPIENTRY glutWireIcosahedron( void );
 FGAPI void    FGAPIENTRY glutSolidIcosahedron( void );
 
 /*
- * Teapot rendering functions, found in freeglut_teapot.c
+ * Teapot rendering functions, found in fg_teapot.c
+ * NB: front facing polygons have clockwise winding, not counter clockwise
  */
-FGAPI void    FGAPIENTRY glutWireTeapot( GLdouble size );
-FGAPI void    FGAPIENTRY glutSolidTeapot( GLdouble size );
+FGAPI void    FGAPIENTRY glutWireTeapot( double size );
+FGAPI void    FGAPIENTRY glutSolidTeapot( double size );
 
 /*
- * Game mode functions, see freeglut_gamemode.c
+ * Game mode functions, see fg_gamemode.c
  */
 FGAPI void    FGAPIENTRY glutGameModeString( const char* string );
 FGAPI int     FGAPIENTRY glutEnterGameMode( void );
@@ -509,7 +578,7 @@ FGAPI void    FGAPIENTRY glutLeaveGameMode( void );
 FGAPI int     FGAPIENTRY glutGameModeGet( GLenum query );
 
 /*
- * Video resize functions, see freeglut_videoresize.c
+ * Video resize functions, see fg_videoresize.c
  */
 FGAPI int     FGAPIENTRY glutVideoResizeGet( GLenum query );
 FGAPI void    FGAPIENTRY glutSetupVideoResizing( void );
@@ -518,25 +587,69 @@ FGAPI void    FGAPIENTRY glutVideoResize( int x, int y, int width, int height );
 FGAPI void    FGAPIENTRY glutVideoPan( int x, int y, int width, int height );
 
 /*
- * Colormap functions, see freeglut_misc.c
+ * Colormap functions, see fg_misc.c
  */
 FGAPI void    FGAPIENTRY glutSetColor( int color, GLfloat red, GLfloat green, GLfloat blue );
 FGAPI GLfloat FGAPIENTRY glutGetColor( int color, int component );
 FGAPI void    FGAPIENTRY glutCopyColormap( int window );
 
 /*
- * Misc keyboard and joystick functions, see freeglut_misc.c
+ * Misc keyboard and joystick functions, see fg_misc.c
  */
 FGAPI void    FGAPIENTRY glutIgnoreKeyRepeat( int ignore );
-FGAPI void    FGAPIENTRY glutSetKeyRepeat( int repeatMode );  /* DEPRECATED 11/4/02 - Do not use */
+FGAPI void    FGAPIENTRY glutSetKeyRepeat( int repeatMode );
 FGAPI void    FGAPIENTRY glutForceJoystickFunc( void );
 
 /*
- * Misc functions, see freeglut_misc.c
+ * Misc functions, see fg_misc.c
  */
 FGAPI int     FGAPIENTRY glutExtensionSupported( const char* extension );
 FGAPI void    FGAPIENTRY glutReportErrors( void );
 
+/* Comment from glut.h of classic GLUT:
+
+   Win32 has an annoying issue where there are multiple C run-time
+   libraries (CRTs).  If the executable is linked with a different CRT
+   from the GLUT DLL, the GLUT DLL will not share the same CRT static
+   data seen by the executable.  In particular, atexit callbacks registered
+   in the executable will not be called if GLUT calls its (different)
+   exit routine).  GLUT is typically built with the
+   "/MD" option (the CRT with multithreading DLL support), but the Visual
+   C++ linker default is "/ML" (the single threaded CRT).
+
+   One workaround to this issue is requiring users to always link with
+   the same CRT as GLUT is compiled with.  That requires users supply a
+   non-standard option.  GLUT 3.7 has its own built-in workaround where
+   the executable's "exit" function pointer is covertly passed to GLUT.
+   GLUT then calls the executable's exit function pointer to ensure that
+   any "atexit" calls registered by the application are called if GLUT
+   needs to exit.
+
+   Note that the __glut*WithExit routines should NEVER be called directly.
+   To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */
+
+/* to get the prototype for exit() */
+#include <stdlib.h>
+
+#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) && !defined(__WATCOMC__)
+FGAPI void FGAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));
+FGAPI int FGAPIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int));
+FGAPI int FGAPIENTRY __glutCreateMenuWithExit(void (* func)(int), void (__cdecl *exitfunc)(int));
+#ifndef FREEGLUT_BUILDING_LIB
+#if defined(__GNUC__)
+#define FGUNUSED __attribute__((unused))
+#else
+#define FGUNUSED
+#endif
+static void FGAPIENTRY FGUNUSED glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
+#define glutInit glutInit_ATEXIT_HACK
+static int FGAPIENTRY FGUNUSED glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); }
+#define glutCreateWindow glutCreateWindow_ATEXIT_HACK
+static int FGAPIENTRY FGUNUSED glutCreateMenu_ATEXIT_HACK(void (* func)(int)) { return __glutCreateMenuWithExit(func, exit); }
+#define glutCreateMenu glutCreateMenu_ATEXIT_HACK
+#endif
+#endif
+
 #ifdef __cplusplus
     }
 #endif