/*
- * freeglut_window.c
+ * fg_window.c
*
* Window management methods.
*
#define FREEGLUT_BUILDING_LIB
#include <GL/freeglut.h>
#include "fg_internal.h"
+#include "fg_gl2.h"
/*
* TODO BEFORE THE STABLE RELEASE:
GLboolean sizeUse, int w, int h,
GLboolean gameMode, GLboolean isSubWindow );
extern void fgPlatformCloseWindow( SFG_Window* window );
-extern void fgPlatformGlutShowWindow( void );
-extern void fgPlatformGlutHideWindow( void );
-extern void fgPlatformGlutIconifyWindow( void );
extern void fgPlatformGlutSetWindowTitle( const char* title );
extern void fgPlatformGlutSetIconTitle( const char* title );
-extern void fgPlatformGlutPositionWindow( int x, int y );
-extern void fgPlatformGlutPushWindow( void );
-extern void fgPlatformGlutPopWindow( void );
-extern void fgPlatformGlutFullScreen( SFG_Window *win );
-extern void fgPlatformGlutLeaveFullScreen( SFG_Window *win );
-extern void fgPlatformGlutFullScreenToggle( SFG_Window *win );
/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
*/
void fgSetWindow ( SFG_Window *window )
{
- fgPlatformSetWindow ( window );
+ fgPlatformSetWindow ( window );
fgStructure.CurrentWindow = window;
}
GLboolean sizeUse, int w, int h,
GLboolean gameMode, GLboolean isSubWindow )
{
- fgPlatformOpenWindow( window, title,
- positionUse, x, y,
- sizeUse, w, h,
- gameMode, isSubWindow );
+ fgPlatformOpenWindow( window, title,
+ positionUse, x, y,
+ sizeUse, w, h,
+ gameMode, isSubWindow );
fgSetWindow( window );
+#ifndef EGL_VERSION_1_0
window->Window.DoubleBuffered =
( fgState.DisplayMode & GLUT_DOUBLE ) ? 1 : 0;
-#ifndef EGL_VERSION_1_0 /* No glDrawBuffer/glReadBuffer in GLES */
if ( ! window->Window.DoubleBuffered )
{
glDrawBuffer ( GL_FRONT );
glReadBuffer ( GL_FRONT );
}
+#else
+ /* - EGL is always double-buffered */
+ /* - No glDrawBuffer/glReadBuffer in GLES */
+ window->Window.DoubleBuffered = 1;
#endif
+ window->Window.attribute_v_coord = -1;
+ window->Window.attribute_v_normal = -1;
+ window->Window.attribute_v_texture = -1;
+
+ fgInitGL2();
+
+ window->State.WorkMask |= GLUT_INIT_WORK;
}
/*
if (fgStructure.GameModeWindow != NULL && fgStructure.GameModeWindow->ID==window->ID)
glutLeaveGameMode();
- fgPlatformCloseWindow ( window );
+ fgPlatformCloseWindow ( window );
}
* XXX application has not already done so. The "freeglut" community
* XXX decided not to go this route (freeglut-developer e-mail from
* XXX Steve Baker, 12/16/04, 4:22 PM CST, "Re: [Freeglut-developer]
- * XXX Desired 'freeglut' behaviour when there is no current window"
+ * XXX Desired 'freeglut' behaviour when there is no current window")
*/
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateWindow" );
- return fgCreateWindow( NULL, title, fgState.Position.Use,
- fgState.Position.X, fgState.Position.Y,
+ return fgCreateWindow( NULL, title,
+ fgState.Position.Use, fgState.Position.X, fgState.Position.Y,
fgState.Size.Use, fgState.Size.X, fgState.Size.Y,
GL_FALSE, GL_FALSE )->ID;
}
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateSubWindow" );
parent = fgWindowByID( parentID );
freeglut_return_val_if_fail( parent != NULL, 0 );
- if ( x < 0 )
- {
- x = parent->State.Width + x ;
- if ( w >= 0 ) x -= w ;
- }
- if ( w < 0 ) w = parent->State.Width - x + w ;
- if ( w < 0 )
+ if ( fgState.AllowNegativeWindowPosition )
{
- x += w ;
- w = -w ;
- }
+ /* XXX This results in different widths/heights than if AllowNegativeWindowPosition
+ * XXX was false. The "freeglut" community defined this logic.
+ * XXX (freeglut-developer e-mail from Diederick C. Niehorster, 11/15/2015, 4:06 PM EST.
+ * XXX "Re: [Freeglut-developer] glutInitWindowPosition with negative coordinate(s)")
+ */
- if ( y < 0 )
- {
- y = parent->State.Height + y ;
- if ( h >= 0 ) y -= h ;
+ if ( w < 0 ) w = parent->State.Width + w ;
+ if ( h < 0 ) h = parent->State.Height + h ;
}
-
- if ( h < 0 ) h = parent->State.Height - y + h ;
- if ( h < 0 )
+ else
{
- y += h ;
- h = -h ;
+ if ( ( x < 0 ) )
+ {
+ x = parent->State.Width + x ;
+ if ( w > 0 ) x -= w ;
+ }
+
+ if ( w < 0 ) w = parent->State.Width - x + w ;
+ if ( w < 0 )
+ {
+ x += w ;
+ w = -w ;
+ }
+
+ if ( ( y < 0 ) )
+ {
+ y = parent->State.Height + y ;
+ if ( h > 0 ) y -= h ;
+ }
+
+ if ( h < 0 ) h = parent->State.Height - y + h ;
+ if ( h < 0 )
+ {
+ y += h ;
+ h = -h ;
+ }
}
- window = fgCreateWindow( parent, "", GL_TRUE, x, y, GL_TRUE, w, h, GL_FALSE, GL_FALSE );
+ window = fgCreateWindow( parent, "",
+ GL_TRUE, x, y,
+ GL_TRUE, w, h,
+ GL_FALSE, GL_FALSE );
ret = window->ID;
return ret;
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutShowWindow" );
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutShowWindow" );
- fgPlatformGlutShowWindow ();
+ fgStructure.CurrentWindow->State.WorkMask |= GLUT_VISIBILITY_WORK;
+ fgStructure.CurrentWindow->State.DesiredVisibility = DesireNormalState;
- fgStructure.CurrentWindow->State.Redisplay = GL_TRUE;
+ fgStructure.CurrentWindow->State.WorkMask |= GLUT_DISPLAY_WORK;
}
/*
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutHideWindow" );
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutHideWindow" );
- fgPlatformGlutHideWindow ();
+ fgStructure.CurrentWindow->State.WorkMask |= GLUT_VISIBILITY_WORK;
+ fgStructure.CurrentWindow->State.DesiredVisibility = DesireHiddenState;
- fgStructure.CurrentWindow->State.Redisplay = GL_FALSE;
+ fgStructure.CurrentWindow->State.WorkMask &= ~GLUT_DISPLAY_WORK;
}
/*
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIconifyWindow" );
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIconifyWindow" );
- fgStructure.CurrentWindow->State.Visible = GL_FALSE;
-
- fgPlatformGlutIconifyWindow ();
+ fgStructure.CurrentWindow->State.WorkMask |= GLUT_VISIBILITY_WORK;
+ fgStructure.CurrentWindow->State.DesiredVisibility = DesireIconicState;
- fgStructure.CurrentWindow->State.Redisplay = GL_FALSE;
+ fgStructure.CurrentWindow->State.WorkMask &= ~GLUT_DISPLAY_WORK;
}
/*
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowTitle" );
if( ! fgStructure.CurrentWindow->Parent )
{
- fgPlatformGlutSetWindowTitle ( title );
+ fgPlatformGlutSetWindowTitle ( title );
}
}
if( ! fgStructure.CurrentWindow->Parent )
{
- fgPlatformGlutSetIconTitle ( title );
+ fgPlatformGlutSetIconTitle ( title );
}
}
glutLeaveFullScreen();
}
- fgStructure.CurrentWindow->State.NeedToResize = GL_TRUE;
- fgStructure.CurrentWindow->State.Width = width ;
- fgStructure.CurrentWindow->State.Height = height;
+ fgStructure.CurrentWindow->State.WorkMask |= GLUT_SIZE_WORK;
+ fgStructure.CurrentWindow->State.DesiredWidth = width ;
+ fgStructure.CurrentWindow->State.DesiredHeight = height;
}
/*
glutLeaveFullScreen();
}
- fgPlatformGlutPositionWindow ( x, y );
+ fgStructure.CurrentWindow->State.WorkMask |= GLUT_POSITION_WORK;
+ fgStructure.CurrentWindow->State.DesiredXpos = x;
+ fgStructure.CurrentWindow->State.DesiredYpos = y;
}
/*
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPushWindow" );
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPushWindow" );
- fgPlatformGlutPushWindow ();
+ fgStructure.CurrentWindow->State.WorkMask |= GLUT_ZORDER_WORK;
+ fgStructure.CurrentWindow->State.DesiredZOrder = -1;
}
/*
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPopWindow" );
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPopWindow" );
- fgPlatformGlutPopWindow ();
+ fgStructure.CurrentWindow->State.WorkMask |= GLUT_ZORDER_WORK;
+ fgStructure.CurrentWindow->State.DesiredZOrder = 1;
}
/*
fgWarning("glutFullScreen called on a child window, ignoring...");
return;
}
- else if (fgStructure.GameModeWindow != NULL && fgStructure.GameModeWindow->ID==win->ID)
+ else if (fgStructure.GameModeWindow != NULL && fgStructure.GameModeWindow->ID==win->ID && win->State.IsFullscreen)
{
- /* Ignore fullscreen call on GameMode window, those are always fullscreen already */
+ /* Ignore fullscreen call on GameMode window, those are always fullscreen already
+ * only exception is when first entering GameMode
+ */
return;
}
- fgPlatformGlutFullScreen ( win );
+ if (!win->State.IsFullscreen)
+ win->State.WorkMask |= GLUT_FULL_SCREEN_WORK;
}
/*
*/
void FGAPIENTRY glutLeaveFullScreen( void )
{
- SFG_Window *win;
-
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreen" );
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreen" );
- win = fgStructure.CurrentWindow;
-
- fgPlatformGlutLeaveFullScreen ( win );
+ if (fgStructure.CurrentWindow->State.IsFullscreen)
+ fgStructure.CurrentWindow->State.WorkMask |= GLUT_FULL_SCREEN_WORK;
}
/*
*/
void FGAPIENTRY glutFullScreenToggle( void )
{
- SFG_Window *win;
-
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreenToggle" );
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreenToggle" );
- win = fgStructure.CurrentWindow;
-
- fgPlatformGlutFullScreenToggle ( win );
+ fgStructure.CurrentWindow->State.WorkMask |= GLUT_FULL_SCREEN_WORK;
}
/*