X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_internal.h;h=0427784c1b837c0c8e080bef130e47d850ddc1e4;hb=4f58e4f75c3d57437da215f4119e9991b77272e0;hp=31e7681b70a931f60e4a4cfaa61b1dd58d3f9cfe;hpb=99532b98a9b24cbf41fdf83789f74fef2dbc8b6c;p=freeglut diff --git a/src/freeglut_internal.h b/src/freeglut_internal.h index 31e7681..0427784 100644 --- a/src/freeglut_internal.h +++ b/src/freeglut_internal.h @@ -30,18 +30,18 @@ /* 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 -# define TARGET_HOST_WIN32 0 -#else +#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) # define TARGET_HOST_UNIX_X11 0 # define TARGET_HOST_WIN32 1 +#else +# define TARGET_HOST_UNIX_X11 1 +# define TARGET_HOST_WIN32 0 #endif #define FREEGLUT_MAX_MENUS 3 @@ -61,7 +61,10 @@ #if TARGET_HOST_WIN32 #include #include +#include +#endif +#if defined(_MSC_VER) #define strdup _strdup #endif @@ -77,6 +80,7 @@ #include #include #if TARGET_HOST_UNIX_X11 +#include #include #endif @@ -203,10 +207,10 @@ struct tagSFG_Time */ 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 @@ -218,7 +222,7 @@ 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? */ @@ -229,8 +233,8 @@ struct tagSFG_State 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 */ @@ -238,6 +242,7 @@ struct tagSFG_State 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 */ @@ -309,22 +314,37 @@ 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 + +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 */ - + Pixmap Pixmap; /* Used for offscreen rendering */ + /* GLXPixmap GLXPixMap; */ /* Used for offscreen rendering */ #elif TARGET_HOST_WIN32 - HWND Handle; /* The window's handle */ HDC Device; /* The window's device context */ - HGLRC Context; /* The window's WGL context */ - #endif int DoubleBuffered; /* Treat the window as double-buffered */ @@ -338,6 +358,8 @@ 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 */ @@ -345,19 +367,44 @@ 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 */ -#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? */ + GLboolean IsOffscreen; /* Tags a `window' as on/offscreen. */ }; /* + * 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 ); @@ -444,7 +491,7 @@ enum CB_ButtonBox, CB_TabletMotion, CB_TabletButton, - + /* Always make this the LAST one */ TOTAL_CALLBACKS }; @@ -457,12 +504,10 @@ 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 */ }; /* @@ -530,12 +575,11 @@ struct tagSFG_Window /* * A linked list structure of windows */ -typedef struct tagSFG_WindowList SFG_WindowList; +typedef struct tagSFG_WindowList SFG_WindowList ; struct tagSFG_WindowList { - SFG_Window *window; - GLboolean needToClose; - SFG_WindowList *next; + SFG_Node node; + SFG_Window *window ; }; /* @@ -546,6 +590,7 @@ 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... */ @@ -655,7 +700,7 @@ 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 @@ -705,16 +750,15 @@ 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 fgAddToWindowDestroyList ( SFG_Window* window ); +void fgCloseWindows (); +void fgDestroyWindow( SFG_Window* window ); void fgClearCallBacks( SFG_Window *window ); /* @@ -751,11 +795,7 @@ void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, * 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 @@ -765,7 +805,7 @@ void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, 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 ); @@ -805,6 +845,7 @@ 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