X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_internal.h;h=d8ae89ff9733417eed6f07b61490460457c43fb1;hb=32cd611201e666894e4bbbde6ba046a9667a9782;hp=adfcb1b06bb36da341f5b6d91e357c38e917547b;hpb=006650e1dd72e73249d41e2bcea8b1668262a999;p=freeglut diff --git a/src/freeglut_internal.h b/src/freeglut_internal.h index adfcb1b..d8ae89f 100644 --- a/src/freeglut_internal.h +++ b/src/freeglut_internal.h @@ -28,78 +28,180 @@ #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 2 -#define VERSION_MINOR 2 +#define VERSION_MINOR 7 #define VERSION_PATCH 0 -/* Freeglut is meant to be available under all Unix/X11 and Win32 platforms. */ -#if defined(_WIN32_WCE) -# define TARGET_HOST_UNIX_X11 0 -# define TARGET_HOST_WIN32 0 -# define TARGET_HOST_WINCE 1 -#elif defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) -# define TARGET_HOST_UNIX_X11 0 -# define TARGET_HOST_WIN32 1 -# define TARGET_HOST_WINCE 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) +#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__) +# 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 -# define TARGET_HOST_UNIX_X11 1 -# define TARGET_HOST_WIN32 0 -# define TARGET_HOST_WINCE 0 +# error "Unrecognized target host!" +*/ +#endif #endif -#define FREEGLUT_MAX_MENUS 3 +/* Detect both SunPro and gcc compilers on Sun Solaris */ +#if defined (__SVR4) && defined (__sun) +# define TARGET_HOST_SOLARIS 1 +#endif -/* Somehow all Win32 include headers depend on this one: */ -#if TARGET_HOST_WIN32 -#include -#include -#include -#include +#ifndef TARGET_HOST_MS_WINDOWS +# define TARGET_HOST_MS_WINDOWS 0 #endif -#if defined(_MSC_VER) -#define strdup _strdup +#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 + +/* -- PLATFORM-SPECIFIC INCLUDES ------------------------------------------- */ + +/* All Win32 headers depend on the huge Windows.h recursive include. + * Note: Let's use proper case for MS-Win headers. Even though it's + * not required due to case insensitivity, it's a good habit to keep + * because the cross-platform includes are case sensitive. + */ +#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) +# include +# include +# include +/* CYGWIN does not have tchar.h, but has TEXT(x), defined in winnt.h. */ +# ifndef __CYGWIN__ +# include +# else +# define _TEXT(x) TEXT(x) +# define _T(x) TEXT(x) +# endif + +#elif TARGET_HOST_POSIX_X11 +# include +# include +# include +# include +# include +# ifdef HAVE_XXF86VM +# include +# endif +/* If GLX is too old, we will fail during runtime when multisampling + is requested, but at least freeglut compiles. */ +# ifndef GLX_SAMPLE_BUFFERS +# define GLX_SAMPLE_BUFFERS 0x80A8 +# endif +# ifndef GLX_SAMPLES +# define GLX_SAMPLES 0x80A9 +# endif + #endif -/* Those files should be available on every platform. */ -#include -#include +/* These files should be available on every platform. */ #include #include #include #include -#include -#include -#if TARGET_HOST_UNIX_X11 -#include -#include + +/* These are included based on autoconf directives. */ +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif +#ifdef TIME_WITH_SYS_TIME +# include +# include +#elif defined(HAVE_SYS_TIME_H) +# include +#else +# include +#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 -/* The system-dependant include files should go here: */ -#if TARGET_HOST_UNIX_X11 - #include - #include - #include - #include +/* MinGW may lack a prototype for ChangeDisplaySettingsEx() (depending on the version?) */ +#if TARGET_HOST_MS_WINDOWS && !defined(ChangeDisplaySettingsEx) +LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID); +LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID); +# ifdef UNICODE +# define ChangeDisplaySettingsEx ChangeDisplaySettingsExW +# else +# define ChangeDisplaySettingsEx ChangeDisplaySettingsExA +# endif +#endif - #ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H - #include - #endif +#if defined(_MSC_VER) || defined(__WATCOMC__) +/* strdup() is non-standard, for all but POSIX-2001 */ +#define strdup _strdup #endif -/* Microsoft VisualC++ 5.0's does not define the PI */ +/* M_PI is non-standard (defined by BSD, not ISO-C) */ #ifndef M_PI # define M_PI 3.14159265358979323846 #endif -#ifndef TRUE -# define TRUE 1 +#ifdef HAVE_STDBOOL_H +# include +# 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 -#ifndef FALSE -# define FALSE 0 -#endif +/* General defines */ + +#define INVALID_MODIFIERS 0xffffffff /* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */ @@ -163,18 +265,6 @@ struct tagSFG_XYUse GLboolean Use; /* ...and a single boolean. */ }; -/* A helper structure holding a timeval and a boolean */ -typedef struct tagSFG_Time SFG_Time; -struct tagSFG_Time -{ -#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE - DWORD Value; -#else - struct timeval Value; -#endif - GLboolean Set; -}; - /* * An enumeration containing the state of the GLUT execution: * initializing, running, or stopping @@ -211,7 +301,7 @@ struct tagSFG_State GLuint SwapCount; /* Count of glutSwapBuffer calls */ GLuint SwapTime; /* Time of last SwapBuffers */ - SFG_Time Time; /* Time that glutInit was called */ + unsigned long Time; /* Time that glutInit was called */ SFG_List Timers; /* The freeglut timer hooks */ SFG_List FreeTimers; /* The unused timer hooks */ @@ -230,18 +320,29 @@ struct tagSFG_State fgExecutionState ExecState; /* Used for GLUT termination */ char *ProgramName; /* Name of the invoking program */ GLboolean JoysticksInitialised; /* Only initialize if application calls for them */ + GLboolean InputDevsInitialised; /* Only initialize if application calls for them */ + + 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 */ }; /* The structure used by display initialization in freeglut_init.c */ typedef struct tagSFG_Display SFG_Display; struct tagSFG_Display { -#if TARGET_HOST_UNIX_X11 +#if TARGET_HOST_POSIX_X11 Display* Display; /* The display we are being run in. */ int Screen; /* The screen we are about to use. */ Window RootWindow; /* The screen's root window. */ int Connection; /* The display's connection number */ Atom DeleteWindow; /* The window deletion atom */ + Atom State; /* The state atom */ + Atom StateFullScreen; /* The full screen atom */ #ifdef X_XF86VidModeGetModeLine /* @@ -256,9 +357,9 @@ struct tagSFG_Display int DisplayPointerX; /* saved X location of the pointer */ int DisplayPointerY; /* saved Y location of the pointer */ -#endif +#endif /* X_XF86VidModeGetModeLine */ -#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE +#elif TARGET_HOST_MS_WINDOWS HINSTANCE Instance; /* The application's instance */ DEVMODE DisplayMode; /* Desktop's display settings */ @@ -285,12 +386,12 @@ struct tagSFG_Timer * Make "freeglut" window handle and context types so that we don't need so * much conditionally-compiled code later in the library. */ -#if TARGET_HOST_UNIX_X11 +#if TARGET_HOST_POSIX_X11 typedef Window SFG_WindowHandleType ; typedef GLXContext SFG_WindowContextType ; -#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE +#elif TARGET_HOST_MS_WINDOWS typedef HWND SFG_WindowHandleType ; typedef HGLRC SFG_WindowContextType ; @@ -307,11 +408,9 @@ struct tagSFG_Context SFG_WindowHandleType Handle; /* The window's handle */ SFG_WindowContextType Context; /* The window's OpenGL/WGL context */ -#if TARGET_HOST_UNIX_X11 - XVisualInfo* VisualInfo; /* The window's visual information */ - Pixmap Pixmap; /* Used for offscreen rendering */ - /* GLXPixmap GLXPixMap; */ /* Used for offscreen rendering */ -#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE +#if TARGET_HOST_POSIX_X11 + GLXFBConfig* FBConfig; /* The window's FBConfig */ +#elif TARGET_HOST_MS_WINDOWS HDC Device; /* The window's device context */ #endif @@ -340,18 +439,27 @@ struct tagSFG_WindowState GLboolean IgnoreKeyRepeat; /* Whether to ignore key repeat. */ GLboolean KeyRepeating; /* Currently in repeat mode */ - GLboolean IsGameMode; /* Is this the game mode window? */ 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, Visibility, func ); + * SET_WCB( window, cbname, func ); * * ...where {window} is the freeglut window to set the callback, - * {Visibility} is the window-specific callback to set, + * {cbname} is the window-specific callback to set, * {func} is a function-pointer. * * Originally, {FETCH_WCB( ... ) = func} was rather sloppily used, @@ -365,36 +473,36 @@ struct tagSFG_WindowState #define SET_WCB(window,cbname,func) \ do \ { \ - if( FETCH_WCB( window, cbname ) != func ) \ - (((window).CallBacks[CB_ ## cbname]) = (void *) func); \ -} while( 0 ) \ + 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, Visibility ); + * FETCH_WCB( window, cbname ); * * ...where {window} is the freeglut window to fetch the callback from, - * {Visibility} is the window-specific callback to fetch. + * {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) \ - ((FGCB ## cbname)((window).CallBacks[CB_ ## cbname])) + ((window).CallBacks[CB_ ## cbname]) /* * INVOKE_WCB() is used as: * - * INVOKE_WCB( window, Visibility, ( status ) ); + * INVOKE_WCB( window, cbname, ( arg_list ) ); * * ...where {window} is the freeglut window, - * {Visibility} is the window-specific callback, - * {(status)} is the parameter list. + * {cbname} is the window-specific callback to be invoked, + * {(arg_list)} is the parameter list. * * The callback is invoked as: * - * callback( status ); + * callback( arg_list ); * * ...so the parentheses are REQUIRED in the {arg_list}. * @@ -402,15 +510,28 @@ do \ * 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 ); \ - FETCH_WCB( window, cbname ) arg_list; \ + ((FGCB ## cbname)FETCH_WCB( window, cbname )) arg_list; \ } \ } while( 0 ) +#endif /* * The window callbacks the user can supply us with. Should be kept portable. @@ -449,9 +570,9 @@ enum /* Presently ignored */ CB_Select, CB_OverlayDisplay, - CB_SpaceMotion, - CB_SpaceRotation, - CB_SpaceButton, + 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, @@ -466,11 +587,7 @@ enum typedef struct tagSFG_MenuContext SFG_MenuContext; struct tagSFG_MenuContext { -#if TARGET_HOST_UNIX_X11 - XVisualInfo* VisualInfo; /* The window's visual information */ -#endif - - SFG_WindowContextType Context; /* The menu window's WGL context */ + SFG_WindowContextType MContext; /* The menu window's WGL context */ }; /* This structure describes a menu */ @@ -492,7 +609,7 @@ struct tagSFG_Menu SFG_MenuEntry *ActiveEntry; /* Currently active entry in the menu */ SFG_Window *Window; /* Window for menu */ - SFG_Window *ParentWindow; /* Window in which the menu is defined */ + SFG_Window *ParentWindow; /* Window in which the menu is invoked */ }; /* This is a menu entry */ @@ -510,6 +627,8 @@ struct tagSFG_MenuEntry /* * 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 { @@ -518,7 +637,7 @@ struct tagSFG_Window SFG_Context Window; /* Window and OpenGL context */ SFG_WindowState State; /* The window state */ - void *CallBacks[ TOTAL_CALLBACKS ]; /* Array of window callbacks */ + 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 */ @@ -543,19 +662,19 @@ struct tagSFG_WindowList 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 Windows; /* The global windows list */ + SFG_List Menus; /* The global menus list */ SFG_List WindowsToDestroy; - SFG_Window* Window; /* The currently active win. */ - SFG_Menu* Menu; /* Same, but menu... */ + SFG_Window* CurrentWindow; /* The currently set window */ + SFG_Menu* CurrentMenu; /* Same, but menu... */ - SFG_MenuContext* MenuContext; /* OpenGL rendering context for menus */ + SFG_MenuContext* MenuContext; /* OpenGL rendering context for menus */ - SFG_Window* GameMode; /* The game mode window */ + SFG_Window* GameModeWindow; /* The game mode window */ - int WindowID; /* The new current window ID */ - int MenuID; /* The new current menu ID */ + int WindowID; /* The new current window ID */ + int MenuID; /* The new current menu ID */ }; /* @@ -634,7 +753,26 @@ extern SFG_State fgState; * 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_assert_ready assert( fgState.Initialised ); +#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, @@ -649,10 +787,14 @@ extern SFG_State fgState; /* * A call to those macros assures us that there is a current - * window and menu set, respectively: + * window set, respectively: */ -#define freeglut_assert_window assert( fgStructure.Window != NULL ); -#define freeglut_assert_menu assert( fgStructure.Menu != NULL ); +#define FREEGLUT_EXIT_IF_NO_WINDOW( string ) \ + if ( ! fgStructure.CurrentWindow ) \ + { \ + fgError ( " ERROR: Function <%s> called" \ + " with no current window defined.", (string) ) ; \ + } /* * The deinitialize function gets called on glutMainLoop() end. It should clean up @@ -670,14 +812,15 @@ void fgCreateStructure( void ); void fgDestroyStructure( void ); /* A helper function to check if a display mode is possible to use */ -#if TARGET_HOST_UNIX_X11 -XVisualInfo* fgChooseVisual( void ); +#if TARGET_HOST_POSIX_X11 +GLXFBConfig* fgChooseFBConfig( void ); #endif /* The window procedure for Win32 events handling */ -#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE +#if TARGET_HOST_MS_WINDOWS LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +void fgNewWGLCreateContext( SFG_Window* window ); GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, unsigned char layer_type ); #endif @@ -688,27 +831,50 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, * Defined in freeglut_structure.c, freeglut_window.c. */ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, - int x, int y, int w, int h, + 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, - int x, int y, int w, int h, GLboolean gameMode, - GLboolean isSubWindow ); + 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 ); -void fgClearCallBacks( 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 */ -void fgJoystickInit( int ident ); +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 ); + +#if TARGET_HOST_POSIX_X11 +int fgIsSpaceballXEvent( const XEvent *ev ); +void fgSpaceballHandleXEvent( const XEvent *ev ); +#endif + +/* 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... @@ -749,11 +915,10 @@ SFG_Menu* fgMenuByID( int menuID ); * The menu activation and deactivation the code. This is the meat * of the menu user interface handling code... */ -void fgActivateMenu( SFG_Window* window, int button ); -void fgExecuteMenuCallback( SFG_Menu* menu ); -GLboolean fgCheckActiveMenu ( SFG_Window *window, SFG_Menu *menu ); +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 ); -void fgDeactivateSubMenu( SFG_MenuEntry *menuEntry ); /* * This function gets called just before the buffers swap, so that @@ -762,15 +927,12 @@ void fgDeactivateSubMenu( SFG_MenuEntry *menuEntry ); */ void fgDisplayMenu( void ); -/* - * Display the mouse cursor using OpenGL calls. The function - * is defined in freeglut_cursor.c file. - */ -void fgDisplayCursor( 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); @@ -782,6 +944,19 @@ void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node); void fgError( const char *fmt, ... ); void fgWarning( const char *fmt, ... ); +/* + * Check if "hint" is present in "property" for "window". See freeglut_init.c + */ +#if TARGET_HOST_POSIX_X11 +int fgHintPresent(Window window, Atom property, Atom hint); +#endif + +SFG_Proc fghGetProcAddress( const char *procName ); + +#if TARGET_HOST_MS_WINDOWS +extern void (__cdecl *__glutExitFunc)( int return_value ); +#endif + #endif /* FREEGLUT_INTERNAL_H */ /*** END OF FILE ***/