X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_internal.h;h=540f75f593e46d490b8b8e6c804f5ca1e0fe8795;hb=1a159971346b45c5d25c75176095f38606c6892d;hp=c3c933fccd7185f4bbaab454b087f894ef12b12e;hpb=239fb8d05411623e824c5623622ce9d3c114d5e4;p=freeglut diff --git a/src/freeglut_internal.h b/src/freeglut_internal.h index c3c933f..540f75f 100644 --- a/src/freeglut_internal.h +++ b/src/freeglut_internal.h @@ -47,7 +47,7 @@ || ( 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 #elif defined(__APPLE__) @@ -110,9 +110,12 @@ # include # include # include -# ifdef HAVE_XXF86VM +# 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 @@ -129,6 +132,7 @@ #include #include #include +#include /* These are included based on autoconf directives. */ #ifdef HAVE_SYS_TYPES_H @@ -234,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 ); @@ -243,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; @@ -326,6 +339,8 @@ struct tagSFG_State 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 */ @@ -333,6 +348,8 @@ struct tagSFG_State 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 */ @@ -348,7 +365,13 @@ struct tagSFG_Display Atom State; /* The state atom */ Atom StateFullScreen; /* The full screen atom */ -#ifdef X_XF86VidModeGetModeLine +#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 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 @@ -358,13 +381,13 @@ 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*/ @@ -426,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 */ @@ -572,6 +601,12 @@ enum CB_Joystick, CB_Destroy, + /* MPX-related */ + CB_MultiEntry, + CB_MultiButton, + CB_MultiMotion, + CB_MultiPassive, + /* Presently ignored */ CB_Select, CB_OverlayDisplay, @@ -794,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) ) ; \ } /* @@ -818,7 +854,7 @@ void fgDestroyStructure( void ); /* A helper function to check if a display mode is possible to use */ #if TARGET_HOST_POSIX_X11 -GLXFBConfig* fgChooseFBConfig( void ); +GLXFBConfig* fgChooseFBConfig( int* numcfgs ); #endif /* The window procedure for Win32 events handling */ @@ -896,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. @@ -954,6 +1003,13 @@ void fgWarning( const char *fmt, ... ); */ #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 );