/* XXX Update these for each release! */
#define VERSION_MAJOR 2
-#define VERSION_MINOR 2
+#define VERSION_MINOR 6
#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(_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
+
+/* FIXME: no Macintosh support?
+#if ...
+# 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
-#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 <windows.h>
-#include <windowsx.h>
-#include <mmsystem.h>
-#include <TCHAR.H>
+#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 <Windows.h>
+# include <WindowsX.h>
+# include <MMSystem.h>
+/* CYGWIN does not have tchar.h, but has TEXT(x), defined in winnt.h. */
+# ifndef __CYGWIN__
+# include <tchar.h>
+# else
+# define _TEXT(x) TEXT(x)
+# define _T(x) TEXT(x)
+# endif
+
+#elif TARGET_HOST_POSIX_X11
+# include <GL/glx.h>
+# include <X11/Xlib.h>
+# include <X11/Xatom.h>
+# include <X11/keysym.h>
+# include <X11/extensions/XInput.h>
+# ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
+# include <X11/extensions/xf86vmode.h>
+# 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 <GL/gl.h>
-#include <GL/glu.h>
+/* These files should be available on every platform. */
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
+
+/* These are included based on autoconf directives. */
#if HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
+#elif HAVE_SYS_TIME_H
+# include <sys/time.h>
#else
-# if HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-# include <time.h>
+# 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
-/* The system-dependant include files should go here: */
-#if TARGET_HOST_UNIX_X11
- #include <GL/glx.h>
- #include <X11/Xlib.h>
- #include <X11/Xatom.h>
- #include <X11/keysym.h>
+#if TARGET_HOST_MS_WINDOWS
+# define HAVE_VPRINTF 1
+#endif
+
+#if !defined(HAVE_VPRINTF) && !defined(HAVE_DOPRNT)
+/* XXX warning directive here? */
+# define HAVE_VPRINTF 1
+#endif
+
+/* 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 <X11/extensions/xf86vmode.h>
- #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 <math.h> 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
# define FALSE 0
#endif
+/* General defines */
+
+#define INVALID_MODIFIERS 0xffffffff
+
/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */
/* Freeglut callbacks type definitions */
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
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 */
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 */
};
/* 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
/*
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 */
* 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 ;
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
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? */
};
/*
+ * 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,
#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}.
*
* 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.
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 */
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 */
/*
* 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_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 */
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 */
};
/*
* window set, respectively:
*/
#define FREEGLUT_EXIT_IF_NO_WINDOW( string ) \
- if ( ! fgStructure.Window ) \
+ if ( ! fgStructure.CurrentWindow ) \
{ \
fgError ( " ERROR: Function <%s> called" \
" with no current window defined.", (string) ) ; \
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
* 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 fgJoystickClose( void );
void fgJoystickPollWindow( SFG_Window* window );
-/* More joystick functions. Should these go into the API? */
-int glutJoystickGetNumAxes( int ident );
-int glutJoystickGetNumButtons( int ident );
-int glutJoystickNotWorking( int ident );
+/* InputDevice Initialisation and Closure */
+int fgInputDeviceDetect( void );
+void fgInitialiseInputDevices( void );
+void fgInputDeviceClose( void );
+
+/* Setting the cursor for a given window */
+void fgSetCursor ( SFG_Window *window, int cursorID );
/*
* Helper function to enumerate through all registered windows
* 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 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
*/
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);
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 );
+
+#ifdef TARGET_HOST_MS_WINDOWS
+extern void (__cdecl *__glutExitFunc)( int return_value );
+#endif
+
#endif /* FREEGLUT_INTERNAL_H */
/*** END OF FILE ***/