X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_internal.h;h=540f75f593e46d490b8b8e6c804f5ca1e0fe8795;hb=e31cce4d7a8789dc9c0dc723c4c13e719ad2db86;hp=572600e95a704fe9e2574a25b5fd4e31c8f148ef;hpb=7fdce1253e14170b6cb933f13c1f2a1644c93793;p=freeglut diff --git a/src/freeglut_internal.h b/src/freeglut_internal.h index 572600e..540f75f 100644 --- a/src/freeglut_internal.h +++ b/src/freeglut_internal.h @@ -28,33 +28,42 @@ #ifndef FREEGLUT_INTERNAL_H #define FREEGLUT_INTERNAL_H -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include "config.h" #endif /* XXX Update these for each release! */ #define VERSION_MAJOR 2 -#define VERSION_MINOR 4 +#define VERSION_MINOR 7 #define VERSION_PATCH 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) && !defined(TARGET_HOST_SOLARIS) #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__) +#elif defined(__posix__) || defined(__unix__) || defined(__linux__) || defined(__sun) # define TARGET_HOST_POSIX_X11 1 -/* FIXME: no Macintosh support? -#if ... -# define TARGET_HOST_MAC_OSX 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 # error "Unrecognized target host!" -*/ + +#endif +#endif + +/* Detect both SunPro and gcc compilers on Sun Solaris */ +#if defined (__SVR4) && defined (__sun) +# define TARGET_HOST_SOLARIS 1 #endif #ifndef TARGET_HOST_MS_WINDOWS @@ -69,21 +78,24 @@ # 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. +/* All Win32 headers depend on the huge windows.h recursive include. + * Note: Lower-case header names are used, for best cross-platform + * compatibility. */ #if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) -# include -# include -# include +# include +# include +# include /* CYGWIN does not have tchar.h, but has TEXT(x), defined in winnt.h. */ # ifndef __CYGWIN__ # include @@ -101,28 +113,38 @@ # ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H # include # endif +# ifdef HAVE_X11_EXTENSIONS_XRANDR_H +# 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 /* These files should be available on every platform. */ -#include -#include #include #include #include #include +#include /* These are included based on autoconf directives. */ -#if HAVE_SYS_TYPES_H +#ifdef HAVE_SYS_TYPES_H # include #endif -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H # include #endif -#if TIME_WITH_SYS_TIME +#ifdef TIME_WITH_SYS_TIME # include # include -#elif HAVE_SYS_TIME_H +#elif defined(HAVE_SYS_TIME_H) # include #else # include @@ -143,12 +165,7 @@ #endif #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 +# define HAVE_VFPRINTF 1 #endif /* MinGW may lack a prototype for ChangeDisplaySettingsEx() (depending on the version?) */ @@ -172,12 +189,21 @@ LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID); # define M_PI 3.14159265358979323846 #endif -#ifndef TRUE -# define TRUE 1 -#endif - -#ifndef FALSE -# define FALSE 0 +#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 /* General defines */ @@ -212,6 +238,11 @@ typedef void (* FGCBTabletMotion )( int, int ); typedef void (* FGCBTabletButton )( int, int, int, int ); typedef void (* FGCBDestroy )( void ); +typedef void (* FGCBMultiEntry )( int, int ); +typedef void (* FGCBMultiButton )( int, int, int, int, int ); +typedef void (* FGCBMultiMotion )( int, int, int ); +typedef void (* FGCBMultiPassive )( int, int, int ); + /* The global callbacks type definitions */ typedef void (* FGCBIdle )( void ); typedef void (* FGCBTimer )( int ); @@ -221,6 +252,10 @@ typedef void (* FGCBMenuStatus )( int, int, int ); /* The callback used when creating/using menus */ typedef void (* FGCBMenu )( int ); +/* The FreeGLUT error/warning handler type definition */ +typedef void (* FGError ) ( const char *fmt, va_list ap); +typedef void (* FGWarning ) ( const char *fmt, va_list ap); + /* A list structure */ typedef struct tagSFG_List SFG_List; @@ -246,18 +281,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_MS_WINDOWS - DWORD Value; -#else - struct timeval Value; -#endif - GLboolean Set; -}; - /* * An enumeration containing the state of the GLUT execution: * initializing, running, or stopping @@ -294,7 +317,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 */ @@ -313,7 +336,20 @@ 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 */ + int NumActiveJoysticks; /* Number of active joysticks -- if zero, don't poll joysticks */ GLboolean InputDevsInitialised; /* Only initialize if application calls for them */ + + int MouseWheelTicks; /* Number of ticks the mouse wheel has turned */ + + 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 */ + FGError ErrorFunc; /* User defined error handler */ + FGWarning WarningFunc; /* User defined warning handler */ }; /* The structure used by display initialization in freeglut_init.c */ @@ -326,8 +362,16 @@ struct tagSFG_Display 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 HAVE_X11_EXTENSIONS_XRANDR_H + int prev_xsz, prev_ysz; + int prev_refresh; + int prev_size_valid; +#endif /* HAVE_X11_EXTENSIONS_XRANDR_H */ -#ifdef X_XF86VidModeGetModeLine +#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H /* * XF86VidMode may be compilable even if it fails at runtime. Therefore, * the validity of the VidMode has to be tracked @@ -337,14 +381,15 @@ struct tagSFG_Display int DisplayModeClock; /* The display mode's refresh rate */ int DisplayViewPortX; /* saved X location of the viewport */ int DisplayViewPortY; /* saved Y location of the viewport */ +#endif /* HAVE_X11_EXTENSIONS_XF86VMODE_H */ + int DisplayPointerX; /* saved X location of the pointer */ int DisplayPointerY; /* saved Y location of the pointer */ -#endif /* X_XF86VidModeGetModeLine */ - #elif TARGET_HOST_MS_WINDOWS - HINSTANCE Instance; /* The application's instance */ + HINSTANCE Instance; /* The application's instance */ DEVMODE DisplayMode; /* Desktop's display settings */ + char *DisplayName; /* Display name for multi display support*/ #endif @@ -392,7 +437,7 @@ struct tagSFG_Context SFG_WindowContextType Context; /* The window's OpenGL/WGL context */ #if TARGET_HOST_POSIX_X11 - XVisualInfo* VisualInfo; /* The window's visual information */ + GLXFBConfig* FBConfig; /* The window's FBConfig */ #elif TARGET_HOST_MS_WINDOWS HDC Device; /* The window's device context */ #endif @@ -404,10 +449,16 @@ struct tagSFG_Context typedef struct tagSFG_WindowState SFG_WindowState; struct tagSFG_WindowState { + /* Note that on Windows, sizes always refer to the client area, thus without the window decorations */ int Width; /* Window's width in pixels */ int Height; /* The same about the height */ +#if TARGET_HOST_POSIX_X11 int OldWidth; /* Window width from before a resize */ int OldHeight; /* " height " " " " */ +#elif TARGET_HOST_MS_WINDOWS + RECT OldRect; /* window rect - stored before the window is made fullscreen */ + DWORD OldStyle; /* window style - stored before the window is made fullscreen */ +#endif GLboolean Redisplay; /* Do we have to redisplay? */ GLboolean Visible; /* Is the window visible now */ @@ -422,8 +473,9 @@ 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? */ }; @@ -549,12 +601,18 @@ enum CB_Joystick, CB_Destroy, + /* MPX-related */ + CB_MultiEntry, + CB_MultiButton, + CB_MultiMotion, + CB_MultiPassive, + /* 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, @@ -569,10 +627,6 @@ enum typedef struct tagSFG_MenuContext SFG_MenuContext; struct tagSFG_MenuContext { -#if TARGET_HOST_POSIX_X11 - XVisualInfo* MVisualInfo; /* The window's visual information */ -#endif - SFG_WindowContextType MContext; /* The menu window's WGL context */ }; @@ -775,11 +829,12 @@ extern SFG_State fgState; * A call to those macros assures us that there is a current * window set, respectively: */ -#define FREEGLUT_EXIT_IF_NO_WINDOW( string ) \ - if ( ! fgStructure.CurrentWindow ) \ - { \ - fgError ( " ERROR: Function <%s> called" \ - " with no current window defined.", (string) ) ; \ +#define FREEGLUT_EXIT_IF_NO_WINDOW( string ) \ + if ( ! fgStructure.CurrentWindow && \ + ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION ) ) \ + { \ + fgError ( " ERROR: Function <%s> called" \ + " with no current window defined.", (string) ) ; \ } /* @@ -799,13 +854,14 @@ void fgDestroyStructure( void ); /* A helper function to check if a display mode is possible to use */ #if TARGET_HOST_POSIX_X11 -XVisualInfo* fgChooseVisual( void ); +GLXFBConfig* fgChooseFBConfig( int* numcfgs ); #endif /* The window procedure for Win32 events handling */ #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 @@ -816,12 +872,14 @@ 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 (); @@ -842,6 +900,19 @@ 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 ); @@ -861,6 +932,19 @@ void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator ); void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, SFG_Enumerator* enumerator ); +#if TARGET_HOST_MS_WINDOWS +/* + * Helper functions for getting client area from the window rect + * and the window rect from the client area given the style of the window + * (or a valid window pointer from which the style can be queried). + */ +void fghComputeWindowRectFromClientArea_UseStyle ( const DWORD windowStyle , RECT *clientRect, BOOL posIsOutside ); +void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside ); +void fghComputeClientAreaFromWindowRect ( const SFG_Window *window, RECT *windowRect, BOOL wantPosOutside ); +RECT fghGetClientArea ( const SFG_Window *window, BOOL wantPosOutside ); +void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth); +#endif + /* * fgWindowByHandle returns a (SFG_Window *) value pointing to the * first window in the queue matching the specified window handle. @@ -900,6 +984,9 @@ void fgDisplayMenu( 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); @@ -911,6 +998,26 @@ 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); + +/* Handler for X extension Events */ +#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H + void fgHandleExtensionEvents( XEvent * ev ); + void fgRegisterDevices( Display* dpy, Window* win ); +#endif + +#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 ***/