From ba0b3e4f7c57925fea4b418356a283a3d8135f2d Mon Sep 17 00:00:00 2001 From: Rcmaniac25 Date: Mon, 14 Dec 2015 16:22:25 +0000 Subject: [PATCH] Defined logic for glutCreateSubWindow when negative position is allowed Added check for if fgCreateWindow cannot allocate a window, it will produce an error. (cherry picked from commit 0ed05f64589fbcc67f225e1dc3ef6f5181fd319f) (cherry picked from commit 0ed05f64589fbcc67f225e1dc3ef6f5181fd319f) git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1776 7f0cb862-5218-0410-a997-914c9d46530a --- src/fg_structure.c | 5 ++++ src/fg_window.c | 64 +++++++++++++++++++++++++++++++++------------------- 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/src/fg_structure.c b/src/fg_structure.c index 6fbcc57..f0bc9a2 100644 --- a/src/fg_structure.c +++ b/src/fg_structure.c @@ -75,6 +75,11 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, /* Have the window object created */ SFG_Window *window = (SFG_Window *)calloc( 1, sizeof(SFG_Window) ); + if( !window ) + { + fgError( "Out of memory. Could not create window." ); + } + fgPlatformCreateWindow ( window ); fghClearCallBacks( window ); diff --git a/src/fg_window.c b/src/fg_window.c index 09fcddf..366bbf3 100644 --- a/src/fg_window.c +++ b/src/fg_window.c @@ -177,12 +177,12 @@ int FGAPIENTRY glutCreateWindow( const char* title ) * 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; } @@ -199,33 +199,51 @@ int FGAPIENTRY glutCreateSubWindow( int parentID, int x, int y, int w, int h ) 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; -- 1.7.10.4