-/*\r
- * freeglut_internal.h\r
- *\r
- * The freeglut library private include file.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 2 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#ifndef FREEGLUT_INTERNAL_H\r
-#define FREEGLUT_INTERNAL_H\r
-\r
-#ifdef HAVE_CONFIG_H\r
-# include "config.h"\r
-#endif\r
-\r
-/* XXX Update these for each release! */\r
-#define VERSION_MAJOR 2\r
-#define VERSION_MINOR 7\r
-#define VERSION_PATCH 0\r
-\r
-/* Freeglut is intended to function under all Unix/X11 and Win32 platforms. */\r
-/* XXX: Don't all MS-Windows compilers (except Cygwin) have _WIN32 defined?\r
- * XXX: If so, remove the first set of defined()'s below.\r
- */\r
-#if !defined(TARGET_HOST_POSIX_X11) && !defined(TARGET_HOST_MS_WINDOWS) && !defined(TARGET_HOST_MAC_OSX) && !defined(TARGET_HOST_SOLARIS)\r
-#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__MINGW32__) \\r
- || defined(_WIN32) || defined(_WIN32_WCE) \\r
- || ( defined(__CYGWIN__) && defined(X_DISPLAY_MISSING) )\r
-# define TARGET_HOST_MS_WINDOWS 1\r
-\r
-#elif defined(__posix__) || defined(__unix__) || defined(__linux__) || defined(__sun)\r
-# define TARGET_HOST_POSIX_X11 1\r
-\r
-#elif defined(__APPLE__)\r
-/* This is a placeholder until we get native OSX support ironed out -- JFF 11/18/09 */\r
-# define TARGET_HOST_POSIX_X11 1\r
-/* # define TARGET_HOST_MAC_OSX 1 */\r
-\r
-#else\r
-# error "Unrecognized target host!"\r
-\r
-#endif\r
-#endif\r
-\r
-/* Detect both SunPro and gcc compilers on Sun Solaris */\r
-#if defined (__SVR4) && defined (__sun)\r
-# define TARGET_HOST_SOLARIS 1\r
-#endif\r
-\r
-#ifndef TARGET_HOST_MS_WINDOWS\r
-# define TARGET_HOST_MS_WINDOWS 0\r
-#endif\r
-\r
-#ifndef TARGET_HOST_POSIX_X11\r
-# define TARGET_HOST_POSIX_X11 0\r
-#endif\r
-\r
-#ifndef TARGET_HOST_MAC_OSX\r
-# define TARGET_HOST_MAC_OSX 0\r
-#endif\r
-\r
-#ifndef TARGET_HOST_SOLARIS\r
-# define TARGET_HOST_SOLARIS 0\r
-#endif\r
-\r
-/* -- FIXED CONFIGURATION LIMITS ------------------------------------------- */\r
-\r
-#define FREEGLUT_MAX_MENUS 3\r
-\r
-/* -- PLATFORM-SPECIFIC INCLUDES ------------------------------------------- */\r
-\r
-/* All Win32 headers depend on the huge windows.h recursive include.\r
- * Note: Lower-case header names are used, for best cross-platform\r
- * compatibility.\r
- */\r
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
-# include <windows.h>\r
-# include <windowsx.h>\r
-# include <mmsystem.h>\r
-/* CYGWIN does not have tchar.h, but has TEXT(x), defined in winnt.h. */\r
-# ifndef __CYGWIN__\r
-# include <tchar.h>\r
-# else\r
-# define _TEXT(x) TEXT(x)\r
-# define _T(x) TEXT(x)\r
-# endif\r
-\r
-#elif TARGET_HOST_POSIX_X11\r
-# include <GL/glx.h>\r
-# include <X11/Xlib.h>\r
-# include <X11/Xatom.h>\r
-# include <X11/keysym.h>\r
-# include <X11/extensions/XInput.h>\r
-# ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
-# include <X11/extensions/xf86vmode.h>\r
-# endif\r
-# ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
-# include <X11/extensions/Xrandr.h>\r
-# endif\r
-/* If GLX is too old, we will fail during runtime when multisampling\r
- is requested, but at least freeglut compiles. */\r
-# ifndef GLX_SAMPLE_BUFFERS\r
-# define GLX_SAMPLE_BUFFERS 0x80A8\r
-# endif\r
-# ifndef GLX_SAMPLES\r
-# define GLX_SAMPLES 0x80A9\r
-# endif\r
-\r
-#endif\r
-\r
-/* These files should be available on every platform. */\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <math.h>\r
-#include <stdlib.h>\r
-#include <stdarg.h>\r
-\r
-/* These are included based on autoconf directives. */\r
-#ifdef HAVE_SYS_TYPES_H\r
-# include <sys/types.h>\r
-#endif\r
-#ifdef HAVE_UNISTD_H\r
-# include <unistd.h>\r
-#endif\r
-#ifdef TIME_WITH_SYS_TIME\r
-# include <sys/time.h>\r
-# include <time.h>\r
-#elif defined(HAVE_SYS_TIME_H)\r
-# include <sys/time.h>\r
-#else\r
-# include <time.h>\r
-#endif\r
-\r
-/* -- AUTOCONF HACKS --------------------------------------------------------*/\r
-\r
-/* XXX: Update autoconf to avoid these.\r
- * XXX: Are non-POSIX platforms intended not to use autoconf?\r
- * If so, perhaps there should be a config_guess.h for them. Alternatively,\r
- * config guesses could be placed above, just after the config.h exclusion.\r
- */\r
-#if defined(__FreeBSD__) || defined(__NetBSD__)\r
-# define HAVE_USB_JS 1\r
-# if defined(__NetBSD__) || ( defined(__FreeBSD__) && __FreeBSD_version >= 500000)\r
-# define HAVE_USBHID_H 1\r
-# endif\r
-#endif\r
-\r
-#if TARGET_HOST_MS_WINDOWS\r
-# define HAVE_VFPRINTF 1\r
-#endif\r
-\r
-/* MinGW may lack a prototype for ChangeDisplaySettingsEx() (depending on the version?) */\r
-#if TARGET_HOST_MS_WINDOWS && !defined(ChangeDisplaySettingsEx)\r
-LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID);\r
-LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID);\r
-# ifdef UNICODE\r
-# define ChangeDisplaySettingsEx ChangeDisplaySettingsExW\r
-# else\r
-# define ChangeDisplaySettingsEx ChangeDisplaySettingsExA\r
-# endif\r
-#endif\r
-\r
-#if defined(_MSC_VER) || defined(__WATCOMC__)\r
-/* strdup() is non-standard, for all but POSIX-2001 */\r
-#define strdup _strdup\r
-#endif\r
-\r
-/* M_PI is non-standard (defined by BSD, not ISO-C) */\r
-#ifndef M_PI\r
-# define M_PI 3.14159265358979323846\r
-#endif\r
-\r
-#ifdef HAVE_STDBOOL_H\r
-# include <stdbool.h>\r
-# ifndef TRUE\r
-# define TRUE true\r
-# endif\r
-# ifndef FALSE\r
-# define FALSE false\r
-# endif\r
-#else\r
-# ifndef TRUE\r
-# define TRUE 1\r
-# endif\r
-# ifndef FALSE\r
-# define FALSE 0\r
-# endif\r
-#endif\r
-\r
-/* General defines */\r
-\r
-#define INVALID_MODIFIERS 0xffffffff\r
-\r
-/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */\r
-\r
-/* Freeglut callbacks type definitions */\r
-typedef void (* FGCBDisplay )( void );\r
-typedef void (* FGCBReshape )( int, int );\r
-typedef void (* FGCBVisibility )( int );\r
-typedef void (* FGCBKeyboard )( unsigned char, int, int );\r
-typedef void (* FGCBSpecial )( int, int, int );\r
-typedef void (* FGCBMouse )( int, int, int, int );\r
-typedef void (* FGCBMouseWheel )( int, int, int, int );\r
-typedef void (* FGCBMotion )( int, int );\r
-typedef void (* FGCBPassive )( int, int );\r
-typedef void (* FGCBEntry )( int );\r
-typedef void (* FGCBWindowStatus )( int );\r
-typedef void (* FGCBSelect )( int, int, int );\r
-typedef void (* FGCBJoystick )( unsigned int, int, int, int );\r
-typedef void (* FGCBKeyboardUp )( unsigned char, int, int );\r
-typedef void (* FGCBSpecialUp )( int, int, int );\r
-typedef void (* FGCBOverlayDisplay)( void );\r
-typedef void (* FGCBSpaceMotion )( int, int, int );\r
-typedef void (* FGCBSpaceRotation )( int, int, int );\r
-typedef void (* FGCBSpaceButton )( int, int );\r
-typedef void (* FGCBDials )( int, int );\r
-typedef void (* FGCBButtonBox )( int, int );\r
-typedef void (* FGCBTabletMotion )( int, int );\r
-typedef void (* FGCBTabletButton )( int, int, int, int );\r
-typedef void (* FGCBDestroy )( void );\r
-\r
-typedef void (* FGCBMultiEntry )( int, int );\r
-typedef void (* FGCBMultiButton )( int, int, int, int, int );\r
-typedef void (* FGCBMultiMotion )( int, int, int );\r
-typedef void (* FGCBMultiPassive )( int, int, int );\r
-\r
-/* The global callbacks type definitions */\r
-typedef void (* FGCBIdle )( void );\r
-typedef void (* FGCBTimer )( int );\r
-typedef void (* FGCBMenuState )( int );\r
-typedef void (* FGCBMenuStatus )( int, int, int );\r
-\r
-/* The callback used when creating/using menus */\r
-typedef void (* FGCBMenu )( int );\r
-\r
-/* The FreeGLUT error/warning handler type definition */\r
-typedef void (* FGError ) ( const char *fmt, va_list ap);\r
-typedef void (* FGWarning ) ( const char *fmt, va_list ap);\r
-\r
-\r
-/* A list structure */\r
-typedef struct tagSFG_List SFG_List;\r
-struct tagSFG_List\r
-{\r
- void *First;\r
- void *Last;\r
-};\r
-\r
-/* A list node structure */\r
-typedef struct tagSFG_Node SFG_Node;\r
-struct tagSFG_Node\r
-{\r
- void *Next;\r
- void *Prev;\r
-};\r
-\r
-/* A helper structure holding two ints and a boolean */\r
-typedef struct tagSFG_XYUse SFG_XYUse;\r
-struct tagSFG_XYUse\r
-{\r
- GLint X, Y; /* The two integers... */\r
- GLboolean Use; /* ...and a single boolean. */\r
-};\r
-\r
-/*\r
- * An enumeration containing the state of the GLUT execution:\r
- * initializing, running, or stopping\r
- */\r
-typedef enum\r
-{\r
- GLUT_EXEC_STATE_INIT,\r
- GLUT_EXEC_STATE_RUNNING,\r
- GLUT_EXEC_STATE_STOP\r
-} fgExecutionState ;\r
-\r
-/* This structure holds different freeglut settings */\r
-typedef struct tagSFG_State SFG_State;\r
-struct tagSFG_State\r
-{\r
- SFG_XYUse Position; /* The default windows' position */\r
- SFG_XYUse Size; /* The default windows' size */\r
- unsigned int DisplayMode; /* Display mode for new windows */\r
-\r
- GLboolean Initialised; /* freeglut has been initialised */\r
-\r
- int DirectContext; /* Direct rendering state */\r
-\r
- GLboolean ForceIconic; /* New top windows are iconified */\r
- GLboolean UseCurrentContext; /* New windows share with current */\r
-\r
- GLboolean GLDebugSwitch; /* OpenGL state debugging switch */\r
- GLboolean XSyncSwitch; /* X11 sync protocol switch */\r
-\r
- int KeyRepeat; /* Global key repeat mode. */\r
- int Modifiers; /* Current ALT/SHIFT/CTRL state */\r
-\r
- GLuint FPSInterval; /* Interval between FPS printfs */\r
- GLuint SwapCount; /* Count of glutSwapBuffer calls */\r
- GLuint SwapTime; /* Time of last SwapBuffers */\r
-\r
- unsigned long Time; /* Time that glutInit was called */\r
- SFG_List Timers; /* The freeglut timer hooks */\r
- SFG_List FreeTimers; /* The unused timer hooks */\r
-\r
- FGCBIdle IdleCallback; /* The global idle callback */\r
-\r
- int ActiveMenus; /* Num. of currently active menus */\r
- FGCBMenuState MenuStateCallback; /* Menu callbacks are global */\r
- FGCBMenuStatus MenuStatusCallback;\r
-\r
- SFG_XYUse GameModeSize; /* Game mode screen's dimensions */\r
- int GameModeDepth; /* The pixel depth for game mode */\r
- int GameModeRefresh; /* The refresh rate for game mode */\r
-\r
- int ActionOnWindowClose; /* Action when user closes window */\r
-\r
- fgExecutionState ExecState; /* Used for GLUT termination */\r
- char *ProgramName; /* Name of the invoking program */\r
- GLboolean JoysticksInitialised; /* Only initialize if application calls for them */\r
- int NumActiveJoysticks; /* Number of active joysticks -- if zero, don't poll joysticks */\r
- GLboolean InputDevsInitialised; /* Only initialize if application calls for them */\r
-\r
- int MouseWheelTicks; /* Number of ticks the mouse wheel has turned */\r
-\r
- int AuxiliaryBufferNumber; /* Number of auxiliary buffers */\r
- int SampleNumber; /* Number of samples per pixel */\r
-\r
- int MajorVersion; /* Major OpenGL context version */\r
- int MinorVersion; /* Minor OpenGL context version */\r
- int ContextFlags; /* OpenGL context flags */\r
- int ContextProfile; /* OpenGL context profile */\r
- FGError ErrorFunc; /* User defined error handler */\r
- FGWarning WarningFunc; /* User defined warning handler */\r
-};\r
-\r
-/* The structure used by display initialization in freeglut_init.c */\r
-typedef struct tagSFG_Display SFG_Display;\r
-struct tagSFG_Display\r
-{\r
-#if TARGET_HOST_POSIX_X11\r
- Display* Display; /* The display we are being run in. */\r
- int Screen; /* The screen we are about to use. */\r
- Window RootWindow; /* The screen's root window. */\r
- int Connection; /* The display's connection number */\r
- Atom DeleteWindow; /* The window deletion atom */\r
- Atom State; /* The state atom */\r
- Atom StateFullScreen; /* The full screen atom */\r
-\r
-#ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
- int prev_xsz, prev_ysz;\r
- int prev_refresh;\r
- int prev_size_valid;\r
-#endif /* HAVE_X11_EXTENSIONS_XRANDR_H */\r
-\r
-#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
- /*\r
- * XF86VidMode may be compilable even if it fails at runtime. Therefore,\r
- * the validity of the VidMode has to be tracked\r
- */\r
- int DisplayModeValid; /* Flag that indicates runtime status*/\r
- XF86VidModeModeLine DisplayMode; /* Current screen's display settings */\r
- int DisplayModeClock; /* The display mode's refresh rate */\r
- int DisplayViewPortX; /* saved X location of the viewport */\r
- int DisplayViewPortY; /* saved Y location of the viewport */\r
-#endif /* HAVE_X11_EXTENSIONS_XF86VMODE_H */\r
-\r
- int DisplayPointerX; /* saved X location of the pointer */\r
- int DisplayPointerY; /* saved Y location of the pointer */\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
- HINSTANCE Instance; /* The application's instance */\r
- DEVMODE DisplayMode; /* Desktop's display settings */\r
- char *DisplayName; /* Display name for multi display support*/ \r
-\r
-#endif\r
-\r
- int ScreenWidth; /* The screen's width in pixels */\r
- int ScreenHeight; /* The screen's height in pixels */\r
- int ScreenWidthMM; /* The screen's width in milimeters */\r
- int ScreenHeightMM; /* The screen's height in milimeters */\r
-};\r
-\r
-\r
-/* The user can create any number of timer hooks */\r
-typedef struct tagSFG_Timer SFG_Timer;\r
-struct tagSFG_Timer\r
-{\r
- SFG_Node Node;\r
- int ID; /* The timer ID integer */\r
- FGCBTimer Callback; /* The timer callback */\r
- long TriggerTime; /* The timer trigger time */\r
-};\r
-\r
-/*\r
- * Make "freeglut" window handle and context types so that we don't need so\r
- * much conditionally-compiled code later in the library.\r
- */\r
-#if TARGET_HOST_POSIX_X11\r
-\r
-typedef Window SFG_WindowHandleType ;\r
-typedef GLXContext SFG_WindowContextType ;\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
-\r
-typedef HWND SFG_WindowHandleType ;\r
-typedef HGLRC SFG_WindowContextType ;\r
-\r
-#endif\r
-\r
-/*\r
- * A window and its OpenGL context. The contents of this structure\r
- * are highly dependant on the target operating system we aim at...\r
- */\r
-typedef struct tagSFG_Context SFG_Context;\r
-struct tagSFG_Context\r
-{\r
- SFG_WindowHandleType Handle; /* The window's handle */\r
- SFG_WindowContextType Context; /* The window's OpenGL/WGL context */\r
-\r
-#if TARGET_HOST_POSIX_X11\r
- GLXFBConfig* FBConfig; /* The window's FBConfig */\r
-#elif TARGET_HOST_MS_WINDOWS\r
- HDC Device; /* The window's device context */\r
-#endif\r
-\r
- int DoubleBuffered; /* Treat the window as double-buffered */\r
-};\r
-\r
-/* Window's state description. This structure should be kept portable. */\r
-typedef struct tagSFG_WindowState SFG_WindowState;\r
-struct tagSFG_WindowState\r
-{\r
- /* Note that on Windows, sizes always refer to the client area, thus without the window decorations */\r
- int Width; /* Window's width in pixels */\r
- int Height; /* The same about the height */\r
-#if TARGET_HOST_POSIX_X11\r
- int OldWidth; /* Window width from before a resize */\r
- int OldHeight; /* " height " " " " */\r
-#elif TARGET_HOST_MS_WINDOWS\r
- RECT OldRect; /* window rect - stored before the window is made fullscreen */\r
- DWORD OldStyle; /* window style - stored before the window is made fullscreen */\r
-#endif\r
-\r
- GLboolean Redisplay; /* Do we have to redisplay? */\r
- GLboolean Visible; /* Is the window visible now */\r
-\r
- int Cursor; /* The currently selected cursor */\r
-\r
- long JoystickPollRate; /* The joystick polling rate */\r
- long JoystickLastPoll; /* When the last poll happened */\r
-\r
- int MouseX, MouseY; /* The most recent mouse position */\r
-\r
- GLboolean IgnoreKeyRepeat; /* Whether to ignore key repeat. */\r
- GLboolean KeyRepeating; /* Currently in repeat mode */\r
-\r
- GLboolean NeedToResize; /* Do we need to resize the window? */\r
-\r
- GLboolean IsFullscreen; /* is the window fullscreen? */\r
-};\r
-\r
-\r
-/*\r
- * A generic function pointer. We should really use the GLUTproc type\r
- * defined in freeglut_ext.h, but if we include that header in this file\r
- * a bunch of other stuff (font-related) blows up!\r
- */\r
-typedef void (*SFG_Proc)();\r
-\r
-\r
-/*\r
- * SET_WCB() is used as:\r
- *\r
- * SET_WCB( window, cbname, func );\r
- *\r
- * ...where {window} is the freeglut window to set the callback,\r
- * {cbname} is the window-specific callback to set,\r
- * {func} is a function-pointer.\r
- *\r
- * Originally, {FETCH_WCB( ... ) = func} was rather sloppily used,\r
- * but this can cause warnings because the FETCH_WCB() macro type-\r
- * casts its result, and a type-cast value shouldn't be an lvalue.\r
- *\r
- * The {if( FETCH_WCB( ... ) != func )} test is to do type-checking\r
- * and for no other reason. Since it's hidden in the macro, the\r
- * ugliness is felt to be rather benign.\r
- */\r
-#define SET_WCB(window,cbname,func) \\r
-do \\r
-{ \\r
- if( FETCH_WCB( window, cbname ) != (SFG_Proc)(func) ) \\r
- (((window).CallBacks[CB_ ## cbname]) = (SFG_Proc)(func)); \\r
-} while( 0 )\r
-\r
-/*\r
- * FETCH_WCB() is used as:\r
- *\r
- * FETCH_WCB( window, cbname );\r
- *\r
- * ...where {window} is the freeglut window to fetch the callback from,\r
- * {cbname} is the window-specific callback to fetch.\r
- *\r
- * The result is correctly type-cast to the callback function pointer\r
- * type.\r
- */\r
-#define FETCH_WCB(window,cbname) \\r
- ((window).CallBacks[CB_ ## cbname])\r
-\r
-/*\r
- * INVOKE_WCB() is used as:\r
- *\r
- * INVOKE_WCB( window, cbname, ( arg_list ) );\r
- *\r
- * ...where {window} is the freeglut window,\r
- * {cbname} is the window-specific callback to be invoked,\r
- * {(arg_list)} is the parameter list.\r
- *\r
- * The callback is invoked as:\r
- *\r
- * callback( arg_list );\r
- *\r
- * ...so the parentheses are REQUIRED in the {arg_list}.\r
- *\r
- * NOTE that it does a sanity-check and also sets the\r
- * current window.\r
- *\r
- */\r
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: also WinCE? */\r
-#define INVOKE_WCB(window,cbname,arg_list) \\r
-do \\r
-{ \\r
- if( FETCH_WCB( window, cbname ) ) \\r
- { \\r
- FGCB ## cbname func = (FGCB ## cbname)(FETCH_WCB( window, cbname )); \\r
- fgSetWindow( &window ); \\r
- func arg_list; \\r
- } \\r
-} while( 0 )\r
-#else\r
-#define INVOKE_WCB(window,cbname,arg_list) \\r
-do \\r
-{ \\r
- if( FETCH_WCB( window, cbname ) ) \\r
- { \\r
- fgSetWindow( &window ); \\r
- ((FGCB ## cbname)FETCH_WCB( window, cbname )) arg_list; \\r
- } \\r
-} while( 0 )\r
-#endif\r
-\r
-/*\r
- * The window callbacks the user can supply us with. Should be kept portable.\r
- *\r
- * This enumeration provides the freeglut CallBack numbers.\r
- * The symbolic constants are indices into a window's array of\r
- * function callbacks. The names are formed by splicing a common\r
- * prefix onto the callback's base name. (This was originally\r
- * done so that an early stage of development could live side-by-\r
- * side with the old callback code. The old callback code used\r
- * the bare callback's name as a structure member, so I used a\r
- * prefix for the array index name.)\r
- *\r
- * XXX For consistancy, perhaps the prefix should match the\r
- * XXX FETCH* and INVOKE* macro suffices. I.e., WCB_, rather than\r
- * XXX CB_.\r
- */\r
-enum\r
-{\r
- CB_Display,\r
- CB_Reshape,\r
- CB_Keyboard,\r
- CB_KeyboardUp,\r
- CB_Special,\r
- CB_SpecialUp,\r
- CB_Mouse,\r
- CB_MouseWheel,\r
- CB_Motion,\r
- CB_Passive,\r
- CB_Entry,\r
- CB_Visibility,\r
- CB_WindowStatus,\r
- CB_Joystick,\r
- CB_Destroy,\r
-\r
- /* MPX-related */\r
- CB_MultiEntry,\r
- CB_MultiButton,\r
- CB_MultiMotion,\r
- CB_MultiPassive,\r
-\r
- /* Presently ignored */\r
- CB_Select,\r
- CB_OverlayDisplay,\r
- CB_SpaceMotion, /* presently implemented only on UNIX/X11 */\r
- CB_SpaceRotation, /* presently implemented only on UNIX/X11 */\r
- CB_SpaceButton, /* presently implemented only on UNIX/X11 */\r
- CB_Dials,\r
- CB_ButtonBox,\r
- CB_TabletMotion,\r
- CB_TabletButton,\r
-\r
- /* Always make this the LAST one */\r
- TOTAL_CALLBACKS\r
-};\r
-\r
-\r
-/* This structure holds the OpenGL rendering context for all the menu windows */\r
-typedef struct tagSFG_MenuContext SFG_MenuContext;\r
-struct tagSFG_MenuContext\r
-{\r
- SFG_WindowContextType MContext; /* The menu window's WGL context */\r
-};\r
-\r
-/* This structure describes a menu */\r
-typedef struct tagSFG_Window SFG_Window;\r
-typedef struct tagSFG_MenuEntry SFG_MenuEntry;\r
-typedef struct tagSFG_Menu SFG_Menu;\r
-struct tagSFG_Menu\r
-{\r
- SFG_Node Node;\r
- void *UserData; /* User data passed back at callback */\r
- int ID; /* The global menu ID */\r
- SFG_List Entries; /* The menu entries list */\r
- FGCBMenu Callback; /* The menu callback */\r
- FGCBDestroy Destroy; /* Destruction callback */\r
- GLboolean IsActive; /* Is the menu selected? */\r
- int Width; /* Menu box width in pixels */\r
- int Height; /* Menu box height in pixels */\r
- int X, Y; /* Menu box raster position */\r
-\r
- SFG_MenuEntry *ActiveEntry; /* Currently active entry in the menu */\r
- SFG_Window *Window; /* Window for menu */\r
- SFG_Window *ParentWindow; /* Window in which the menu is invoked */\r
-};\r
-\r
-/* This is a menu entry */\r
-struct tagSFG_MenuEntry\r
-{\r
- SFG_Node Node;\r
- int ID; /* The menu entry ID (local) */\r
- int Ordinal; /* The menu's ordinal number */\r
- char* Text; /* The text to be displayed */\r
- SFG_Menu* SubMenu; /* Optional sub-menu tree */\r
- GLboolean IsActive; /* Is the entry highlighted? */\r
- int Width; /* Label's width in pixels */\r
-};\r
-\r
-/*\r
- * A window, making part of freeglut windows hierarchy.\r
- * Should be kept portable.\r
- *\r
- * NOTE that ActiveMenu is set to menu itself if the window is a menu.\r
- */\r
-struct tagSFG_Window\r
-{\r
- SFG_Node Node;\r
- int ID; /* Window's ID number */\r
-\r
- SFG_Context Window; /* Window and OpenGL context */\r
- SFG_WindowState State; /* The window state */\r
- SFG_Proc CallBacks[ TOTAL_CALLBACKS ]; /* Array of window callbacks */\r
- void *UserData ; /* For use by user */\r
-\r
- SFG_Menu* Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window */\r
- SFG_Menu* ActiveMenu; /* The window's active menu */\r
-\r
- SFG_Window* Parent; /* The parent to this window */\r
- SFG_List Children; /* The subwindows d.l. list */\r
-\r
- GLboolean IsMenu; /* Set to 1 if we are a menu */\r
-};\r
-\r
-\r
-/* A linked list structure of windows */\r
-typedef struct tagSFG_WindowList SFG_WindowList ;\r
-struct tagSFG_WindowList\r
-{\r
- SFG_Node node;\r
- SFG_Window *window ;\r
-};\r
-\r
-/* This holds information about all the windows, menus etc. */\r
-typedef struct tagSFG_Structure SFG_Structure;\r
-struct tagSFG_Structure\r
-{\r
- SFG_List Windows; /* The global windows list */\r
- SFG_List Menus; /* The global menus list */\r
- SFG_List WindowsToDestroy;\r
-\r
- SFG_Window* CurrentWindow; /* The currently set window */\r
- SFG_Menu* CurrentMenu; /* Same, but menu... */\r
-\r
- SFG_MenuContext* MenuContext; /* OpenGL rendering context for menus */\r
-\r
- SFG_Window* GameModeWindow; /* The game mode window */\r
-\r
- int WindowID; /* The new current window ID */\r
- int MenuID; /* The new current menu ID */\r
-};\r
-\r
-/*\r
- * This structure is used for the enumeration purposes.\r
- * You can easily extend its functionalities by declaring\r
- * a structure containing enumerator's contents and custom\r
- * data, then casting its pointer to (SFG_Enumerator *).\r
- */\r
-typedef struct tagSFG_Enumerator SFG_Enumerator;\r
-struct tagSFG_Enumerator\r
-{\r
- GLboolean found; /* Used to terminate search */\r
- void* data; /* Custom data pointer */\r
-};\r
-typedef void (* FGCBenumerator )( SFG_Window *, SFG_Enumerator * );\r
-\r
-/* The bitmap font structure */\r
-typedef struct tagSFG_Font SFG_Font;\r
-struct tagSFG_Font\r
-{\r
- char* Name; /* The source font name */\r
- int Quantity; /* Number of chars in font */\r
- int Height; /* Height of the characters */\r
- const GLubyte** Characters; /* The characters mapping */\r
-\r
- float xorig, yorig; /* Relative origin of the character */\r
-};\r
-\r
-/* The stroke font structures */\r
-\r
-typedef struct tagSFG_StrokeVertex SFG_StrokeVertex;\r
-struct tagSFG_StrokeVertex\r
-{\r
- GLfloat X, Y;\r
-};\r
-\r
-typedef struct tagSFG_StrokeStrip SFG_StrokeStrip;\r
-struct tagSFG_StrokeStrip\r
-{\r
- int Number;\r
- const SFG_StrokeVertex* Vertices;\r
-};\r
-\r
-typedef struct tagSFG_StrokeChar SFG_StrokeChar;\r
-struct tagSFG_StrokeChar\r
-{\r
- GLfloat Right;\r
- int Number;\r
- const SFG_StrokeStrip* Strips;\r
-};\r
-\r
-typedef struct tagSFG_StrokeFont SFG_StrokeFont;\r
-struct tagSFG_StrokeFont\r
-{\r
- char* Name; /* The source font name */\r
- int Quantity; /* Number of chars in font */\r
- GLfloat Height; /* Height of the characters */\r
- const SFG_StrokeChar** Characters; /* The characters mapping */\r
-};\r
-\r
-/* -- GLOBAL VARIABLES EXPORTS --------------------------------------------- */\r
-\r
-/* Freeglut display related stuff (initialized once per session) */\r
-extern SFG_Display fgDisplay;\r
-\r
-/* Freeglut internal structure */\r
-extern SFG_Structure fgStructure;\r
-\r
-/* The current freeglut settings */\r
-extern SFG_State fgState;\r
-\r
-\r
-/* -- PRIVATE FUNCTION DECLARATIONS ---------------------------------------- */\r
-\r
-/*\r
- * A call to this function makes us sure that the Display and Structure\r
- * subsystems have been properly initialized and are ready to be used\r
- */\r
-#define FREEGLUT_EXIT_IF_NOT_INITIALISED( string ) \\r
- if ( ! fgState.Initialised ) \\r
- { \\r
- fgError ( " ERROR: Function <%s> called" \\r
- " without first calling 'glutInit'.", (string) ) ; \\r
- }\r
-\r
-#define FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED( string ) \\r
- if ( ! fgState.Initialised ) \\r
- { \\r
- fgError ( " ERROR: Internal <%s> function called" \\r
- " without first calling 'glutInit'.", (string) ) ; \\r
- }\r
-\r
-#define FREEGLUT_INTERNAL_ERROR_EXIT( cond, string, function ) \\r
- if ( ! ( cond ) ) \\r
- { \\r
- fgError ( " ERROR: Internal error <%s> in function %s", \\r
- (string), (function) ) ; \\r
- }\r
-\r
-/*\r
- * Following definitions are somewhat similiar to GLib's,\r
- * but do not generate any log messages:\r
- */\r
-#define freeglut_return_if_fail( expr ) \\r
- if( !(expr) ) \\r
- return;\r
-#define freeglut_return_val_if_fail( expr, val ) \\r
- if( !(expr) ) \\r
- return val ;\r
-\r
-/*\r
- * A call to those macros assures us that there is a current\r
- * window set, respectively:\r
- */\r
-#define FREEGLUT_EXIT_IF_NO_WINDOW( string ) \\r
- if ( ! fgStructure.CurrentWindow && \\r
- ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION ) ) \\r
- { \\r
- fgError ( " ERROR: Function <%s> called" \\r
- " with no current window defined.", (string) ) ; \\r
- }\r
-\r
-/*\r
- * The deinitialize function gets called on glutMainLoop() end. It should clean up\r
- * everything inside of the freeglut\r
- */\r
-void fgDeinitialize( void );\r
-\r
-/*\r
- * Those two functions are used to create/destroy the freeglut internal\r
- * structures. This actually happens when calling glutInit() and when\r
- * quitting the glutMainLoop() (which actually happens, when all windows\r
- * have been closed).\r
- */\r
-void fgCreateStructure( void );\r
-void fgDestroyStructure( void );\r
-\r
-/* A helper function to check if a display mode is possible to use */\r
-#if TARGET_HOST_POSIX_X11\r
-GLXFBConfig* fgChooseFBConfig( int* numcfgs );\r
-#endif\r
-\r
-/* The window procedure for Win32 events handling */\r
-#if TARGET_HOST_MS_WINDOWS\r
-LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg,\r
- WPARAM wParam, LPARAM lParam );\r
-void fgNewWGLCreateContext( SFG_Window* window );\r
-GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,\r
- unsigned char layer_type );\r
-#endif\r
-\r
-/*\r
- * Window creation, opening, closing and destruction.\r
- * Also CallBack clearing/initialization.\r
- * Defined in freeglut_structure.c, freeglut_window.c.\r
- */\r
-SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,\r
- GLboolean positionUse, int x, int y,\r
- GLboolean sizeUse, int w, int h,\r
- GLboolean gameMode, GLboolean isMenu );\r
-void fgSetWindow ( SFG_Window *window );\r
-void fgOpenWindow( SFG_Window* window, const char* title,\r
- GLboolean positionUse, int x, int y,\r
- GLboolean sizeUse, int w, int h,\r
- GLboolean gameMode, GLboolean isSubWindow );\r
-void fgCloseWindow( SFG_Window* window );\r
-void fgAddToWindowDestroyList ( SFG_Window* window );\r
-void fgCloseWindows ();\r
-void fgDestroyWindow( SFG_Window* window );\r
-\r
-/* Menu creation and destruction. Defined in freeglut_structure.c */\r
-SFG_Menu* fgCreateMenu( FGCBMenu menuCallback );\r
-void fgDestroyMenu( SFG_Menu* menu );\r
-\r
-/* Joystick device management functions, defined in freeglut_joystick.c */\r
-int fgJoystickDetect( void );\r
-void fgInitialiseJoysticks( void );\r
-void fgJoystickClose( void );\r
-void fgJoystickPollWindow( SFG_Window* window );\r
-\r
-/* InputDevice Initialisation and Closure */\r
-int fgInputDeviceDetect( void );\r
-void fgInitialiseInputDevices( void );\r
-void fgInputDeviceClose( void );\r
-\r
-/* spaceball device functions, defined in freeglut_spaceball.c */\r
-void fgInitialiseSpaceball( void );\r
-void fgSpaceballClose( void );\r
-void fgSpaceballSetWindow( SFG_Window *window );\r
-\r
-int fgHasSpaceball( void );\r
-int fgSpaceballNumButtons( void );\r
-\r
-#if TARGET_HOST_POSIX_X11\r
-int fgIsSpaceballXEvent( const XEvent *ev );\r
-void fgSpaceballHandleXEvent( const XEvent *ev );\r
-#endif\r
-\r
-/* Setting the cursor for a given window */\r
-void fgSetCursor ( SFG_Window *window, int cursorID );\r
-\r
-/*\r
- * Helper function to enumerate through all registered windows\r
- * and one to enumerate all of a window's subwindows...\r
- *\r
- * The GFunc callback for those functions will be defined as:\r
- *\r
- * void enumCallback( gpointer window, gpointer enumerator );\r
- *\r
- * where window is the enumerated (sub)window pointer (SFG_Window *),\r
- * and userData is the a custom user-supplied pointer. Functions\r
- * are defined and exported from freeglut_structure.c file.\r
- */\r
-void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator );\r
-void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,\r
- SFG_Enumerator* enumerator );\r
-\r
-#if TARGET_HOST_MS_WINDOWS\r
-/* \r
- * Helper functions for getting client area from the window rect\r
- * and the window rect from the client area given the style of the window\r
- * (or a valid window pointer from which the style can be queried).\r
- */\r
-void fghComputeWindowRectFromClientArea_UseStyle ( const DWORD windowStyle , RECT *clientRect, BOOL posIsOutside );\r
-void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside );\r
-void fghComputeClientAreaFromWindowRect ( const SFG_Window *window, RECT *windowRect, BOOL wantPosOutside );\r
-RECT fghGetClientArea ( const SFG_Window *window, BOOL wantPosOutside );\r
-void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth);\r
-#endif\r
-\r
-/*\r
- * fgWindowByHandle returns a (SFG_Window *) value pointing to the\r
- * first window in the queue matching the specified window handle.\r
- * The function is defined in freeglut_structure.c file.\r
- */\r
-SFG_Window* fgWindowByHandle( SFG_WindowHandleType hWindow );\r
-\r
-/*\r
- * This function is similiar to the previous one, except it is\r
- * looking for a specified (sub)window identifier. The function\r
- * is defined in freeglut_structure.c file.\r
- */\r
-SFG_Window* fgWindowByID( int windowID );\r
-\r
-/*\r
- * Looks up a menu given its ID. This is easier than fgWindowByXXX\r
- * as all menus are placed in a single doubly linked list...\r
- */\r
-SFG_Menu* fgMenuByID( int menuID );\r
-\r
-/*\r
- * The menu activation and deactivation the code. This is the meat\r
- * of the menu user interface handling code...\r
- */\r
-void fgUpdateMenuHighlight ( SFG_Menu *menu );\r
-GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,\r
- int mouse_x, int mouse_y );\r
-void fgDeactivateMenu( SFG_Window *window );\r
-\r
-/*\r
- * This function gets called just before the buffers swap, so that\r
- * freeglut can display the pull-down menus via OpenGL. The function\r
- * is defined in freeglut_menu.c file.\r
- */\r
-void fgDisplayMenu( void );\r
-\r
-/* Elapsed time as per glutGet(GLUT_ELAPSED_TIME). */\r
-long fgElapsedTime( void );\r
-\r
-/* System time in milliseconds */\r
-long unsigned fgSystemTime(void);\r
-\r
-/* List functions */\r
-void fgListInit(SFG_List *list);\r
-void fgListAppend(SFG_List *list, SFG_Node *node);\r
-void fgListRemove(SFG_List *list, SFG_Node *node);\r
-int fgListLength(SFG_List *list);\r
-void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node);\r
-\r
-/* Error Message functions */\r
-void fgError( const char *fmt, ... );\r
-void fgWarning( const char *fmt, ... );\r
-\r
-/*\r
- * Check if "hint" is present in "property" for "window". See freeglut_init.c\r
- */\r
-#if TARGET_HOST_POSIX_X11\r
-int fgHintPresent(Window window, Atom property, Atom hint);\r
-\r
-/* Handler for X extension Events */\r
-#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H\r
- void fgHandleExtensionEvents( XEvent * ev );\r
- void fgRegisterDevices( Display* dpy, Window* win );\r
-#endif\r
-\r
-#endif\r
-\r
-SFG_Proc fghGetProcAddress( const char *procName );\r
-\r
-#if TARGET_HOST_MS_WINDOWS\r
-extern void (__cdecl *__glutExitFunc)( int return_value );\r
-#endif\r
-\r
-#endif /* FREEGLUT_INTERNAL_H */\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_internal.h
+ *
+ * The freeglut library private include file.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 2 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef FREEGLUT_INTERNAL_H
+#define FREEGLUT_INTERNAL_H
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* XXX Update these for each release! */
+#define VERSION_MAJOR 3
+#define VERSION_MINOR 0
+#define VERSION_PATCH 0
+
+/* Freeglut is intended to function under all Unix/X11 and Win32 platforms. */
+/* XXX: Don't all MS-Windows compilers (except Cygwin) have _WIN32 defined?
+ * XXX: If so, remove the first set of defined()'s below.
+ */
+#if !defined(TARGET_HOST_POSIX_X11) && !defined(TARGET_HOST_MS_WINDOWS) && !defined(TARGET_HOST_MAC_OSX) && !defined(TARGET_HOST_SOLARIS)
+#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__MINGW32__) \
+ || defined(_WIN32) || defined(_WIN32_WCE) \
+ || ( defined(__CYGWIN__) && defined(X_DISPLAY_MISSING) )
+# define TARGET_HOST_MS_WINDOWS 1
+
+#elif defined(__posix__) || defined(__unix__) || defined(__linux__) || defined(__sun)
+# define TARGET_HOST_POSIX_X11 1
+
+#elif defined(__APPLE__)
+/* This is a placeholder until we get native OSX support ironed out -- JFF 11/18/09 */
+# define TARGET_HOST_POSIX_X11 1
+/* # define TARGET_HOST_MAC_OSX 1 */
+
+#else
+# error "Unrecognized target host!"
+
+#endif
+#endif
+
+/* Detect both SunPro and gcc compilers on Sun Solaris */
+#if defined (__SVR4) && defined (__sun)
+# define TARGET_HOST_SOLARIS 1
+#endif
+
+#ifndef TARGET_HOST_MS_WINDOWS
+# define TARGET_HOST_MS_WINDOWS 0
+#endif
+
+#ifndef TARGET_HOST_POSIX_X11
+# define TARGET_HOST_POSIX_X11 0
+#endif
+
+#ifndef TARGET_HOST_MAC_OSX
+# define TARGET_HOST_MAC_OSX 0
+#endif
+
+#ifndef TARGET_HOST_SOLARIS
+# define TARGET_HOST_SOLARIS 0
+#endif
+
+/* -- FIXED CONFIGURATION LIMITS ------------------------------------------- */
+
+#define FREEGLUT_MAX_MENUS 3
+
+/* These files should be available on every platform. */
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+/* These are included based on autoconf directives. */
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#elif defined(HAVE_SYS_TIME_H)
+# include <sys/time.h>
+#else
+# include <time.h>
+#endif
+
+/* -- AUTOCONF HACKS --------------------------------------------------------*/
+
+/* XXX: Update autoconf to avoid these.
+ * XXX: Are non-POSIX platforms intended not to use autoconf?
+ * If so, perhaps there should be a config_guess.h for them. Alternatively,
+ * config guesses could be placed above, just after the config.h exclusion.
+ */
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+# define HAVE_USB_JS 1
+# if defined(__NetBSD__) || ( defined(__FreeBSD__) && __FreeBSD_version >= 500000)
+# define HAVE_USBHID_H 1
+# endif
+#endif
+
+#if defined(_MSC_VER) || defined(__WATCOMC__)
+/* strdup() is non-standard, for all but POSIX-2001 */
+#define strdup _strdup
+#endif
+
+/* M_PI is non-standard (defined by BSD, not ISO-C) */
+#ifndef M_PI
+# define M_PI 3.14159265358979323846
+#endif
+
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+# ifndef TRUE
+# define TRUE true
+# endif
+# ifndef FALSE
+# define FALSE false
+# endif
+#else
+# ifndef TRUE
+# define TRUE 1
+# endif
+# ifndef FALSE
+# define FALSE 0
+# endif
+#endif
+
+/* General defines */
+
+#define INVALID_MODIFIERS 0xffffffff
+
+
+
+/* Platform-specific includes */
+#if TARGET_HOST_POSIX_X11
+#include "../x11/freeglut_internal_x11.h"
+#endif
+#if TARGET_HOST_MS_WINDOWS
+#include "../mswin/freeglut_internal_mswin.h"
+#endif
+
+
+/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */
+
+/* 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 );
+
+/* The global callbacks type definitions */
+typedef void (* FGCBIdle )( void );
+typedef void (* FGCBTimer )( int );
+typedef void (* FGCBMenuState )( int );
+typedef void (* FGCBMenuStatus )( int, int, int );
+
+/* The callback used when creating/using menus */
+typedef void (* FGCBMenu )( int );
+
+/* The FreeGLUT error/warning handler type definition */
+typedef void (* FGError ) ( const char *fmt, va_list ap);
+typedef void (* FGWarning ) ( const char *fmt, va_list ap);
+
+
+/* A list structure */
+typedef struct tagSFG_List SFG_List;
+struct tagSFG_List
+{
+ void *First;
+ void *Last;
+};
+
+/* A list node structure */
+typedef struct tagSFG_Node SFG_Node;
+struct tagSFG_Node
+{
+ void *Next;
+ void *Prev;
+};
+
+/* A helper structure holding two ints and a boolean */
+typedef struct tagSFG_XYUse SFG_XYUse;
+struct tagSFG_XYUse
+{
+ GLint X, Y; /* The two integers... */
+ GLboolean Use; /* ...and a single boolean. */
+};
+
+/*
+ * An enumeration containing the state of the GLUT execution:
+ * initializing, running, or stopping
+ */
+typedef enum
+{
+ GLUT_EXEC_STATE_INIT,
+ GLUT_EXEC_STATE_RUNNING,
+ GLUT_EXEC_STATE_STOP
+} fgExecutionState ;
+
+/* This structure holds different freeglut settings */
+typedef struct tagSFG_State SFG_State;
+struct tagSFG_State
+{
+ SFG_XYUse Position; /* The default windows' position */
+ SFG_XYUse Size; /* The default windows' size */
+ unsigned int DisplayMode; /* Display mode for new windows */
+
+ GLboolean Initialised; /* freeglut has been initialised */
+
+ int DirectContext; /* Direct rendering state */
+
+ GLboolean ForceIconic; /* New top windows are iconified */
+ GLboolean UseCurrentContext; /* New windows share with current */
+
+ GLboolean GLDebugSwitch; /* OpenGL state debugging switch */
+ GLboolean XSyncSwitch; /* X11 sync protocol switch */
+
+ int KeyRepeat; /* Global key repeat mode. */
+ int Modifiers; /* Current ALT/SHIFT/CTRL state */
+
+ GLuint FPSInterval; /* Interval between FPS printfs */
+ GLuint SwapCount; /* Count of glutSwapBuffer calls */
+ GLuint SwapTime; /* Time of last SwapBuffers */
+
+ unsigned long Time; /* Time that glutInit was called */
+ SFG_List Timers; /* The freeglut timer hooks */
+ SFG_List FreeTimers; /* The unused timer hooks */
+
+ FGCBIdle IdleCallback; /* The global idle callback */
+
+ int ActiveMenus; /* Num. of currently active menus */
+ FGCBMenuState MenuStateCallback; /* Menu callbacks are global */
+ FGCBMenuStatus MenuStatusCallback;
+
+ SFG_XYUse GameModeSize; /* Game mode screen's dimensions */
+ int GameModeDepth; /* The pixel depth for game mode */
+ int GameModeRefresh; /* The refresh rate for game mode */
+
+ int ActionOnWindowClose; /* Action when user closes window */
+
+ fgExecutionState ExecState; /* Used for GLUT termination */
+ char *ProgramName; /* Name of the invoking program */
+ GLboolean JoysticksInitialised; /* Only initialize if application calls for them */
+ int NumActiveJoysticks; /* Number of active joysticks -- if zero, don't poll joysticks */
+ GLboolean InputDevsInitialised; /* Only initialize if application calls for them */
+
+ int MouseWheelTicks; /* Number of ticks the mouse wheel has turned */
+
+ int AuxiliaryBufferNumber; /* Number of auxiliary buffers */
+ int SampleNumber; /* Number of samples per pixel */
+
+ int MajorVersion; /* Major OpenGL context version */
+ int MinorVersion; /* Minor OpenGL context version */
+ int ContextFlags; /* OpenGL context flags */
+ int ContextProfile; /* OpenGL context profile */
+ FGError ErrorFunc; /* User defined error handler */
+ FGWarning WarningFunc; /* User defined warning handler */
+};
+
+/* The structure used by display initialization in freeglut_init.c */
+typedef struct tagSFG_Display SFG_Display;
+struct tagSFG_Display
+{
+ SFG_PlatformDisplay pDisplay;
+
+ int ScreenWidth; /* The screen's width in pixels */
+ int ScreenHeight; /* The screen's height in pixels */
+ int ScreenWidthMM; /* The screen's width in milimeters */
+ int ScreenHeightMM; /* The screen's height in milimeters */
+};
+
+
+/* The user can create any number of timer hooks */
+typedef struct tagSFG_Timer SFG_Timer;
+struct tagSFG_Timer
+{
+ SFG_Node Node;
+ int ID; /* The timer ID integer */
+ FGCBTimer Callback; /* The timer callback */
+ long TriggerTime; /* The timer trigger time */
+};
+
+/*
+ * A window and its OpenGL context. The contents of this structure
+ * are highly dependant on the target operating system we aim at...
+ */
+typedef struct tagSFG_Context SFG_Context;
+struct tagSFG_Context
+{
+ SFG_WindowHandleType Handle; /* The window's handle */
+ SFG_WindowContextType Context; /* The window's OpenGL/WGL context */
+
+ SFG_PlatformContext pContext; /* The window's FBConfig (X11) or device context (Windows) */
+
+ int DoubleBuffered; /* Treat the window as double-buffered */
+};
+
+
+typedef struct tagSFG_WindowState SFG_WindowState;
+struct tagSFG_WindowState
+{
+ /* Note that on Windows, sizes always refer to the client area, thus without the window decorations */
+ int Width; /* Window's width in pixels */
+ int Height; /* The same about the height */
+
+ SFG_PlatformWindowState pWState; /* Window width/height (X11) or rectangle/style (Windows) from before a resize */
+
+ GLboolean Redisplay; /* Do we have to redisplay? */
+ GLboolean Visible; /* Is the window visible now */
+
+ int Cursor; /* The currently selected cursor */
+
+ long JoystickPollRate; /* The joystick polling rate */
+ long JoystickLastPoll; /* When the last poll happened */
+
+ int MouseX, MouseY; /* The most recent mouse position */
+
+ GLboolean IgnoreKeyRepeat; /* Whether to ignore key repeat. */
+ GLboolean KeyRepeating; /* Currently in repeat mode */
+
+ GLboolean NeedToResize; /* Do we need to resize the window? */
+
+ GLboolean IsFullscreen; /* is the window fullscreen? */
+};
+
+
+/*
+ * A generic function pointer. We should really use the GLUTproc type
+ * defined in freeglut_ext.h, but if we include that header in this file
+ * a bunch of other stuff (font-related) blows up!
+ */
+typedef void (*SFG_Proc)();
+
+
+/*
+ * SET_WCB() is used as:
+ *
+ * SET_WCB( window, cbname, func );
+ *
+ * ...where {window} is the freeglut window to set the callback,
+ * {cbname} is the window-specific callback to set,
+ * {func} is a function-pointer.
+ *
+ * Originally, {FETCH_WCB( ... ) = func} was rather sloppily used,
+ * but this can cause warnings because the FETCH_WCB() macro type-
+ * casts its result, and a type-cast value shouldn't be an lvalue.
+ *
+ * The {if( FETCH_WCB( ... ) != func )} test is to do type-checking
+ * and for no other reason. Since it's hidden in the macro, the
+ * ugliness is felt to be rather benign.
+ */
+#define SET_WCB(window,cbname,func) \
+do \
+{ \
+ if( FETCH_WCB( window, cbname ) != (SFG_Proc)(func) ) \
+ (((window).CallBacks[CB_ ## cbname]) = (SFG_Proc)(func)); \
+} while( 0 )
+
+/*
+ * FETCH_WCB() is used as:
+ *
+ * FETCH_WCB( window, cbname );
+ *
+ * ...where {window} is the freeglut window to fetch the callback from,
+ * {cbname} is the window-specific callback to fetch.
+ *
+ * The result is correctly type-cast to the callback function pointer
+ * type.
+ */
+#define FETCH_WCB(window,cbname) \
+ ((window).CallBacks[CB_ ## cbname])
+
+/*
+ * INVOKE_WCB() is used as:
+ *
+ * INVOKE_WCB( window, cbname, ( arg_list ) );
+ *
+ * ...where {window} is the freeglut window,
+ * {cbname} is the window-specific callback to be invoked,
+ * {(arg_list)} is the parameter list.
+ *
+ * The callback is invoked as:
+ *
+ * callback( arg_list );
+ *
+ * ...so the parentheses are REQUIRED in the {arg_list}.
+ *
+ * NOTE that it does a sanity-check and also sets the
+ * current window.
+ *
+ */
+#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: also WinCE? */
+#define INVOKE_WCB(window,cbname,arg_list) \
+do \
+{ \
+ if( FETCH_WCB( window, cbname ) ) \
+ { \
+ FGCB ## cbname func = (FGCB ## cbname)(FETCH_WCB( window, cbname )); \
+ fgSetWindow( &window ); \
+ func arg_list; \
+ } \
+} while( 0 )
+#else
+#define INVOKE_WCB(window,cbname,arg_list) \
+do \
+{ \
+ if( FETCH_WCB( window, cbname ) ) \
+ { \
+ fgSetWindow( &window ); \
+ ((FGCB ## cbname)FETCH_WCB( window, cbname )) arg_list; \
+ } \
+} while( 0 )
+#endif
+
+/*
+ * The window callbacks the user can supply us with. Should be kept portable.
+ *
+ * This enumeration provides the freeglut CallBack numbers.
+ * The symbolic constants are indices into a window's array of
+ * function callbacks. The names are formed by splicing a common
+ * prefix onto the callback's base name. (This was originally
+ * done so that an early stage of development could live side-by-
+ * side with the old callback code. The old callback code used
+ * the bare callback's name as a structure member, so I used a
+ * prefix for the array index name.)
+ *
+ * XXX For consistancy, perhaps the prefix should match the
+ * XXX FETCH* and INVOKE* macro suffices. I.e., WCB_, rather than
+ * XXX CB_.
+ */
+enum
+{
+ CB_Display,
+ CB_Reshape,
+ CB_Keyboard,
+ CB_KeyboardUp,
+ CB_Special,
+ CB_SpecialUp,
+ CB_Mouse,
+ CB_MouseWheel,
+ CB_Motion,
+ CB_Passive,
+ CB_Entry,
+ CB_Visibility,
+ CB_WindowStatus,
+ CB_Joystick,
+ CB_Destroy,
+
+ /* MPX-related */
+ CB_MultiEntry,
+ CB_MultiButton,
+ CB_MultiMotion,
+ CB_MultiPassive,
+
+ /* Presently ignored */
+ CB_Select,
+ CB_OverlayDisplay,
+ CB_SpaceMotion, /* presently implemented only on UNIX/X11 */
+ CB_SpaceRotation, /* presently implemented only on UNIX/X11 */
+ CB_SpaceButton, /* presently implemented only on UNIX/X11 */
+ CB_Dials,
+ CB_ButtonBox,
+ CB_TabletMotion,
+ CB_TabletButton,
+
+ /* Always make this the LAST one */
+ TOTAL_CALLBACKS
+};
+
+
+/* This structure holds the OpenGL rendering context for all the menu windows */
+typedef struct tagSFG_MenuContext SFG_MenuContext;
+struct tagSFG_MenuContext
+{
+ SFG_WindowContextType MContext; /* The menu window's WGL context */
+};
+
+/* This structure describes a menu */
+typedef struct tagSFG_Window SFG_Window;
+typedef struct tagSFG_MenuEntry SFG_MenuEntry;
+typedef struct tagSFG_Menu SFG_Menu;
+struct tagSFG_Menu
+{
+ SFG_Node Node;
+ void *UserData; /* User data passed back at callback */
+ int ID; /* The global menu ID */
+ SFG_List Entries; /* The menu entries list */
+ FGCBMenu Callback; /* The menu callback */
+ FGCBDestroy Destroy; /* Destruction callback */
+ GLboolean IsActive; /* Is the menu selected? */
+ int Width; /* Menu box width in pixels */
+ int Height; /* Menu box height in pixels */
+ int X, Y; /* Menu box raster position */
+
+ SFG_MenuEntry *ActiveEntry; /* Currently active entry in the menu */
+ SFG_Window *Window; /* Window for menu */
+ SFG_Window *ParentWindow; /* Window in which the menu is invoked */
+};
+
+/* This is a menu entry */
+struct tagSFG_MenuEntry
+{
+ SFG_Node Node;
+ int ID; /* The menu entry ID (local) */
+ int Ordinal; /* The menu's ordinal number */
+ char* Text; /* The text to be displayed */
+ SFG_Menu* SubMenu; /* Optional sub-menu tree */
+ GLboolean IsActive; /* Is the entry highlighted? */
+ int Width; /* Label's width in pixels */
+};
+
+/*
+ * A window, making part of freeglut windows hierarchy.
+ * Should be kept portable.
+ *
+ * NOTE that ActiveMenu is set to menu itself if the window is a menu.
+ */
+struct tagSFG_Window
+{
+ SFG_Node Node;
+ int ID; /* Window's ID number */
+
+ SFG_Context Window; /* Window and OpenGL context */
+ SFG_WindowState State; /* The window state */
+ SFG_Proc CallBacks[ TOTAL_CALLBACKS ]; /* Array of window callbacks */
+ void *UserData ; /* For use by user */
+
+ SFG_Menu* Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window */
+ SFG_Menu* ActiveMenu; /* The window's active menu */
+
+ SFG_Window* Parent; /* The parent to this window */
+ SFG_List Children; /* The subwindows d.l. list */
+
+ GLboolean IsMenu; /* Set to 1 if we are a menu */
+};
+
+
+/* A linked list structure of windows */
+typedef struct tagSFG_WindowList SFG_WindowList ;
+struct tagSFG_WindowList
+{
+ SFG_Node node;
+ SFG_Window *window ;
+};
+
+/* This holds information about all the windows, menus etc. */
+typedef struct tagSFG_Structure SFG_Structure;
+struct tagSFG_Structure
+{
+ SFG_List Windows; /* The global windows list */
+ SFG_List Menus; /* The global menus list */
+ SFG_List WindowsToDestroy;
+
+ SFG_Window* CurrentWindow; /* The currently set window */
+ SFG_Menu* CurrentMenu; /* Same, but menu... */
+
+ SFG_MenuContext* MenuContext; /* OpenGL rendering context for menus */
+
+ SFG_Window* GameModeWindow; /* The game mode window */
+
+ int WindowID; /* The new current window ID */
+ int MenuID; /* The new current menu ID */
+};
+
+/*
+ * This structure is used for the enumeration purposes.
+ * You can easily extend its functionalities by declaring
+ * a structure containing enumerator's contents and custom
+ * data, then casting its pointer to (SFG_Enumerator *).
+ */
+typedef struct tagSFG_Enumerator SFG_Enumerator;
+struct tagSFG_Enumerator
+{
+ GLboolean found; /* Used to terminate search */
+ void* data; /* Custom data pointer */
+};
+typedef void (* FGCBenumerator )( SFG_Window *, SFG_Enumerator * );
+
+/* The bitmap font structure */
+typedef struct tagSFG_Font SFG_Font;
+struct tagSFG_Font
+{
+ char* Name; /* The source font name */
+ int Quantity; /* Number of chars in font */
+ int Height; /* Height of the characters */
+ const GLubyte** Characters; /* The characters mapping */
+
+ float xorig, yorig; /* Relative origin of the character */
+};
+
+/* The stroke font structures */
+
+typedef struct tagSFG_StrokeVertex SFG_StrokeVertex;
+struct tagSFG_StrokeVertex
+{
+ GLfloat X, Y;
+};
+
+typedef struct tagSFG_StrokeStrip SFG_StrokeStrip;
+struct tagSFG_StrokeStrip
+{
+ int Number;
+ const SFG_StrokeVertex* Vertices;
+};
+
+typedef struct tagSFG_StrokeChar SFG_StrokeChar;
+struct tagSFG_StrokeChar
+{
+ GLfloat Right;
+ int Number;
+ const SFG_StrokeStrip* Strips;
+};
+
+typedef struct tagSFG_StrokeFont SFG_StrokeFont;
+struct tagSFG_StrokeFont
+{
+ char* Name; /* The source font name */
+ int Quantity; /* Number of chars in font */
+ GLfloat Height; /* Height of the characters */
+ const SFG_StrokeChar** Characters; /* The characters mapping */
+};
+
+
+/* -- JOYSTICK-SPECIFIC STRUCTURES AND TYPES ------------------------------- */
+/*
+ * Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c"
+ * interspersed
+ */
+
+#if TARGET_HOST_MACINTOSH
+# include <InputSprocket.h>
+#endif
+
+#if TARGET_HOST_MAC_OSX
+# include <mach/mach.h>
+# include <IOKit/IOkitLib.h>
+# include <IOKit/hid/IOHIDLib.h>
+#endif
+
+/* XXX It might be better to poll the operating system for the numbers of buttons and
+ * XXX axes and then dynamically allocate the arrays.
+ */
+#define _JS_MAX_BUTTONS 32
+
+#if TARGET_HOST_MACINTOSH
+# define _JS_MAX_AXES 9
+typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;
+struct tagSFG_PlatformJoystick
+{
+#define ISP_NUM_AXIS 9
+#define ISP_NUM_NEEDS 41
+ ISpElementReference isp_elem [ ISP_NUM_NEEDS ];
+ ISpNeed isp_needs [ ISP_NUM_NEEDS ];
+};
+#endif
+
+#if TARGET_HOST_MAC_OSX
+# define _JS_MAX_AXES 16
+typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;
+struct tagSFG_PlatformJoystick
+{
+ IOHIDDeviceInterface ** hidDev;
+ IOHIDElementCookie buttonCookies[41];
+ IOHIDElementCookie axisCookies[_JS_MAX_AXES];
+/* The next two variables are not used anywhere */
+/* long minReport[_JS_MAX_AXES],
+ * maxReport[_JS_MAX_AXES];
+ */
+};
+#endif
+
+
+/*
+ * Definition of "SFG_Joystick" structure -- based on JS's "jsJoystick" object class.
+ * See "js.h" lines 80-178.
+ */
+typedef struct tagSFG_Joystick SFG_Joystick;
+struct tagSFG_Joystick
+{
+ SFG_PlatformJoystick pJoystick;
+
+ int id;
+ GLboolean error;
+ char name [ 128 ];
+ int num_axes;
+ int num_buttons;
+
+ float dead_band[ _JS_MAX_AXES ];
+ float saturate [ _JS_MAX_AXES ];
+ float center [ _JS_MAX_AXES ];
+ float max [ _JS_MAX_AXES ];
+ float min [ _JS_MAX_AXES ];
+};
+
+
+
+/* -- GLOBAL VARIABLES EXPORTS --------------------------------------------- */
+
+/* Freeglut display related stuff (initialized once per session) */
+extern SFG_Display fgDisplay;
+
+/* Freeglut internal structure */
+extern SFG_Structure fgStructure;
+
+/* The current freeglut settings */
+extern SFG_State fgState;
+
+
+/* -- PRIVATE FUNCTION DECLARATIONS ---------------------------------------- */
+
+/*
+ * A call to this function makes us sure that the Display and Structure
+ * subsystems have been properly initialized and are ready to be used
+ */
+#define FREEGLUT_EXIT_IF_NOT_INITIALISED( string ) \
+ if ( ! fgState.Initialised ) \
+ { \
+ fgError ( " ERROR: Function <%s> called" \
+ " without first calling 'glutInit'.", (string) ) ; \
+ }
+
+#define FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED( string ) \
+ if ( ! fgState.Initialised ) \
+ { \
+ fgError ( " ERROR: Internal <%s> function called" \
+ " without first calling 'glutInit'.", (string) ) ; \
+ }
+
+#define FREEGLUT_INTERNAL_ERROR_EXIT( cond, string, function ) \
+ if ( ! ( cond ) ) \
+ { \
+ fgError ( " ERROR: Internal error <%s> in function %s", \
+ (string), (function) ) ; \
+ }
+
+/*
+ * Following definitions are somewhat similiar to GLib's,
+ * but do not generate any log messages:
+ */
+#define freeglut_return_if_fail( expr ) \
+ if( !(expr) ) \
+ return;
+#define freeglut_return_val_if_fail( expr, val ) \
+ if( !(expr) ) \
+ return val ;
+
+/*
+ * A call to those macros assures us that there is a current
+ * window set, respectively:
+ */
+#define FREEGLUT_EXIT_IF_NO_WINDOW( string ) \
+ if ( ! fgStructure.CurrentWindow && \
+ ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION ) ) \
+ { \
+ fgError ( " ERROR: Function <%s> called" \
+ " with no current window defined.", (string) ) ; \
+ }
+
+/*
+ * The deinitialize function gets called on glutMainLoop() end. It should clean up
+ * everything inside of the freeglut
+ */
+void fgDeinitialize( void );
+
+/*
+ * Those two functions are used to create/destroy the freeglut internal
+ * structures. This actually happens when calling glutInit() and when
+ * quitting the glutMainLoop() (which actually happens, when all windows
+ * have been closed).
+ */
+void fgCreateStructure( void );
+void fgDestroyStructure( void );
+
+/*
+ * Window creation, opening, closing and destruction.
+ * Also CallBack clearing/initialization.
+ * Defined in freeglut_structure.c, freeglut_window.c.
+ */
+SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,
+ GLboolean positionUse, int x, int y,
+ GLboolean sizeUse, int w, int h,
+ GLboolean gameMode, GLboolean isMenu );
+void fgSetWindow ( SFG_Window *window );
+void fgOpenWindow( SFG_Window* window, const char* title,
+ GLboolean positionUse, int x, int y,
+ GLboolean sizeUse, int w, int h,
+ GLboolean gameMode, GLboolean isSubWindow );
+void fgCloseWindow( SFG_Window* window );
+void fgAddToWindowDestroyList ( SFG_Window* window );
+void fgCloseWindows ();
+void fgDestroyWindow( SFG_Window* window );
+
+/* Menu creation and destruction. Defined in freeglut_structure.c */
+SFG_Menu* fgCreateMenu( FGCBMenu menuCallback );
+void fgDestroyMenu( SFG_Menu* menu );
+
+/* Joystick device management functions, defined in freeglut_joystick.c */
+int fgJoystickDetect( void );
+void fgInitialiseJoysticks( void );
+void fgJoystickClose( void );
+void fgJoystickPollWindow( SFG_Window* window );
+
+/* InputDevice Initialisation and Closure */
+int fgInputDeviceDetect( void );
+void fgInitialiseInputDevices( void );
+void fgInputDeviceClose( void );
+
+/* spaceball device functions, defined in freeglut_spaceball.c */
+void fgInitialiseSpaceball( void );
+void fgSpaceballClose( void );
+void fgSpaceballSetWindow( SFG_Window *window );
+
+int fgHasSpaceball( void );
+int fgSpaceballNumButtons( void );
+
+/* Setting the cursor for a given window */
+void fgSetCursor ( SFG_Window *window, int cursorID );
+
+/*
+ * Helper function to enumerate through all registered windows
+ * and one to enumerate all of a window's subwindows...
+ *
+ * The GFunc callback for those functions will be defined as:
+ *
+ * void enumCallback( gpointer window, gpointer enumerator );
+ *
+ * where window is the enumerated (sub)window pointer (SFG_Window *),
+ * and userData is the a custom user-supplied pointer. Functions
+ * are defined and exported from freeglut_structure.c file.
+ */
+void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator );
+void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,
+ SFG_Enumerator* enumerator );
+
+/*
+ * fgWindowByHandle returns a (SFG_Window *) value pointing to the
+ * first window in the queue matching the specified window handle.
+ * The function is defined in freeglut_structure.c file.
+ */
+SFG_Window* fgWindowByHandle( SFG_WindowHandleType hWindow );
+
+/*
+ * This function is similiar to the previous one, except it is
+ * looking for a specified (sub)window identifier. The function
+ * is defined in freeglut_structure.c file.
+ */
+SFG_Window* fgWindowByID( int windowID );
+
+/*
+ * Looks up a menu given its ID. This is easier than fgWindowByXXX
+ * as all menus are placed in a single doubly linked list...
+ */
+SFG_Menu* fgMenuByID( int menuID );
+
+/*
+ * The menu activation and deactivation the code. This is the meat
+ * of the menu user interface handling code...
+ */
+void fgUpdateMenuHighlight ( SFG_Menu *menu );
+GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,
+ int mouse_x, int mouse_y );
+void fgDeactivateMenu( SFG_Window *window );
+
+/*
+ * This function gets called just before the buffers swap, so that
+ * freeglut can display the pull-down menus via OpenGL. The function
+ * is defined in freeglut_menu.c file.
+ */
+void fgDisplayMenu( void );
+
+/* Elapsed time as per glutGet(GLUT_ELAPSED_TIME). */
+long fgElapsedTime( void );
+
+/* System time in milliseconds */
+long unsigned fgSystemTime(void);
+
+/* List functions */
+void fgListInit(SFG_List *list);
+void fgListAppend(SFG_List *list, SFG_Node *node);
+void fgListRemove(SFG_List *list, SFG_Node *node);
+int fgListLength(SFG_List *list);
+void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node);
+
+/* Error Message functions */
+void fgError( const char *fmt, ... );
+void fgWarning( const char *fmt, ... );
+
+SFG_Proc fgPlatformGetProcAddress( const char *procName );
+
+/* Window functions needed for Platform implementations */
+/* pushing attribute/value pairs into an array */
+#define ATTRIB(a) attributes[where++]=(a)
+#define ATTRIB_VAL(a,v) {ATTRIB(a); ATTRIB(v);}
+
+extern int fghIsLegacyContextVersionRequested( void );
+extern int fghMapBit( int mask, int from, int to );
+extern int fghIsLegacyContextRequested( void );
+extern void fghContextCreationError( void );
+extern int fghNumberOfAuxBuffersRequested( void );
+
+#endif /* FREEGLUT_INTERNAL_H */
+
+/*** END OF FILE ***/