X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_internal.h;h=f6c31edfd803a064a9ccce67dd51330721894653;hb=fe573d6af98de430357a7321cd50f5e92e9a2aab;hp=80e88b3e3a9477f5b2b5034eea0601545525c6ca;hpb=e9a96a71a2feff9da7ccae395c5f316e67af3bd0;p=freeglut diff --git a/src/freeglut_internal.h b/src/freeglut_internal.h index 80e88b3..f6c31ed 100644 --- a/src/freeglut_internal.h +++ b/src/freeglut_internal.h @@ -37,53 +37,82 @@ #define VERSION_MINOR 4 #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 -#else -# define TARGET_HOST_UNIX_X11 1 -# define TARGET_HOST_WIN32 0 -# define TARGET_HOST_WINCE 0 -#endif - -#define FREEGLUT_MAX_MENUS 3 +/* 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 -/* Somehow all Win32 include headers depend on this one: */ -#if TARGET_HOST_WIN32 -#include -#include -#include -#include +#elif defined(__posix__) || defined(__unix__) || defined(__linux__) +# define TARGET_HOST_POSIX_X11 1 -/* TODO: MinGW is lacking a prototype, this should better be handled via autoconf! */ -#ifndef ChangeDisplaySettingsEx -LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID); -LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID); -#ifdef UNICODE -#define ChangeDisplaySettingsEx ChangeDisplaySettingsExW +/* FIXME: no Macintosh support? +#if ... +# define TARGET_HOST_MAC_OSX 1 #else -#define ChangeDisplaySettingsEx ChangeDisplaySettingsExA +# error "Unrecognized target host!" +*/ #endif + +#ifndef TARGET_HOST_MS_WINDOWS +# define TARGET_HOST_MS_WINDOWS 0 #endif + +#ifndef TARGET_HOST_POSIX_X11 +# define TARGET_HOST_POSIX_X11 0 #endif -#if defined(_MSC_VER) -#define strdup _strdup +#ifndef TARGET_HOST_MAC_OSX +# define TARGET_HOST_MAC_OSX 0 #endif -/* Those files should be available on every platform. */ +/* -- 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 +# include +# include +/* CYGWIN does not have tchar.h, but has TEXT(x), defined in winnt.h. */ +# ifndef __CYGWIN__ +# include +# else +# define _TEXT(x) TEXT(x) +# define _T(x) TEXT(x) +# endif + +#elif TARGET_HOST_POSIX_X11 +# include +# include +# include +# include +# include +# ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H +# include +# endif + +#endif + +/* These files should be available on every platform. */ #include #include #include #include #include #include + +/* These are included based on autoconf directives. */ #if HAVE_SYS_TYPES_H # include #endif @@ -93,27 +122,52 @@ LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID); #if TIME_WITH_SYS_TIME # include # include +#elif HAVE_SYS_TIME_H +# include #else -# if HAVE_SYS_TIME_H -# include -# else -# include +# include +#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 - #include - #include - #include +#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 - #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 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 @@ -126,6 +180,8 @@ LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID); # define FALSE 0 #endif +/* General defines */ + #define INVALID_MODIFIERS 0xffffffff /* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */ @@ -190,18 +246,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_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 @@ -238,7 +282,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 */ @@ -264,7 +308,7 @@ struct tagSFG_State 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. */ @@ -284,9 +328,9 @@ struct tagSFG_Display 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 */ @@ -313,12 +357,12 @@ 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 +#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 ; @@ -335,9 +379,9 @@ struct tagSFG_Context SFG_WindowHandleType Handle; /* The window's handle */ SFG_WindowContextType Context; /* The window's OpenGL/WGL context */ -#if TARGET_HOST_UNIX_X11 +#if TARGET_HOST_POSIX_X11 XVisualInfo* VisualInfo; /* The window's visual information */ -#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE +#elif TARGET_HOST_MS_WINDOWS HDC Device; /* The window's device context */ #endif @@ -366,7 +410,6 @@ 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? */ }; @@ -436,7 +479,7 @@ do \ * current window. * */ -#if TARGET_HOST_WIN32 +#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: also WinCE? */ #define INVOKE_WCB(window,cbname,arg_list) \ do \ { \ @@ -513,11 +556,11 @@ enum typedef struct tagSFG_MenuContext SFG_MenuContext; struct tagSFG_MenuContext { -#if TARGET_HOST_UNIX_X11 - XVisualInfo* VisualInfo; /* The window's visual information */ +#if TARGET_HOST_POSIX_X11 + XVisualInfo* MVisualInfo; /* 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 */ @@ -592,19 +635,19 @@ struct tagSFG_WindowList 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* CurrentWindow; /* The currently set window */ - SFG_Menu* CurrentMenu; /* 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 */ }; /* @@ -742,12 +785,12 @@ void fgCreateStructure( void ); void fgDestroyStructure( void ); /* A helper function to check if a display mode is possible to use */ -#if TARGET_HOST_UNIX_X11 +#if TARGET_HOST_POSIX_X11 XVisualInfo* fgChooseVisual( 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 ); GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, @@ -760,12 +803,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 (); @@ -781,12 +826,7 @@ 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 ); - -/* InputDevice Init/Fini */ +/* InputDevice Initialisation and Closure */ int fgInputDeviceDetect( void ); void fgInitialiseInputDevices( void ); void fgInputDeviceClose( void ); @@ -849,6 +889,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);