John's window positioning corrections.

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@62 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
dheyse 2003-06-12 18:57:31 +00:00
parent ba2efda662
commit d9ea879e8c
2 changed files with 43 additions and 49 deletions

View File

@ -212,10 +212,12 @@ int FGAPIENTRY glutGet( GLenum eWhat )
*/ */
case GLUT_WINDOW_X: case GLUT_WINDOW_X:
case GLUT_WINDOW_Y: case GLUT_WINDOW_Y:
case GLUT_WINDOW_WIDTH:
case GLUT_WINDOW_HEIGHT:
case GLUT_WINDOW_BORDER_WIDTH :
case GLUT_WINDOW_HEADER_HEIGHT :
{ {
XWindowAttributes winAttributes; XWindowAttributes winAttributes;
Window another, window;
int x, y;
/* /*
* Return zero if there is no current window set * Return zero if there is no current window set
@ -223,53 +225,9 @@ int FGAPIENTRY glutGet( GLenum eWhat )
if( fgStructure.Window == NULL ) if( fgStructure.Window == NULL )
return( 0 ); return( 0 );
/*
* So, grab the current window's position
*/
window = fgStructure.Window->Window.Handle;
/* /*
* Grab the current window's attributes now * Grab the current window's attributes now
*/ */
XGetWindowAttributes(
fgDisplay.Display,
window,
&winAttributes
);
/*
* Correct the results for the parental relation and border size
*/
XTranslateCoordinates(
fgDisplay.Display,
window,
winAttributes.root,
-winAttributes.border_width,
-winAttributes.border_width,
&x, &y,
&another
);
/*
* See if we have to return the X or Y coordinate
*/
return( eWhat == GLUT_WINDOW_X ? x : y );
}
case GLUT_WINDOW_WIDTH:
case GLUT_WINDOW_HEIGHT:
{
XWindowAttributes winAttributes;
/*
* Return zero if there is no current window set
*/
if( fgStructure.Window == NULL )
return( 0 );
/*
* Checking for window's size is much easier:
*/
XGetWindowAttributes( XGetWindowAttributes(
fgDisplay.Display, fgDisplay.Display,
fgStructure.Window->Window.Handle, fgStructure.Window->Window.Handle,
@ -277,9 +235,17 @@ int FGAPIENTRY glutGet( GLenum eWhat )
); );
/* /*
* See if to return the window's width or height * See which window attribute to return
*/ */
return( eWhat == GLUT_WINDOW_WIDTH ? winAttributes.width : winAttributes.height ); switch ( eWhat )
{
case GLUT_WINDOW_X: return winAttributes.x ;
case GLUT_WINDOW_Y: return winAttributes.y ;
case GLUT_WINDOW_WIDTH: return winAttributes.width ;
case GLUT_WINDOW_HEIGHT: return winAttributes.height ;
case GLUT_WINDOW_BORDER_WIDTH : return winAttributes.border_width ;
case GLUT_WINDOW_HEADER_HEIGHT : return winAttributes.border_width * 3 ; /* a kludge for now */
}
} }
/* /*
@ -364,6 +330,24 @@ int FGAPIENTRY glutGet( GLenum eWhat )
case GLUT_WINDOW_WIDTH: case GLUT_WINDOW_WIDTH:
case GLUT_WINDOW_HEIGHT: case GLUT_WINDOW_HEIGHT:
{ {
/*
* There is considerable confusion about the "right thing to do" concerning window
* size and position. GLUT itself is not consistent between Windows and Linux; since
* platform independence is a virtue for "freeglut", we decided to break with GLUT's
* behaviour.
* Under Linux, it is apparently not possible to get the window border sizes in order
* to subtract them off the window's initial position until some time after the window
* has been created. Therefore we decided on the following behaviour, both under
* Windows and under Linux:
* - When you create a window with position (x,y) and size (w,h), the upper left hand
* corner of the outside of the window is at (x,y) and the size of the drawable area
* is (w,h).
* - When you query the size and position of the window--as is happening here for
* Windows--"freeglut" will return the size of the drawable area--the (w,h) that you
* specified when you created the window--and the coordinates of the upper left hand
* corner of the drawable area--which is NOT the (x,y) you specified.
*/
RECT winRect; RECT winRect;
/* /*
@ -373,6 +357,7 @@ int FGAPIENTRY glutGet( GLenum eWhat )
/* /*
* We need to call GetWindowRect() first... * We need to call GetWindowRect() first...
* (this returns the pixel coordinates of the outside of the window)
*/ */
GetWindowRect( fgStructure.Window->Window.Handle, &winRect ); GetWindowRect( fgStructure.Window->Window.Handle, &winRect );
@ -400,6 +385,12 @@ int FGAPIENTRY glutGet( GLenum eWhat )
} }
break; break;
case GLUT_WINDOW_BORDER_WIDTH :
return ( GetSystemMetrics( SM_CXSIZEFRAME ) ) ;
case GLUT_WINDOW_HEADER_HEIGHT :
return ( GetSystemMetrics( SM_CYCAPTION ) ) ;
case GLUT_DISPLAY_MODE_POSSIBLE: case GLUT_DISPLAY_MODE_POSSIBLE:
/* /*
* Check if the current display mode is possible * Check if the current display mode is possible

View File

@ -40,10 +40,13 @@
#define GLUT_ACTION_CONTINUE_EXECUTION 2 #define GLUT_ACTION_CONTINUE_EXECUTION 2
/* /*
* GLUT API macro definitions -- the glutGet parameters * GLUT API Extension macro definitions -- the glutGet parameters
*/ */
#define GLUT_ACTION_ON_WINDOW_CLOSE 0x01F9 #define GLUT_ACTION_ON_WINDOW_CLOSE 0x01F9
#define GLUT_WINDOW_BORDER_WIDTH 0x01FA
#define GLUT_WINDOW_HEADER_HEIGHT 0x01FB
/* /*
* Process loop function, see freeglut_main.c * Process loop function, see freeglut_main.c
*/ */