X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_internal.h;h=adfcb1b06bb36da341f5b6d91e357c38e917547b;hb=006650e1dd72e73249d41e2bcea8b1668262a999;hp=03296e0e5886945ee748b0aa9a0d6af07297e00d;hpb=e6080379ee7fe7b1b86c325fe7459eded35775f2;p=freeglut diff --git a/src/freeglut_internal.h b/src/freeglut_internal.h index 03296e0..adfcb1b 100644 --- a/src/freeglut_internal.h +++ b/src/freeglut_internal.h @@ -31,43 +31,38 @@ /* XXX Update these for each release! */ #define VERSION_MAJOR 2 #define VERSION_MINOR 2 -#define VERSION_PATCH 0 +#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 #include +#include +#include +#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 #include #include @@ -81,9 +76,7 @@ #include #endif -/* - * The system-dependant include files should go here: - */ +/* The system-dependant include files should go here: */ #if TARGET_HOST_UNIX_X11 #include #include @@ -95,9 +88,7 @@ #endif #endif -/* - * Microsoft VisualC++ 5.0's does not define the PI - */ +/* Microsoft VisualC++ 5.0's does not define the PI */ #ifndef M_PI # define M_PI 3.14159265358979323846 #endif @@ -112,9 +103,7 @@ /* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */ -/* - * Freeglut callbacks type definitions - */ +/* Freeglut callbacks type definitions */ typedef void (* FGCBDisplay )( void ); typedef void (* FGCBReshape )( int, int ); typedef void (* FGCBVisibility )( int ); @@ -140,23 +129,17 @@ typedef void (* FGCBTabletMotion )( int, 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 { @@ -164,9 +147,7 @@ struct tagSFG_List void *Last; }; -/* - * A list node structure - */ +/* A list node structure */ typedef struct tagSFG_Node SFG_Node; struct tagSFG_Node { @@ -174,9 +155,7 @@ 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 { @@ -184,13 +163,11 @@ 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; @@ -209,9 +186,7 @@ typedef enum 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 { @@ -221,8 +196,7 @@ struct tagSFG_State 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 */ @@ -230,7 +204,7 @@ struct tagSFG_State GLboolean GLDebugSwitch; /* OpenGL state debugging switch */ GLboolean XSyncSwitch; /* X11 sync protocol switch */ - GLboolean IgnoreKeyRepeat; /* Whether to ignore key repeat. */ + int KeyRepeat; /* Global key repeat mode. */ int Modifiers; /* Current ALT/SHIFT/CTRL state */ GLuint FPSInterval; /* Interval between FPS printfs */ @@ -255,11 +229,10 @@ 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 */ }; -/* - * 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 { @@ -285,7 +258,7 @@ 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 */ @@ -298,9 +271,7 @@ struct tagSFG_Display }; -/* - * 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 { @@ -319,7 +290,7 @@ struct tagSFG_Timer typedef Window SFG_WindowHandleType ; typedef GLXContext SFG_WindowContextType ; -#elif TARGET_HOST_WIN32 +#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE typedef HWND SFG_WindowHandleType ; typedef HGLRC SFG_WindowContextType ; @@ -338,16 +309,16 @@ struct tagSFG_Context #if TARGET_HOST_UNIX_X11 XVisualInfo* VisualInfo; /* The window's visual information */ -#elif TARGET_HOST_WIN32 + 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 */ #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 { @@ -362,17 +333,43 @@ struct tagSFG_WindowState 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 */ + 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 ); @@ -459,15 +456,13 @@ enum 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 { @@ -478,9 +473,7 @@ struct tagSFG_MenuContext 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; @@ -502,9 +495,7 @@ struct tagSFG_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; @@ -540,24 +531,21 @@ struct tagSFG_Window }; -/* - * A linked list structure of windows - */ +/* A linked list structure of windows */ typedef struct tagSFG_WindowList SFG_WindowList ; struct tagSFG_WindowList { + SFG_Node node; SFG_Window *window ; - SFG_WindowList *next ; }; -/* - * 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... */ @@ -584,9 +572,7 @@ struct tagSFG_Enumerator }; typedef void (* FGCBenumerator )( SFG_Window *, SFG_Enumerator * ); -/* - * The bitmap font structure - */ +/* The bitmap font structure */ typedef struct tagSFG_Font SFG_Font; struct tagSFG_Font { @@ -598,9 +584,7 @@ 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 @@ -634,19 +618,13 @@ struct tagSFG_StrokeFont /* -- 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; @@ -677,11 +655,9 @@ extern SFG_State fgState; #define freeglut_assert_menu assert( fgStructure.Menu != NULL ); /* - * 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 ); /* @@ -693,17 +669,13 @@ 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, @@ -728,15 +700,11 @@ void fgCloseWindows (); void fgDestroyWindow( SFG_Window* window ); void fgClearCallBacks( 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 - */ +/* Joystick device management functions, defined in freeglut_joystick.c */ void fgJoystickInit( int ident ); void fgJoystickClose( void ); void fgJoystickPollWindow( SFG_Window* window ); @@ -800,23 +768,17 @@ void fgDisplayMenu( void ); */ 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, ... );