* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+#define FREEGLUT_BUILDING_LIB
#include <GL/freeglut.h>
#include "freeglut_internal.h"
GLUT_EXEC_STATE_INIT, /* ExecState */
NULL, /* ProgramName */
GL_FALSE, /* JoysticksInitialised */
+ 0, /* NumActiveJoysticks */
GL_FALSE, /* InputDevsInitialised */
- 0, /* AuxiliaryBufferNumber */
- 0 /* SampleNumber */
+ 0, /* MouseWheelTicks */
+ 1, /* AuxiliaryBufferNumber */
+ 4, /* SampleNumber */
+ 1, /* MajorVersion */
+ 0, /* MinorVersion */
+ 0, /* ContextFlags */
+ 0, /* ContextProfile */
+ NULL, /* ErrorFunc */
+ NULL /* WarningFunc */
};
/* Check if "hint" is present in "property" for "window". */
int fgHintPresent(Window window, Atom property, Atom hint)
{
- Atom ** atoms_ptr;
+ Atom *atoms;
int number_of_atoms;
int supported;
int i;
supported = 0;
- atoms_ptr = malloc(sizeof(Atom *));
number_of_atoms = fghGetWindowProperty(window,
property,
XA_ATOM,
- (unsigned char **) atoms_ptr);
+ (unsigned char **) &atoms);
for (i = 0; i < number_of_atoms; i++)
- {
- if ((*atoms_ptr)[i] == hint)
+ {
+ if (atoms[i] == hint)
{
supported = 1;
break;
}
- }
+ }
+ XFree(atoms);
return supported;
}
/* What we need to do is to initialize the fgDisplay global structure here. */
fgDisplay.Instance = GetModuleHandle( NULL );
-
+ fgDisplay.DisplayName= displayName ? strdup(displayName) : 0 ;
atom = GetClassInfo( fgDisplay.Instance, _T("FREEGLUT"), &wc );
if( atom == 0 )
ReleaseDC( desktop, context );
}
-
+ /* If we have a DisplayName try to use it for metrics */
+ if( fgDisplay.DisplayName )
+ {
+ HDC context = CreateDC(fgDisplay.DisplayName,0,0,0);
+ if( context )
+ {
+ fgDisplay.ScreenWidth = GetDeviceCaps( context, HORZRES );
+ fgDisplay.ScreenHeight = GetDeviceCaps( context, VERTRES );
+ fgDisplay.ScreenWidthMM = GetDeviceCaps( context, HORZSIZE );
+ fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );
+ DeleteDC(context);
+ }
+ else
+ fgWarning("fghInitialize: "
+ "CreateDC failed, Screen size info may be incorrect\n"
+ "This is quite likely caused by a bad '-display' parameter");
+
+ }
/* Set the timer granularity to 1 ms */
timeBeginPeriod ( 1 );
fgState.Initialised = GL_TRUE;
+ /* Avoid registering atexit callback on Win32 as it results in an access
+ * violation due to calling into a module which has been unloaded.
+ * Any cleanup isn't needed on Windows anyway, the OS takes care of it.c
+ * see: http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx
+ */
+#if ( TARGET_HOST_MS_WINDOWS == 0 )
+ atexit(fgDeinitialize);
+#endif
+
/* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */
fgInitialiseInputDevices();
}
if( !fgState.Initialised )
{
- fgWarning( "fgDeinitialize(): "
- "no valid initialization has been performed" );
return;
}
+ /* If we're in game mode, we want to leave game mode */
+ if( fgStructure.GameModeWindow ) {
+ glutLeaveGameMode();
+ }
+
/* If there was a menu created, destroy the rendering context */
if( fgStructure.MenuContext )
{
fgState.JoysticksInitialised = GL_FALSE;
fgState.InputDevsInitialised = GL_FALSE;
+ fgState.MouseWheelTicks = 0;
+
+ fgState.MajorVersion = 1;
+ fgState.MinorVersion = 0;
+ fgState.ContextFlags = 0;
+ fgState.ContextProfile = 0;
+
fgState.Initialised = GL_FALSE;
fgState.Position.X = -1;
XCloseDisplay( fgDisplay.Display );
#elif TARGET_HOST_MS_WINDOWS
+ if( fgDisplay.DisplayName )
+ {
+ free( fgDisplay.DisplayName );
+ fgDisplay.DisplayName = NULL;
+ }
/* Reset the timer granularity */
timeEndPeriod ( 1 );
#ifndef _WIN32_WCE
{
const char *fps = getenv( "GLUT_FPS" );
+
if( fps )
{
int interval;
}
}
- displayName = getenv( "DISPLAY");
+ displayName = getenv( "DISPLAY" );
for( i = 1; i < argc; i++ )
{
}
}
+#if TARGET_HOST_MS_WINDOWS
+void (__cdecl *__glutExitFunc)( int return_value ) = NULL;
+
+void FGAPIENTRY __glutInitWithExit( int *pargc, char **argv, void (__cdecl *exit_function)(int) )
+{
+ __glutExitFunc = exit_function;
+ glutInit(pargc, argv);
+}
+#endif
+
/*
* Undoes all the "glutInit" stuff
*/
buffer[len] = '\0';
token = strtok ( buffer, " \t" );
+
while ( token )
{
/* Process this token */
fgState.DisplayMode = glut_state_flag;
}
+/* -- SETTING OPENGL 3.0 CONTEXT CREATION PARAMETERS ---------------------- */
+
+void FGAPIENTRY glutInitContextVersion( int majorVersion, int minorVersion )
+{
+ /* We will make use of these valuse when creating a new OpenGL context... */
+ fgState.MajorVersion = majorVersion;
+ fgState.MinorVersion = minorVersion;
+}
+
+
+void FGAPIENTRY glutInitContextFlags( int flags )
+{
+ /* We will make use of this value when creating a new OpenGL context... */
+ fgState.ContextFlags = flags;
+}
+
+void FGAPIENTRY glutInitContextProfile( int profile )
+{
+ /* We will make use of this value when creating a new OpenGL context... */
+ fgState.ContextProfile = profile;
+}
+
+/* -------------- User Defined Error/Warning Handler Support -------------- */
+
+/*
+ * Sets the user error handler (note the use of va_list for the args to the fmt)
+ */
+void FGAPIENTRY glutInitErrorFunc( void (* vfgError) ( const char *fmt, va_list ap ) )
+{
+ /* This allows user programs to handle freeglut errors */
+ fgState.ErrorFunc = vfgError;
+}
+
+/*
+ * Sets the user warning handler (note the use of va_list for the args to the fmt)
+ */
+void FGAPIENTRY glutInitWarningFunc( void (* vfgWarning) ( const char *fmt, va_list ap ) )
+{
+ /* This allows user programs to handle freeglut warnings */
+ fgState.WarningFunc = vfgWarning;
+}
+
/*** END OF FILE ***/