/* XXX Update these for each release! */
#define VERSION_MAJOR 2
-#define VERSION_MINOR 0
-#define VERSION_PATCH 0
+#define VERSION_MINOR 2
+#define VERSION_PATCH 0
-/*
- * Freeglut is meant to be available under all Unix/X11 and Win32 platforms.
- */
-#if !defined(_WIN32)
-# define TARGET_HOST_UNIX_X11 1
+/* 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
-#else
+# 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
+#else
+# define TARGET_HOST_UNIX_X11 1
+# define TARGET_HOST_WIN32 0
+# define TARGET_HOST_WINCE 0
#endif
#define FREEGLUT_MAX_MENUS 3
-#define FREEGLUT_DEBUG 1
-
-#if FREEGLUT_DEBUG
- #undef G_DISABLE_ASSERT
- #undef G_DISABLE_CHECKS
-#else
- #define G_DISABLE_ASSERT
- #define G_DISABLE_CHECKS
-#endif
-/*
- * Somehow all Win32 include headers depend on this one:
- */
+/* 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>
+#endif
+#if defined(_MSC_VER)
#define strdup _strdup
#endif
-/*
- * Those files should be available on every platform.
- */
+/* Those files should be available on every platform. */
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>
#include <sys/time.h>
#endif
-/*
- * The system-dependant include files should go here:
- */
+/* The system-dependant include files should go here: */
#if TARGET_HOST_UNIX_X11
#include <GL/glx.h>
#include <X11/Xlib.h>
#endif
#endif
-/*
- * Microsoft VisualC++ 5.0's <math.h> does not define the PI
- */
+/* Microsoft VisualC++ 5.0's <math.h> does not define the PI */
#ifndef M_PI
# define M_PI 3.14159265358979323846
#endif
/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */
-/*
- * Freeglut callbacks type definitions
- */
+/* Freeglut callbacks type definitions */
typedef void (* FGCBDisplay )( void );
typedef void (* FGCBReshape )( int, int );
typedef void (* FGCBVisibility )( int );
typedef void (* FGCBTabletButton )( int, int, int, int );
typedef void (* FGCBDestroy )( void );
-/*
- * The global callbacks type definitions
- */
+/* 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
- */
+/* The callback used when creating/using menus */
typedef void (* FGCBMenu )( int );
-/*
- * A list structure
- */
+/* A list structure */
typedef struct tagSFG_List SFG_List;
struct tagSFG_List
{
void *Last;
};
-/*
- * A list node structure
- */
+/* A list node structure */
typedef struct tagSFG_Node SFG_Node;
struct tagSFG_Node
{
void *Prev;
};
-/*
- * A helper structure holding two ints and a boolean
- */
+/* A helper structure holding two ints and a boolean */
typedef struct tagSFG_XYUse SFG_XYUse;
struct tagSFG_XYUse
{
GLboolean Use; /* ...and a single boolean. */
};
-/*
- * A helper structure holding a timeval and a boolean
- */
+/* A helper structure holding a timeval and a boolean */
typedef struct tagSFG_Time SFG_Time;
struct tagSFG_Time
{
-#ifdef WIN32
+#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE
DWORD Value;
#else
struct timeval Value;
*/
typedef enum
{
- GLUT_EXEC_STATE_INIT,
- GLUT_EXEC_STATE_RUNNING,
- GLUT_EXEC_STATE_STOP
-} fgExecutionState;
+ GLUT_EXEC_STATE_INIT,
+ GLUT_EXEC_STATE_RUNNING,
+ GLUT_EXEC_STATE_STOP
+} fgExecutionState ;
-/*
- * This structure holds different freeglut settings
- */
+/* This structure holds different freeglut settings */
typedef struct tagSFG_State SFG_State;
struct tagSFG_State
{
SFG_XYUse Size; /* The default windows' size */
unsigned int DisplayMode; /* Display mode for new windows */
- GLboolean Initialised; /* Freeglut has been initialised */
+ GLboolean Initialised; /* freeglut has been initialised */
- GLboolean ForceDirectContext; /* Force direct rendering? */
- GLboolean TryDirectContext; /* What about giving a try to? */
+ 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 */
- GLboolean IgnoreKeyRepeat; /* Whether to ignore key repeat. */
- int Modifiers; /* Current ALT/SHIFT/CTRL state */
+ 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 */
SFG_Time 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 */
fgExecutionState ExecState; /* Used for GLUT termination */
char *ProgramName; /* Name of the invoking program */
+ GLboolean JoysticksInitialised; /* Only initialize if application calls for them */
};
-/*
- * The structure used by display initialization in freeglut_init.c
- */
+/* The structure used by display initialization in freeglut_init.c */
typedef struct tagSFG_Display SFG_Display;
struct tagSFG_Display
{
#endif
-#elif TARGET_HOST_WIN32
+#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
HINSTANCE Instance; /* The application's instance */
DEVMODE DisplayMode; /* Desktop's display settings */
};
-/*
- * The user can create any number of timer hooks
- */
+/* The user can create any number of timer hooks */
typedef struct tagSFG_Timer SFG_Timer;
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
+
+typedef Window SFG_WindowHandleType ;
+typedef GLXContext SFG_WindowContextType ;
+
+#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
+
+typedef HWND SFG_WindowHandleType ;
+typedef HGLRC SFG_WindowContextType ;
+
+#endif
+
+/*
* 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 */
+
#if TARGET_HOST_UNIX_X11
- Window Handle; /* The window's handle */
- GLXContext Context; /* The OpenGL context */
XVisualInfo* VisualInfo; /* The window's visual information */
-
-#elif TARGET_HOST_WIN32
- HWND Handle; /* The window's handle */
+ Pixmap Pixmap; /* Used for offscreen rendering */
+ /* GLXPixmap GLXPixMap; */ /* Used for offscreen rendering */
+#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
HDC Device; /* The window's device context */
- HGLRC Context; /* The window's WGL context */
-
#endif
int DoubleBuffered; /* Treat the window as double-buffered */
};
-/*
- * Window's state description. This structure should be kept portable.
- */
+/* Window's state description. This structure should be kept portable. */
typedef struct tagSFG_WindowState SFG_WindowState;
struct tagSFG_WindowState
{
int Width; /* Window's width in pixels */
int Height; /* The same about the height */
+ int OldWidth; /* Window width from before a resize */
+ int OldHeight; /* " height " " " " */
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 has happened */
+ long JoystickLastPoll; /* When the last poll happened */
int MouseX, MouseY; /* The most recent mouse position */
- GLboolean IsGameMode; /* Is this the game mode window? */
+ GLboolean IgnoreKeyRepeat; /* Whether to ignore key repeat. */
+ GLboolean KeyRepeating; /* Currently in repeat mode */
-#if TARGET_HOST_WIN32
- GLboolean NeedToResize; /* Do we need to explicitly resize? */
-#endif
+ GLboolean IsGameMode; /* Is this the game mode window? */
+ GLboolean NeedToResize; /* Do we need to resize the window? */
};
/*
+ * SET_WCB() is used as:
+ *
+ * SET_WCB( window, Visibility, func );
+ *
+ * ...where {window} is the freeglut window to set the callback,
+ * {Visibility} 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 ) != func ) \
+ (((window).CallBacks[CB_ ## cbname]) = (void *) func); \
+} while( 0 ) \
+
+/*
* FETCH_WCB() is used as:
*
* FETCH_WCB( window, Visibility );
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
- */
+/* This structure holds the OpenGL rendering context for all the menu windows */
typedef struct tagSFG_MenuContext SFG_MenuContext;
struct tagSFG_MenuContext
{
#if TARGET_HOST_UNIX_X11
- GLXContext Context; /* The menu OpenGL context */
XVisualInfo* VisualInfo; /* The window's visual information */
-#elif TARGET_HOST_WIN32
- HGLRC Context; /* The menu window's WGL context */
#endif
+ SFG_WindowContextType Context; /* The menu window's WGL context */
};
-/*
- * This structure describes a menu
- */
+/* This structure describes a menu */
typedef struct tagSFG_Window SFG_Window;
typedef struct tagSFG_MenuEntry SFG_MenuEntry;
typedef struct tagSFG_Menu SFG_Menu;
SFG_Window *ParentWindow; /* Window in which the menu is defined */
};
-/*
- * This is a menu entry
- */
+/* This is a menu entry */
struct tagSFG_MenuEntry
{
SFG_Node Node;
};
-/*
- * A linked list structure of windows
- */
-typedef struct tagSFG_WindowList SFG_WindowList;
+/* A linked list structure of windows */
+typedef struct tagSFG_WindowList SFG_WindowList ;
struct tagSFG_WindowList
{
- SFG_Window *window;
- GLboolean needToClose;
- SFG_WindowList *next;
+ SFG_Node node;
+ SFG_Window *window ;
};
-/*
- * This holds information about all the windows, menus etc.
- */
+/* 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* Window; /* The currently active win. */
SFG_Menu* Menu; /* Same, but menu... */
};
typedef void (* FGCBenumerator )( SFG_Window *, SFG_Enumerator * );
-/*
- * The bitmap font structure
- */
+/* The bitmap font structure */
typedef struct tagSFG_Font SFG_Font;
struct tagSFG_Font
{
float xorig, yorig; /* Relative origin of the character */
};
-/*
- * The stroke font structures
- */
+/* The stroke font structures */
typedef struct tagSFG_StrokeVertex SFG_StrokeVertex;
struct tagSFG_StrokeVertex
/* -- GLOBAL VARIABLES EXPORTS --------------------------------------------- */
-/*
- * Freeglut display related stuff (initialized once per session)
- */
+/* Freeglut display related stuff (initialized once per session) */
extern SFG_Display fgDisplay;
-/*
- * Freeglut internal structure
- */
+/* Freeglut internal structure */
extern SFG_Structure fgStructure;
-/*
- * The current freeglut settings
- */
+/* The current freeglut settings */
extern SFG_State fgState;
return;
#define freeglut_return_val_if_fail( expr, val ) \
if( !(expr) ) \
- return val;
+ return val ;
/*
* A call to those macros assures us that there is a current
* window and menu 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.Window ) \
+ { \
+ fgError ( " ERROR: Function <%s> called" \
+ " with no current window defined.", (string) ) ; \
+ }
/*
- * The initialize and deinitialize functions get called on glutInit()
- * and glutMainLoop() end respectively. They should create/clean up
+ * The deinitialize function gets called on glutMainLoop() end. It should clean up
* everything inside of the freeglut
*/
-void fgInitialize( const char* displayName );
void fgDeinitialize( void );
/*
void fgCreateStructure( void );
void fgDestroyStructure( void );
-/*
- * A helper function to check if a display mode is possible to use
- */
+/* A helper function to check if a display mode is possible to use */
#if TARGET_HOST_UNIX_X11
XVisualInfo* fgChooseVisual( void );
#endif
-/*
- * The window procedure for Win32 events handling
- */
-#if TARGET_HOST_WIN32
+/* The window procedure for Win32 events handling */
+#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE
LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam );
GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
*/
SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,
int x, int y, int w, int h,
- GLboolean gameMode, GLboolean isMenu );
+ 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 );
void fgCloseWindow( SFG_Window* window );
-void fgAddToWindowDestroyList ( SFG_Window* window,
- GLboolean needToClose );
-void fgCloseWindows( );
-void fgDestroyWindow( SFG_Window* window, GLboolean needToClose );
-void fgClearCallBacks( SFG_Window *window );
+void fgAddToWindowDestroyList ( SFG_Window* window );
+void fgCloseWindows ();
+void fgDestroyWindow( SFG_Window* window );
-/*
- * Menu creation and destruction. Defined in freeglut_structure.c
- */
+/* 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 );
+/* Joystick device management functions, defined in freeglut_joystick.c */
+int fgJoystickDetect( void );
+void fgInitialiseJoysticks( void );
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 );
+
/*
* Helper function to enumerate through all registered windows
* and one to enumerate all of a window's subwindows...
* first window in the queue matching the specified window handle.
* The function is defined in freeglut_structure.c file.
*/
-#if TARGET_HOST_UNIX_X11
- SFG_Window* fgWindowByHandle( Window hWindow );
-#elif TARGET_HOST_WIN32
- SFG_Window* fgWindowByHandle( HWND hWindow );
-#endif
+SFG_Window* fgWindowByHandle( SFG_WindowHandleType hWindow );
/*
* This function is similiar to the previous one, except it is
SFG_Window* fgWindowByID( int windowID );
/*
- * Looks up a menu given its ID. This is easier that fgWindowByXXX
+ * 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 );
*/
void fgDisplayCursor( void );
-/*
- * Elapsed time as per glutGet(GLUT_ELAPSED_TIME).
- */
+/* Elapsed time as per glutGet(GLUT_ELAPSED_TIME). */
long fgElapsedTime( void );
-/*
- * List functions
- */
+/* 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 Messages functions
- */
+/* Error Message functions */
void fgError( const char *fmt, ... );
void fgWarning( const char *fmt, ... );