/*
- * freeglut_init.c
+ * fg_init.c
*
* Various freeglut initialization functions.
*
#define FREEGLUT_BUILDING_LIB
#include <GL/freeglut.h>
#include "fg_internal.h"
-#include "fg_gl2.h"
/*
* TODO BEFORE THE STABLE RELEASE:
{ NULL, NULL }, /* Timers */
{ NULL, NULL }, /* FreeTimers */
NULL, /* IdleCallback */
+ NULL, /* IdleCallbackData */
0, /* ActiveMenus */
NULL, /* MenuStateCallback */
NULL, /* MenuStatusCallback */
+ NULL, /* MenuStatusCallbackData */
+ FREEGLUT_MENU_FONT,
{ -1, -1, GL_TRUE }, /* GameModeSize */
-1, /* GameModeDepth */
-1, /* GameModeRefresh */
1, /* AuxiliaryBufferNumber */
4, /* SampleNumber */
GL_FALSE, /* SkipStaleMotion */
+ GL_FALSE, /* StrokeFontDrawJoinDots */
+ GL_FALSE, /* AllowNegativeWindowPosition */
1, /* OpenGL context MajorVersion */
0, /* OpenGL context MinorVersion */
0, /* OpenGL ContextFlags */
0, /* OpenGL ContextProfile */
0, /* HasOpenGL20 */
NULL, /* ErrorFunc */
- NULL /* WarningFunc */
+ NULL, /* ErrorFuncData */
+ NULL, /* WarningFunc */
+ NULL /* WarningFuncData */
};
int i, j, argc = *pargc;
{
- /* check if GLUT_FPS env var is set */
+ /* check if GLUT_FPS env var is set */
const char *fps = getenv( "GLUT_FPS" );
if( fps )
return;
}
- /* If we're in game mode, we want to leave game mode */
+ /* 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 )
{
- fgPlatformDestroyContext (fgDisplay.pDisplay, fgStructure.MenuContext->MContext );
+ fgPlatformDestroyContext (fgDisplay.pDisplay, fgStructure.MenuContext->MContext );
free( fgStructure.MenuContext );
fgStructure.MenuContext = NULL;
}
free( timer );
}
- fgPlatformDeinitialiseInputDevices ();
+ fgPlatformDeinitialiseInputDevices ();
- fgState.MouseWheelTicks = 0;
+ fgState.MouseWheelTicks = 0;
fgState.MajorVersion = 1;
fgState.MinorVersion = 0;
fgListInit( &fgState.Timers );
fgListInit( &fgState.FreeTimers );
- fgState.IdleCallback = NULL;
- fgState.MenuStateCallback = ( FGCBMenuState )NULL;
- fgState.MenuStatusCallback = ( FGCBMenuStatus )NULL;
+ fgState.IdleCallback = ( FGCBIdleUC )NULL;
+ fgState.IdleCallbackData = NULL;
+ fgState.MenuStateCallback = ( FGCBMenuState )NULL;
+ fgState.MenuStatusCallback = ( FGCBMenuStatusUC )NULL;
+ fgState.MenuStatusCallbackData = NULL;
fgState.SwapCount = 0;
fgState.SwapTime = 0;
fgState.ProgramName = NULL;
}
- fgPlatformCloseDisplay ();
+ fgPlatformCloseDisplay ();
fgState.Initialised = GL_FALSE;
}
/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
-#if defined(NEED_XPARSEGEOMETRY_IMPL)
+#if defined(NEED_XPARSEGEOMETRY_IMPL) || defined(TARGET_HOST_MS_WINDOWS)
# include "util/xparsegeometry_repl.h"
#endif
fgCreateStructure( );
- /* Get start time */
- fgState.Time = fgSystemTime();
-
- fghParseCommandLineArguments ( pargc, argv, &displayName, &geometry );
+ fghParseCommandLineArguments ( pargc, argv, &displayName, &geometry );
/*
* Have the display created now. If there wasn't a "-display"
* size.
*/
- if (geometry )
+ if ( geometry )
{
unsigned int parsedWidth, parsedHeight;
int mask = XParseGeometry( geometry,
if( (mask & (WidthValue|HeightValue)) == (WidthValue|HeightValue) )
fgState.Size.Use = GL_TRUE;
- if( mask & XNegative )
+ if( ( mask & XNegative ) && !fgState.AllowNegativeWindowPosition )
fgState.Position.X += fgDisplay.ScreenWidth - fgState.Size.X;
- if( mask & YNegative )
+ if( ( mask & YNegative ) && !fgState.AllowNegativeWindowPosition )
fgState.Position.Y += fgDisplay.ScreenHeight - fgState.Size.Y;
if( (mask & (XValue|YValue)) == (XValue|YValue) )
fgState.Position.Use = GL_TRUE;
}
-
- fgInitGL2();
}
/*
fgState.Position.X = x;
fgState.Position.Y = y;
- if( ( x >= 0 ) && ( y >= 0 ) )
+ if( ( ( x >= 0 ) && ( y >= 0 ) ) || fgState.AllowNegativeWindowPosition )
fgState.Position.Use = GL_TRUE;
else
fgState.Position.Use = GL_FALSE;
/*
* 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 ) )
+void FGAPIENTRY glutInitErrorFuncUcall( FGErrorUC callback, FGCBUserData userData )
{
/* This allows user programs to handle freeglut errors */
- fgState.ErrorFunc = vfgError;
+ fgState.ErrorFunc = callback;
+ fgState.ErrorFuncData = userData;
+}
+
+static void fghInitErrorFuncCallback( const char *fmt, va_list ap, FGCBUserData userData )
+{
+ FGError* callback = (FGError*)&userData;
+ (*callback)( fmt, ap );
+}
+
+void FGAPIENTRY glutInitErrorFunc( FGError callback )
+{
+ if (callback)
+ {
+ FGError* reference = &callback;
+ glutInitErrorFuncUcall( fghInitErrorFuncCallback, *((FGCBUserData*)reference) );
+ }
+ else
+ {
+ glutInitErrorFuncUcall( NULL, NULL );
+ }
}
/*
* 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 ) )
+void FGAPIENTRY glutInitWarningFuncUcall( FGWarningUC callback, FGCBUserData userData )
{
/* This allows user programs to handle freeglut warnings */
- fgState.WarningFunc = vfgWarning;
+ fgState.WarningFunc = callback;
+ fgState.WarningFuncData = userData;
+}
+
+static void fghInitWarningFuncCallback( const char *fmt, va_list ap, FGCBUserData userData )
+{
+ FGWarning* callback = (FGWarning*)&userData;
+ (*callback)( fmt, ap );
+}
+
+void FGAPIENTRY glutInitWarningFunc( FGWarning callback )
+{
+ if (callback)
+ {
+ FGWarning* reference = &callback;
+ glutInitWarningFuncUcall( fghInitWarningFuncCallback, *((FGCBUserData*)reference) );
+ }
+ else
+ {
+ glutInitWarningFuncUcall( NULL, NULL );
+ }
}
/*** END OF FILE ***/